Lines Matching refs:table

219 	rfs4_table_t *table;  in rfs4_database_shutdown()  local
222 for (table = db->db_tables; table; table = table->dbt_tnext) { in rfs4_database_shutdown()
223 mutex_enter(&table->dbt_reaper_cv_lock); in rfs4_database_shutdown()
224 table->dbt_reaper_shutdown = TRUE; in rfs4_database_shutdown()
225 cv_broadcast(&table->dbt_reaper_wait); in rfs4_database_shutdown()
227 mutex_exit(&table->dbt_reaper_cv_lock); in rfs4_database_shutdown()
307 rfs4_table_t *table; in rfs4_table_create() local
312 table = kmem_alloc(sizeof (rfs4_table_t), KM_SLEEP); in rfs4_table_create()
313 table->dbt_db = db; in rfs4_table_create()
314 rw_init(table->dbt_t_lock, NULL, RW_DEFAULT, NULL); in rfs4_table_create()
315 mutex_init(table->dbt_lock, NULL, MUTEX_DEFAULT, NULL); in rfs4_table_create()
316 mutex_init(&table->dbt_reaper_cv_lock, NULL, MUTEX_DEFAULT, NULL); in rfs4_table_create()
317 cv_init(&table->dbt_reaper_wait, NULL, CV_DEFAULT, NULL); in rfs4_table_create()
320 table->dbt_name = kmem_alloc(len+1, KM_SLEEP); in rfs4_table_create()
322 (void) strcpy(table->dbt_name, tabname); in rfs4_table_create()
323 (void) sprintf(cache_name, "%s_entry_cache", table->dbt_name); in rfs4_table_create()
324 table->dbt_max_cache_time = max_cache_time; in rfs4_table_create()
325 table->dbt_usize = size; in rfs4_table_create()
326 table->dbt_len = hashsize; in rfs4_table_create()
327 table->dbt_count = 0; in rfs4_table_create()
328 table->dbt_idxcnt = 0; in rfs4_table_create()
329 table->dbt_ccnt = 0; in rfs4_table_create()
330 table->dbt_maxcnt = idxcnt; in rfs4_table_create()
331 table->dbt_indices = NULL; in rfs4_table_create()
332 table->dbt_id_space = NULL; in rfs4_table_create()
333 table->dbt_reaper_shutdown = FALSE; in rfs4_table_create()
339 (void) sprintf(id_name, "%s_id_space", table->dbt_name); in rfs4_table_create()
340 table->dbt_id_space = id_space_create(id_name, start, in rfs4_table_create()
345 table->dbt_id_lwat = (maxentries * t_lowat) / 100; in rfs4_table_create()
347 table->dbt_id_hwat = (maxentries * t_hiwat) / 100; in rfs4_table_create()
348 table->dbt_id_reap = MIN(rfs4_reap_interval, max_cache_time); in rfs4_table_create()
349 table->dbt_maxentries = maxentries; in rfs4_table_create()
350 table->dbt_create = create; in rfs4_table_create()
351 table->dbt_destroy = destroy; in rfs4_table_create()
352 table->dbt_expiry = expiry; in rfs4_table_create()
357 table->dbt_mem_cache = get_db_mem_cache(cache_name); in rfs4_table_create()
361 table->dbt_debug = db->db_debug_flags; in rfs4_table_create()
364 table->dbt_tnext = db->db_tables; in rfs4_table_create()
365 db->db_tables = table; in rfs4_table_create()
368 rfs4_start_reaper(table); in rfs4_table_create()
370 return (table); in rfs4_table_create()
374 rfs4_table_destroy(rfs4_database_t *db, rfs4_table_t *table) in rfs4_table_destroy() argument
379 ASSERT(table->dbt_count == 0); in rfs4_table_destroy()
382 if (table == db->db_tables) in rfs4_table_destroy()
383 db->db_tables = table->dbt_tnext; in rfs4_table_destroy()
386 if (p->dbt_tnext == table) { in rfs4_table_destroy()
387 p->dbt_tnext = table->dbt_tnext; in rfs4_table_destroy()
388 table->dbt_tnext = NULL; in rfs4_table_destroy()
396 while (table->dbt_indices) { in rfs4_table_destroy()
397 idx = table->dbt_indices; in rfs4_table_destroy()
398 table->dbt_indices = idx->dbi_inext; in rfs4_table_destroy()
402 rw_destroy(table->dbt_t_lock); in rfs4_table_destroy()
403 mutex_destroy(table->dbt_lock); in rfs4_table_destroy()
404 mutex_destroy(&table->dbt_reaper_cv_lock); in rfs4_table_destroy()
405 cv_destroy(&table->dbt_reaper_wait); in rfs4_table_destroy()
407 kmem_free(table->dbt_name, strlen(table->dbt_name) + 1); in rfs4_table_destroy()
408 if (table->dbt_id_space) in rfs4_table_destroy()
409 id_space_destroy(table->dbt_id_space); in rfs4_table_destroy()
410 table->dbt_mem_cache = NULL; in rfs4_table_destroy()
411 kmem_free(table, sizeof (rfs4_table_t)); in rfs4_table_destroy()
415 rfs4_index_create(rfs4_table_t *table, char *keyname, in rfs4_index_create() argument
423 ASSERT(table->dbt_idxcnt < table->dbt_maxcnt); in rfs4_index_create()
427 idx->dbi_table = table; in rfs4_index_create()
433 idx->dbi_tblidx = table->dbt_idxcnt; in rfs4_index_create()
434 table->dbt_idxcnt++; in rfs4_index_create()
436 table->dbt_ccnt++; in rfs4_index_create()
437 if (table->dbt_ccnt > 1) in rfs4_index_create()
440 table->dbt_name); in rfs4_index_create()
446 idx->dbi_inext = table->dbt_indices; in rfs4_index_create()
447 table->dbt_indices = idx; in rfs4_index_create()
448 idx->dbi_buckets = kmem_zalloc(sizeof (rfs4_bucket_t) * table->dbt_len, in rfs4_index_create()
470 rfs4_table_t *table = entry->dbe_table; in rfs4_dbe_destroy() local
473 NFS4_DEBUG(table->dbt_debug & DESTROY_DEBUG, in rfs4_dbe_destroy()
475 (void*)entry, table->dbt_name)); in rfs4_dbe_destroy()
482 for (idx = table->dbt_indices; idx; idx = idx->dbi_inext) { in rfs4_dbe_destroy()
497 if (table->dbt_destroy) in rfs4_dbe_destroy()
498 (*table->dbt_destroy)(entry->dbe_data); in rfs4_dbe_destroy()
500 if (table->dbt_id_space) in rfs4_dbe_destroy()
501 id_free(table->dbt_id_space, entry->dbe_id); in rfs4_dbe_destroy()
503 mutex_enter(table->dbt_lock); in rfs4_dbe_destroy()
504 table->dbt_count--; in rfs4_dbe_destroy()
505 mutex_exit(table->dbt_lock); in rfs4_dbe_destroy()
508 kmem_cache_free(table->dbt_mem_cache, entry); in rfs4_dbe_destroy()
513 rfs4_dbe_create(rfs4_table_t *table, id_t id, rfs4_entry_t data) in rfs4_dbe_create() argument
518 NFS4_DEBUG(table->dbt_debug & CREATE_DEBUG, in rfs4_dbe_create()
519 (CE_NOTE, "Creating entry in table %s", table->dbt_name)); in rfs4_dbe_create()
521 entry = kmem_cache_alloc(table->dbt_mem_cache, KM_SLEEP); in rfs4_dbe_create()
529 if (table->dbt_id_space) in rfs4_dbe_create()
531 entry->dbe_table = table; in rfs4_dbe_create()
533 for (i = 0; i < table->dbt_maxcnt; i++) { in rfs4_dbe_create()
546 entry->dbe_data = (rfs4_entry_t)&entry->dbe_indices[table->dbt_maxcnt]; in rfs4_dbe_create()
547 bzero(entry->dbe_data, table->dbt_usize); in rfs4_dbe_create()
550 if (!(*table->dbt_create)(entry->dbe_data, data)) { in rfs4_dbe_create()
551 kmem_cache_free(table->dbt_mem_cache, entry); in rfs4_dbe_create()
555 mutex_enter(table->dbt_lock); in rfs4_dbe_create()
556 table->dbt_count++; in rfs4_dbe_create()
557 mutex_exit(table->dbt_lock); in rfs4_dbe_create()
563 rfs4_dbe_tabreap_adjust(rfs4_table_t *table) in rfs4_dbe_tabreap_adjust() argument
574 ASSERT(MUTEX_HELD(&table->dbt_reaper_cv_lock)); in rfs4_dbe_tabreap_adjust()
575 tabreap = MIN(rfs4_reap_interval, table->dbt_max_cache_time); in rfs4_dbe_tabreap_adjust()
577 in_use = table->dbt_count + 1; /* see rfs4_dbe_create */ in rfs4_dbe_tabreap_adjust()
578 if (in_use >= table->dbt_id_hwat) { in rfs4_dbe_tabreap_adjust()
581 } else if (in_use >= table->dbt_id_lwat) { in rfs4_dbe_tabreap_adjust()
587 table->dbt_id_reap = reap_int; in rfs4_dbe_tabreap_adjust()
589 table->dbt_name, time_t, table->dbt_id_reap); in rfs4_dbe_tabreap_adjust()
598 rfs4_table_t *table = idx->dbi_table; in rfs4_dbsearch() local
608 NFS4_DEBUG(table->dbt_debug & SEARCH_DEBUG, in rfs4_dbsearch()
610 key, table->dbt_name, idx->dbi_keyname)); in rfs4_dbsearch()
634 NFS4_DEBUG((table->dbt_debug & SEARCH_DEBUG), in rfs4_dbsearch()
636 (void *)l->entry, key, table->dbt_name)); in rfs4_dbsearch()
639 id_free(table->dbt_id_space, id); in rfs4_dbsearch()
644 if (!*create || table->dbt_create == NULL || !idx->dbi_createable || in rfs4_dbsearch()
645 table->dbt_maxentries == table->dbt_count) { in rfs4_dbsearch()
646 NFS4_DEBUG(table->dbt_debug & SEARCH_DEBUG, in rfs4_dbsearch()
648 key, table->dbt_name)); in rfs4_dbsearch()
652 id_free(table->dbt_id_space, id); in rfs4_dbsearch()
656 if (table->dbt_id_space && id == -1) { in rfs4_dbsearch()
660 id = id_alloc(table->dbt_id_space); in rfs4_dbsearch()
663 mutex_enter(&table->dbt_reaper_cv_lock); in rfs4_dbsearch()
664 rfs4_dbe_tabreap_adjust(table); in rfs4_dbsearch()
665 mutex_exit(&table->dbt_reaper_cv_lock); in rfs4_dbsearch()
673 NFS4_DEBUG(table->dbt_debug & OTHER_DEBUG, in rfs4_dbsearch()
676 i, (void*)bp, table->dbt_name, idx->dbi_keyname)); in rfs4_dbsearch()
684 entry = rfs4_dbe_create(table, id, arg); in rfs4_dbsearch()
688 id_free(table->dbt_id_space, id); in rfs4_dbsearch()
690 NFS4_DEBUG(table->dbt_debug & CREATE_DEBUG, in rfs4_dbsearch()
692 table->dbt_name)); in rfs4_dbsearch()
707 for (ip = table->dbt_indices; ip; ip = ip->dbi_inext) { in rfs4_dbsearch()
718 table->dbt_debug & SEARCH_DEBUG || table->dbt_debug & CREATE_DEBUG, in rfs4_dbsearch()
720 (void*)entry, idx->dbi_keyname, (void*)key, table->dbt_name)); in rfs4_dbsearch()
735 rfs4_table_t *table = nsrv4->rfs4_client_tab; in rfs4_cpr_callb() local
742 if (code == CB_CODE_CPR_CHKPT || table == NULL) { in rfs4_cpr_callb()
746 buckets = table->dbt_indices->dbi_buckets; in rfs4_cpr_callb()
756 for (i = 0; i < table->dbt_len; i++) { in rfs4_cpr_callb()
776 rfs4_dbe_walk(rfs4_table_t *table, in rfs4_dbe_walk() argument
780 rfs4_bucket_t *buckets = table->dbt_indices->dbi_buckets, *bp; in rfs4_dbe_walk()
785 NFS4_DEBUG(table->dbt_debug & WALK_DEBUG, in rfs4_dbe_walk()
786 (CE_NOTE, "Walking entries in %s", table->dbt_name)); in rfs4_dbe_walk()
789 for (i = 0; i < table->dbt_len; i++) { in rfs4_dbe_walk()
801 NFS4_DEBUG(table->dbt_debug & WALK_DEBUG, in rfs4_dbe_walk()
802 (CE_NOTE, "Walking entries complete %s", table->dbt_name)); in rfs4_dbe_walk()
807 rfs4_dbe_reap(rfs4_table_t *table, time_t cache_time, uint32_t desired) in rfs4_dbe_reap() argument
809 rfs4_index_t *idx = table->dbt_indices; in rfs4_dbe_reap()
817 NFS4_DEBUG(table->dbt_debug & REAP_DEBUG, in rfs4_dbe_reap()
819 desired, cache_time, table->dbt_name)); in rfs4_dbe_reap()
822 for (i = 0; i < table->dbt_len; i++) { in rfs4_dbe_reap()
838 (table->dbt_reaper_shutdown || in rfs4_dbe_reap()
839 table->dbt_expiry == NULL || in rfs4_dbe_reap()
840 (*table->dbt_expiry)(entry->dbe_data))) { in rfs4_dbe_reap()
877 if (table->dbt_reaper_shutdown && bp->dbk_head != NULL) in rfs4_dbe_reap()
883 } while (table->dbt_reaper_shutdown && bp->dbk_head != NULL); in rfs4_dbe_reap()
885 if (!table->dbt_reaper_shutdown && desired && count >= desired) in rfs4_dbe_reap()
889 NFS4_DEBUG(table->dbt_debug & REAP_DEBUG, in rfs4_dbe_reap()
891 count, cache_time, table->dbt_name)); in rfs4_dbe_reap()
897 rfs4_table_t *table = (rfs4_table_t *)arg; in reaper_thread() local
900 NFS4_DEBUG(table->dbt_debug, in reaper_thread()
901 (CE_NOTE, "rfs4_reaper_thread starting for %s", table->dbt_name)); in reaper_thread()
903 CALLB_CPR_INIT(&table->dbt_reaper_cpr_info, &table->dbt_reaper_cv_lock, in reaper_thread()
906 mutex_enter(&table->dbt_reaper_cv_lock); in reaper_thread()
908 CALLB_CPR_SAFE_BEGIN(&table->dbt_reaper_cpr_info); in reaper_thread()
909 rc = cv_reltimedwait_sig(&table->dbt_reaper_wait, in reaper_thread()
910 &table->dbt_reaper_cv_lock, in reaper_thread()
911 SEC_TO_TICK(table->dbt_id_reap), TR_CLOCK_TICK); in reaper_thread()
912 CALLB_CPR_SAFE_END(&table->dbt_reaper_cpr_info, in reaper_thread()
913 &table->dbt_reaper_cv_lock); in reaper_thread()
914 rfs4_dbe_reap(table, table->dbt_max_cache_time, 0); in reaper_thread()
915 } while (rc != 0 && table->dbt_reaper_shutdown == FALSE); in reaper_thread()
917 CALLB_CPR_EXIT(&table->dbt_reaper_cpr_info); in reaper_thread()
919 NFS4_DEBUG(table->dbt_debug, in reaper_thread()
920 (CE_NOTE, "rfs4_reaper_thread exiting for %s", table->dbt_name)); in reaper_thread()
923 mutex_enter(table->dbt_db->db_lock); in reaper_thread()
924 table->dbt_db->db_shutdown_count--; in reaper_thread()
925 cv_signal(&table->dbt_db->db_shutdown_wait); in reaper_thread()
926 mutex_exit(table->dbt_db->db_lock); in reaper_thread()
931 rfs4_start_reaper(rfs4_table_t *table) in rfs4_start_reaper() argument
933 if (table->dbt_max_cache_time == 0) in rfs4_start_reaper()
936 (void) zthread_create(NULL, 0, reaper_thread, table, 0, in rfs4_start_reaper()