Lines Matching refs:vhc
7488 mdi_vhci_config_t *vhc; in setup_vhci_cache() local
7493 vhc = kmem_zalloc(sizeof (mdi_vhci_config_t), KM_SLEEP); in setup_vhci_cache()
7494 vh->vh_config = vhc; in setup_vhci_cache()
7495 vhcache = &vhc->vhc_vhcache; in setup_vhci_cache()
7497 vhc->vhc_vhcache_filename = vhclass2vhcache_filename(vh->vh_class); in setup_vhci_cache()
7499 mutex_init(&vhc->vhc_lock, NULL, MUTEX_DEFAULT, NULL); in setup_vhci_cache()
7500 cv_init(&vhc->vhc_cv, NULL, CV_DRIVER, NULL); in setup_vhci_cache()
7539 vhc->vhc_vhcache_filename); in setup_vhci_cache()
7545 vhc->vhc_cbid = callb_add(stop_vhcache_flush_thread, vhc, in setup_vhci_cache()
7548 vhc->vhc_path_discovery_boot = mdi_path_discovery_boot; in setup_vhci_cache()
7549 vhc->vhc_path_discovery_postboot = mdi_path_discovery_postboot; in setup_vhci_cache()
7558 mdi_vhci_config_t *vhc = vh->vh_config; in destroy_vhci_cache() local
7559 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in destroy_vhci_cache()
7564 if (stop_vhcache_async_threads(vhc) != MDI_SUCCESS) in destroy_vhci_cache()
7567 kmem_free(vhc->vhc_vhcache_filename, in destroy_vhci_cache()
7568 strlen(vhc->vhc_vhcache_filename) + 1); in destroy_vhci_cache()
7589 mutex_destroy(&vhc->vhc_lock); in destroy_vhci_cache()
7590 cv_destroy(&vhc->vhc_cv); in destroy_vhci_cache()
7591 kmem_free(vhc, sizeof (mdi_vhci_config_t)); in destroy_vhci_cache()
7599 stop_vhcache_async_threads(mdi_vhci_config_t *vhc) in stop_vhcache_async_threads() argument
7603 mutex_enter(&vhc->vhc_lock); in stop_vhcache_async_threads()
7604 vhc->vhc_flags |= MDI_VHC_EXIT; in stop_vhcache_async_threads()
7605 ASSERT(vhc->vhc_acc_thrcount >= 0); in stop_vhcache_async_threads()
7606 cv_broadcast(&vhc->vhc_cv); in stop_vhcache_async_threads()
7608 while ((vhc->vhc_flags & MDI_VHC_VHCACHE_FLUSH_THREAD) || in stop_vhcache_async_threads()
7609 vhc->vhc_acc_thrcount != 0) { in stop_vhcache_async_threads()
7610 mutex_exit(&vhc->vhc_lock); in stop_vhcache_async_threads()
7612 mutex_enter(&vhc->vhc_lock); in stop_vhcache_async_threads()
7615 vhc->vhc_flags &= ~MDI_VHC_EXIT; in stop_vhcache_async_threads()
7617 for (acc = vhc->vhc_acc_list_head; acc != NULL; acc = acc_next) { in stop_vhcache_async_threads()
7621 vhc->vhc_acc_list_head = NULL; in stop_vhcache_async_threads()
7622 vhc->vhc_acc_list_tail = NULL; in stop_vhcache_async_threads()
7623 vhc->vhc_acc_count = 0; in stop_vhcache_async_threads()
7625 if (vhc->vhc_flags & MDI_VHC_VHCACHE_DIRTY) { in stop_vhcache_async_threads()
7626 vhc->vhc_flags &= ~MDI_VHC_VHCACHE_DIRTY; in stop_vhcache_async_threads()
7627 mutex_exit(&vhc->vhc_lock); in stop_vhcache_async_threads()
7628 if (flush_vhcache(vhc, 0) != MDI_SUCCESS) { in stop_vhcache_async_threads()
7629 vhcache_dirty(vhc); in stop_vhcache_async_threads()
7633 mutex_exit(&vhc->vhc_lock); in stop_vhcache_async_threads()
7635 if (callb_delete(vhc->vhc_cbid) != 0) in stop_vhcache_async_threads()
7648 mdi_vhci_config_t *vhc = (mdi_vhci_config_t *)arg; in stop_vhcache_flush_thread() local
7650 mutex_enter(&vhc->vhc_lock); in stop_vhcache_flush_thread()
7651 vhc->vhc_flags |= MDI_VHC_EXIT; in stop_vhcache_flush_thread()
7652 cv_broadcast(&vhc->vhc_cv); in stop_vhcache_flush_thread()
7654 while (vhc->vhc_flags & MDI_VHC_VHCACHE_FLUSH_THREAD) { in stop_vhcache_flush_thread()
7655 mutex_exit(&vhc->vhc_lock); in stop_vhcache_flush_thread()
7657 mutex_enter(&vhc->vhc_lock); in stop_vhcache_flush_thread()
7660 if (vhc->vhc_flags & MDI_VHC_VHCACHE_DIRTY) { in stop_vhcache_flush_thread()
7661 vhc->vhc_flags &= ~MDI_VHC_VHCACHE_DIRTY; in stop_vhcache_flush_thread()
7662 mutex_exit(&vhc->vhc_lock); in stop_vhcache_flush_thread()
7663 (void) flush_vhcache(vhc, 1); in stop_vhcache_flush_thread()
7665 mutex_exit(&vhc->vhc_lock); in stop_vhcache_flush_thread()
8090 vhcache_phci_add(mdi_vhci_config_t *vhc, mdi_phci_t *ph) in vhcache_phci_add() argument
8092 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in vhcache_phci_add()
8120 mutex_enter(&vhc->vhc_lock); in vhcache_phci_add()
8121 vhc->vhc_path_discovery_cutoff_time = 0; in vhcache_phci_add()
8122 mutex_exit(&vhc->vhc_lock); in vhcache_phci_add()
8126 vhcache_dirty(vhc); in vhcache_phci_add()
8133 vhcache_phci_remove(mdi_vhci_config_t *vhc, mdi_phci_t *ph) in vhcache_phci_remove() argument
8135 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in vhcache_phci_remove()
8206 vhcache_pi_add(mdi_vhci_config_t *vhc, struct mdi_pathinfo *pip) in vhcache_pi_add() argument
8208 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in vhcache_pi_add()
8256 vhcache_dirty(vhc); in vhcache_pi_add()
8263 vhcache_pi_remove(mdi_vhci_config_t *vhc, struct mdi_pathinfo *pip) in vhcache_pi_remove() argument
8265 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in vhcache_pi_remove()
8289 flush_vhcache(mdi_vhci_config_t *vhc, int force_flag) in flush_vhcache() argument
8304 if ((nvl = vhcache_to_mainnvl(&vhc->vhc_vhcache)) != NULL) { in flush_vhcache()
8305 err = fwrite_nvlist(vhc->vhc_vhcache_filename, nvl); in flush_vhcache()
8311 mutex_enter(&vhc->vhc_lock); in flush_vhcache()
8314 vhc->vhc_flags |= MDI_VHC_READONLY_FS; in flush_vhcache()
8315 vhc->vhc_flags &= ~(MDI_VHC_VHCACHE_FLUSH_ERROR | in flush_vhcache()
8318 if (!(vhc->vhc_flags & MDI_VHC_VHCACHE_FLUSH_ERROR)) { in flush_vhcache()
8320 vhc->vhc_vhcache_filename); in flush_vhcache()
8321 vhc->vhc_flags |= MDI_VHC_VHCACHE_FLUSH_ERROR; in flush_vhcache()
8325 } else if (vhc->vhc_flags & MDI_VHC_VHCACHE_FLUSH_ERROR) { in flush_vhcache()
8327 "%s: update now ok\n", vhc->vhc_vhcache_filename); in flush_vhcache()
8328 vhc->vhc_flags &= ~MDI_VHC_VHCACHE_FLUSH_ERROR; in flush_vhcache()
8330 mutex_exit(&vhc->vhc_lock); in flush_vhcache()
8342 mdi_vhci_config_t *vhc = (mdi_vhci_config_t *)arg; in vhcache_flush_thread() local
8349 CALLB_CPR_INIT(&cprinfo, &vhc->vhc_lock, callb_generic_cpr, in vhcache_flush_thread()
8351 mutex_enter(&vhc->vhc_lock); in vhcache_flush_thread()
8353 while (!(vhc->vhc_flags & MDI_VHC_EXIT) && in vhcache_flush_thread()
8354 (vhc->vhc_flags & MDI_VHC_VHCACHE_DIRTY)) { in vhcache_flush_thread()
8355 if (ddi_get_lbolt() < vhc->vhc_flush_at_ticks) { in vhcache_flush_thread()
8357 (void) cv_timedwait(&vhc->vhc_cv, in vhcache_flush_thread()
8358 &vhc->vhc_lock, vhc->vhc_flush_at_ticks); in vhcache_flush_thread()
8359 CALLB_CPR_SAFE_END(&cprinfo, &vhc->vhc_lock); in vhcache_flush_thread()
8361 vhc->vhc_flags &= ~MDI_VHC_VHCACHE_DIRTY; in vhcache_flush_thread()
8362 mutex_exit(&vhc->vhc_lock); in vhcache_flush_thread()
8364 if (flush_vhcache(vhc, 0) != MDI_SUCCESS) in vhcache_flush_thread()
8365 vhcache_dirty(vhc); in vhcache_flush_thread()
8367 mutex_enter(&vhc->vhc_lock); in vhcache_flush_thread()
8373 while (!(vhc->vhc_flags & MDI_VHC_EXIT) && in vhcache_flush_thread()
8374 !(vhc->vhc_flags & MDI_VHC_VHCACHE_DIRTY) && in vhcache_flush_thread()
8377 (void) cv_timedwait(&vhc->vhc_cv, &vhc->vhc_lock, in vhcache_flush_thread()
8379 CALLB_CPR_SAFE_END(&cprinfo, &vhc->vhc_lock); in vhcache_flush_thread()
8382 if ((vhc->vhc_flags & MDI_VHC_EXIT) || in vhcache_flush_thread()
8383 !(vhc->vhc_flags & MDI_VHC_VHCACHE_DIRTY)) in vhcache_flush_thread()
8388 vhc->vhc_flags &= ~MDI_VHC_VHCACHE_FLUSH_THREAD; in vhcache_flush_thread()
8397 vhcache_dirty(mdi_vhci_config_t *vhc) in vhcache_dirty() argument
8399 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in vhcache_dirty()
8410 mutex_enter(&vhc->vhc_lock); in vhcache_dirty()
8411 if (vhc->vhc_flags & MDI_VHC_READONLY_FS) { in vhcache_dirty()
8412 mutex_exit(&vhc->vhc_lock); in vhcache_dirty()
8416 vhc->vhc_flags |= MDI_VHC_VHCACHE_DIRTY; in vhcache_dirty()
8417 vhc->vhc_flush_at_ticks = ddi_get_lbolt() + in vhcache_dirty()
8419 if (vhc->vhc_flags & MDI_VHC_VHCACHE_FLUSH_THREAD) { in vhcache_dirty()
8420 cv_broadcast(&vhc->vhc_cv); in vhcache_dirty()
8423 vhc->vhc_flags |= MDI_VHC_VHCACHE_FLUSH_THREAD; in vhcache_dirty()
8426 mutex_exit(&vhc->vhc_lock); in vhcache_dirty()
8429 (void) thread_create(NULL, 0, vhcache_flush_thread, vhc, in vhcache_dirty()
8559 st_bus_config_all_phcis(mdi_vhci_config_t *vhc, uint_t flags, in st_bus_config_all_phcis() argument
8562 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in st_bus_config_all_phcis()
8564 single_threaded_vhconfig_enter(vhc); in st_bus_config_all_phcis()
8566 single_threaded_vhconfig_exit(vhc); in st_bus_config_all_phcis()
8728 adjust_sort_vhcache_paths(mdi_vhci_config_t *vhc, char *ct_name, char *ct_addr, in adjust_sort_vhcache_paths() argument
8731 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in adjust_sort_vhcache_paths()
8778 vhcache_dirty(vhc); in adjust_sort_vhcache_paths()
8785 config_client_paths_sync(mdi_vhci_config_t *vhc, char *ct_name, char *ct_addr, in config_client_paths_sync() argument
8792 adjust_sort_vhcache_paths(vhc, ct_name, ct_addr, tok); in config_client_paths_sync()
8802 mdi_vhci_config_t *vhc = (mdi_vhci_config_t *)arg; in config_client_paths_thread() local
8808 CALLB_CPR_INIT(&cprinfo, &vhc->vhc_lock, callb_generic_cpr, in config_client_paths_thread()
8814 mutex_enter(&vhc->vhc_lock); in config_client_paths_thread()
8815 while (!(vhc->vhc_flags & MDI_VHC_EXIT) && in config_client_paths_thread()
8816 vhc->vhc_acc_list_head == NULL && in config_client_paths_thread()
8819 (void) cv_timedwait(&vhc->vhc_cv, &vhc->vhc_lock, in config_client_paths_thread()
8821 CALLB_CPR_SAFE_END(&cprinfo, &vhc->vhc_lock); in config_client_paths_thread()
8824 if ((vhc->vhc_flags & MDI_VHC_EXIT) || in config_client_paths_thread()
8825 vhc->vhc_acc_list_head == NULL) in config_client_paths_thread()
8828 acc = vhc->vhc_acc_list_head; in config_client_paths_thread()
8829 vhc->vhc_acc_list_head = acc->acc_next; in config_client_paths_thread()
8830 if (vhc->vhc_acc_list_head == NULL) in config_client_paths_thread()
8831 vhc->vhc_acc_list_tail = NULL; in config_client_paths_thread()
8832 vhc->vhc_acc_count--; in config_client_paths_thread()
8833 mutex_exit(&vhc->vhc_lock); in config_client_paths_thread()
8835 config_client_paths_sync(vhc, acc->acc_ct_name, in config_client_paths_thread()
8843 vhc->vhc_acc_thrcount--; in config_client_paths_thread()
8853 config_client_paths_async(mdi_vhci_config_t *vhc, char *ct_name, char *ct_addr, in config_client_paths_async() argument
8863 config_client_paths_sync(vhc, ct_name, ct_addr, pp_head, tok); in config_client_paths_async()
8871 mutex_enter(&vhc->vhc_lock); in config_client_paths_async()
8872 for (acc = vhc->vhc_acc_list_head; acc != NULL; acc = acc->acc_next) { in config_client_paths_async()
8876 mutex_exit(&vhc->vhc_lock); in config_client_paths_async()
8881 if (vhc->vhc_acc_list_head == NULL) in config_client_paths_async()
8882 vhc->vhc_acc_list_head = newacc; in config_client_paths_async()
8884 vhc->vhc_acc_list_tail->acc_next = newacc; in config_client_paths_async()
8885 vhc->vhc_acc_list_tail = newacc; in config_client_paths_async()
8886 vhc->vhc_acc_count++; in config_client_paths_async()
8887 if (vhc->vhc_acc_count <= vhc->vhc_acc_thrcount) { in config_client_paths_async()
8888 cv_broadcast(&vhc->vhc_cv); in config_client_paths_async()
8891 vhc->vhc_acc_thrcount++; in config_client_paths_async()
8894 mutex_exit(&vhc->vhc_lock); in config_client_paths_async()
8897 (void) thread_create(NULL, 0, config_client_paths_thread, vhc, in config_client_paths_async()
8930 config_client_paths(mdi_vhci_config_t *vhc, char *ct_name, char *ct_addr) in config_client_paths() argument
8932 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in config_client_paths()
8952 config_client_paths_async(vhc, ct_name, ct_addr, pp_head, &tok); in config_client_paths()
8971 config_client_paths_async(vhc, ct_name, ct_addr, in config_client_paths()
8981 adjust_sort_vhcache_paths(vhc, ct_name, ct_addr, &tok); in config_client_paths()
8987 single_threaded_vhconfig_enter(mdi_vhci_config_t *vhc) in single_threaded_vhconfig_enter() argument
8989 mutex_enter(&vhc->vhc_lock); in single_threaded_vhconfig_enter()
8990 while (vhc->vhc_flags & MDI_VHC_SINGLE_THREADED) in single_threaded_vhconfig_enter()
8991 cv_wait(&vhc->vhc_cv, &vhc->vhc_lock); in single_threaded_vhconfig_enter()
8992 vhc->vhc_flags |= MDI_VHC_SINGLE_THREADED; in single_threaded_vhconfig_enter()
8993 mutex_exit(&vhc->vhc_lock); in single_threaded_vhconfig_enter()
8997 single_threaded_vhconfig_exit(mdi_vhci_config_t *vhc) in single_threaded_vhconfig_exit() argument
8999 mutex_enter(&vhc->vhc_lock); in single_threaded_vhconfig_exit()
9000 vhc->vhc_flags &= ~MDI_VHC_SINGLE_THREADED; in single_threaded_vhconfig_exit()
9001 cv_broadcast(&vhc->vhc_cv); in single_threaded_vhconfig_exit()
9002 mutex_exit(&vhc->vhc_lock); in single_threaded_vhconfig_exit()
9180 mdi_vhci_config_t *vhc = vh->vh_config; in build_vhci_cache() local
9181 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in build_vhci_cache()
9183 single_threaded_vhconfig_enter(vhc); in build_vhci_cache()
9188 single_threaded_vhconfig_exit(vhc); in build_vhci_cache()
9201 single_threaded_vhconfig_exit(vhc); in build_vhci_cache()
9202 vhcache_dirty(vhc); in build_vhci_cache()
9210 vhcache_do_discovery(mdi_vhci_config_t *vhc) in vhcache_do_discovery() argument
9214 mutex_enter(&vhc->vhc_lock); in vhcache_do_discovery()
9216 if (vhc->vhc_path_discovery_boot > 0) { in vhcache_do_discovery()
9217 vhc->vhc_path_discovery_boot--; in vhcache_do_discovery()
9221 if (vhc->vhc_path_discovery_postboot > 0) { in vhcache_do_discovery()
9222 vhc->vhc_path_discovery_postboot--; in vhcache_do_discovery()
9233 ddi_get_lbolt64() >= vhc->vhc_path_discovery_cutoff_time) in vhcache_do_discovery()
9238 mutex_exit(&vhc->vhc_lock); in vhcache_do_discovery()
9251 mdi_vhci_config_t *vhc = vh->vh_config; in vhcache_discover_paths() local
9252 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in vhcache_discover_paths()
9255 single_threaded_vhconfig_enter(vhc); in vhcache_discover_paths()
9257 if (vhcache_do_discovery(vhc)) { in vhcache_discover_paths()
9262 mutex_enter(&vhc->vhc_lock); in vhcache_discover_paths()
9263 vhc->vhc_path_discovery_cutoff_time = ddi_get_lbolt64() + in vhcache_discover_paths()
9265 mutex_exit(&vhc->vhc_lock); in vhcache_discover_paths()
9269 single_threaded_vhconfig_exit(vhc); in vhcache_discover_paths()
9303 mdi_vhci_config_t *vhc = vh->vh_config; in mdi_vhci_bus_config() local
9304 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in mdi_vhci_bus_config()
9341 config_client_paths(vhc, (char *)arg, ct_addr); in mdi_vhci_bus_config()
9354 st_bus_config_all_phcis(vhc, flags, op, in mdi_vhci_bus_config()
9361 st_bus_config_all_phcis(vhc, flags, op, -1); in mdi_vhci_bus_config()
9431 clean_vhcache(mdi_vhci_config_t *vhc) in clean_vhcache() argument
9433 mdi_vhci_cache_t *vhcache = &vhc->vhc_vhcache; in clean_vhcache()
9480 vhcache_dirty(vhc); in clean_vhcache()