Lines Matching refs:mapp
68 #define DAM_INCR_STAT(mapp, stat) \ argument
69 if ((mapp)->dam_kstatsp) { \
70 struct dam_kstats *stp = (mapp)->dam_kstatsp->ks_data; \
74 #define DAM_SET_STAT(mapp, stat, val) \ argument
75 if ((mapp)->dam_kstatsp) { \
76 struct dam_kstats *stp = (mapp)->dam_kstatsp->ks_data; \
128 dam_t *mapp; in damap_create() local
133 mapp = kmem_zalloc(sizeof (*mapp), KM_SLEEP); in damap_create()
134 mapp->dam_options = map_opts; in damap_create()
135 mapp->dam_stable_ticks = drv_usectohz(stable_usec); in damap_create()
136 mapp->dam_size = 0; in damap_create()
137 mapp->dam_rptmode = mode; in damap_create()
138 mapp->dam_activate_arg = activate_arg; in damap_create()
139 mapp->dam_activate_cb = (activate_cb_t)activate_cb; in damap_create()
140 mapp->dam_deactivate_cb = (deactivate_cb_t)deactivate_cb; in damap_create()
141 mapp->dam_config_arg = config_arg; in damap_create()
142 mapp->dam_configure_cb = (configure_cb_t)configure_cb; in damap_create()
143 mapp->dam_unconfig_cb = (unconfig_cb_t)unconfig_cb; in damap_create()
144 mapp->dam_name = i_ddi_strdup(name, KM_SLEEP); in damap_create()
145 mutex_init(&mapp->dam_lock, NULL, MUTEX_DRIVER, NULL); in damap_create()
146 cv_init(&mapp->dam_sync_cv, NULL, CV_DRIVER, NULL); in damap_create()
147 bitset_init(&mapp->dam_active_set); in damap_create()
148 bitset_init(&mapp->dam_stable_set); in damap_create()
149 bitset_init(&mapp->dam_report_set); in damap_create()
150 *damapp = (damap_t *)mapp; in damap_create()
153 char *, mapp->dam_name, damap_t *, mapp, in damap_create()
167 dam_map_alloc(dam_t *mapp) in dam_map_alloc() argument
171 ASSERT(mutex_owned(&mapp->dam_lock)); in dam_map_alloc()
172 if (mapp->dam_flags & DAM_DESTROYPEND) in dam_map_alloc()
178 if (mapp->dam_high) in dam_map_alloc()
181 mapp->dam_size = DAM_SIZE_BUMP; in dam_map_alloc()
183 mapp->dam_size) != DDI_SUCCESS) in dam_map_alloc()
186 if (ddi_strid_init(&mapp->dam_addr_hash, mapp->dam_size) != in dam_map_alloc()
191 if (dam_kstat_create(mapp) != DDI_SUCCESS) { in dam_map_alloc()
193 ddi_strid_fini(&mapp->dam_addr_hash); in dam_map_alloc()
196 mapp->dam_da = softstate_p; in dam_map_alloc()
197 mapp->dam_high = 1; in dam_map_alloc()
198 bitset_resize(&mapp->dam_active_set, mapp->dam_size); in dam_map_alloc()
199 bitset_resize(&mapp->dam_stable_set, mapp->dam_size); in dam_map_alloc()
200 bitset_resize(&mapp->dam_report_set, mapp->dam_size); in dam_map_alloc()
217 dam_t *mapp = (dam_t *)damapp; in damap_destroy() local
219 ASSERT(mapp); in damap_destroy()
222 char *, mapp->dam_name, damap_t *, mapp); in damap_destroy()
224 mutex_enter(&mapp->dam_lock); in damap_destroy()
229 mapp->dam_flags |= DAM_DESTROYPEND; in damap_destroy()
231 if (mapp->dam_high) { in damap_destroy()
232 mutex_exit(&mapp->dam_lock); in damap_destroy()
238 mutex_enter(&mapp->dam_lock); in damap_destroy()
239 dam_sched_timeout(NULL, mapp, 0); in damap_destroy()
246 mutex_exit(&mapp->dam_lock); in damap_destroy()
247 for (i = 1; i < mapp->dam_high; i++) { in damap_destroy()
248 if (ddi_get_soft_state(mapp->dam_da, i) == NULL) in damap_destroy()
251 ASSERT(DAM_IN_REPORT(mapp, i) == 0); in damap_destroy()
253 if (DAM_IS_STABLE(mapp, i)) { in damap_destroy()
254 dam_addr_deactivate(mapp, i); in damap_destroy()
256 ddi_strid_free(mapp->dam_addr_hash, i); in damap_destroy()
257 ddi_soft_state_free(mapp->dam_da, i); in damap_destroy()
260 ddi_strid_fini(&mapp->dam_addr_hash); in damap_destroy()
261 ddi_soft_state_fini(&mapp->dam_da); in damap_destroy()
262 kstat_delete(mapp->dam_kstatsp); in damap_destroy()
264 mutex_exit(&mapp->dam_lock); in damap_destroy()
266 bitset_fini(&mapp->dam_active_set); in damap_destroy()
267 bitset_fini(&mapp->dam_stable_set); in damap_destroy()
268 bitset_fini(&mapp->dam_report_set); in damap_destroy()
269 mutex_destroy(&mapp->dam_lock); in damap_destroy()
270 cv_destroy(&mapp->dam_sync_cv); in damap_destroy()
271 if (mapp->dam_name) in damap_destroy()
272 kmem_free(mapp->dam_name, strlen(mapp->dam_name) + 1); in damap_destroy()
273 kmem_free(mapp, sizeof (*mapp)); in damap_destroy()
289 dam_t *mapp = (dam_t *)damapp; in damap_sync() local
292 ASSERT(mapp); in damap_sync()
294 char *, mapp->dam_name, dam_t *, mapp, in damap_sync()
304 mutex_enter(&mapp->dam_lock); in damap_sync()
305 again: while ((mapp->dam_flags & WAITFOR_FLAGS) || in damap_sync()
306 (!bitset_is_null(&mapp->dam_report_set)) || in damap_sync()
307 (mapp->dam_tid != 0)) { in damap_sync()
309 char *, mapp->dam_name, dam_t *, mapp); in damap_sync()
313 if (cv_reltimedwait(&mapp->dam_sync_cv, &mapp->dam_lock, in damap_sync()
315 mapp->dam_sync_to_cnt++; in damap_sync()
320 cv_wait(&mapp->dam_sync_cv, &mapp->dam_lock); in damap_sync()
328 (void) cv_reltimedwait(&mapp->dam_sync_cv, &mapp->dam_lock, in damap_sync()
329 mapp->dam_stable_ticks, TR_MICROSEC); in damap_sync()
330 if (rv && ((mapp->dam_flags & WAITFOR_FLAGS) || in damap_sync()
331 (!bitset_is_null(&mapp->dam_report_set)) || in damap_sync()
332 (mapp->dam_tid != 0))) in damap_sync()
335 mutex_exit(&mapp->dam_lock); in damap_sync()
338 char *, mapp->dam_name, dam_t *, mapp, in damap_sync()
349 dam_t *mapp = (dam_t *)damapp; in damap_is_empty() local
352 mutex_enter(&mapp->dam_lock); in damap_is_empty()
353 rv = bitset_is_null(&mapp->dam_active_set); in damap_is_empty()
354 mutex_exit(&mapp->dam_lock); in damap_is_empty()
368 dam_t *mapp = (dam_t *)damapp; in damap_name() local
370 return (mapp ? mapp->dam_name : "UNKNOWN_damap"); in damap_name()
383 dam_t *mapp = (dam_t *)damapp; in damap_size() local
385 return (mapp->dam_size); in damap_size()
405 dam_t *mapp = (dam_t *)damapp; in damap_addr_add() local
409 if (!mapp || !address || (mapp->dam_rptmode != DAMAP_REPORT_PERADDR)) in damap_addr_add()
413 char *, mapp->dam_name, dam_t *, mapp, in damap_addr_add()
416 mutex_enter(&mapp->dam_lock); in damap_addr_add()
417 if ((dam_map_alloc(mapp) != DAM_SUCCESS) || in damap_addr_add()
418 ((addrid = dam_get_addrid(mapp, address)) == 0)) { in damap_addr_add()
419 mutex_exit(&mapp->dam_lock); in damap_addr_add()
423 passp = ddi_get_soft_state(mapp->dam_da, addrid); in damap_addr_add()
430 if (DAM_IN_REPORT(mapp, addrid)) { in damap_addr_add()
432 char *, mapp->dam_name, dam_t *, mapp, in damap_addr_add()
434 DAM_INCR_STAT(mapp, dam_jitter); in damap_addr_add()
435 dam_addr_report_release(mapp, addrid); in damap_addr_add()
442 dam_addr_report(mapp, passp, addrid, RPT_ADDR_ADD); in damap_addr_add()
445 mutex_exit(&mapp->dam_lock); in damap_addr_add()
462 dam_t *mapp = (dam_t *)damapp; in damap_addr_del() local
466 if (!mapp || !address || (mapp->dam_rptmode != DAMAP_REPORT_PERADDR)) in damap_addr_del()
470 char *, mapp->dam_name, dam_t *, mapp, in damap_addr_del()
472 mutex_enter(&mapp->dam_lock); in damap_addr_del()
473 if (dam_map_alloc(mapp) != DAM_SUCCESS) { in damap_addr_del()
474 mutex_exit(&mapp->dam_lock); in damap_addr_del()
482 if (!(addrid = ddi_strid_str2id(mapp->dam_addr_hash, address))) { in damap_addr_del()
483 mutex_exit(&mapp->dam_lock); in damap_addr_del()
486 passp = ddi_get_soft_state(mapp->dam_da, addrid); in damap_addr_del()
488 if (DAM_IN_REPORT(mapp, addrid)) { in damap_addr_del()
490 char *, mapp->dam_name, dam_t *, mapp, in damap_addr_del()
492 DAM_INCR_STAT(mapp, dam_jitter); in damap_addr_del()
493 dam_addr_report_release(mapp, addrid); in damap_addr_del()
496 dam_addr_report(mapp, passp, addrid, RPT_ADDR_DEL); in damap_addr_del()
497 mutex_exit(&mapp->dam_lock); in damap_addr_del()
504 dam_t *mapp = (dam_t *)damapp; in damap_addrset_flush_locked() local
507 ASSERT(mapp); in damap_addrset_flush_locked()
508 ASSERT(mutex_owned(&mapp->dam_lock)); in damap_addrset_flush_locked()
509 if (mapp->dam_rptmode != DAMAP_REPORT_FULLSET) { in damap_addrset_flush_locked()
514 char *, mapp->dam_name, dam_t *, mapp); in damap_addrset_flush_locked()
515 if (mapp->dam_flags & DAM_SETADD) { in damap_addrset_flush_locked()
517 char *, mapp->dam_name, dam_t *, mapp); in damap_addrset_flush_locked()
522 dam_sched_timeout(NULL, mapp, 0); in damap_addrset_flush_locked()
523 DAM_INCR_STAT(mapp, dam_jitter); in damap_addrset_flush_locked()
528 for (idx = 1; idx < mapp->dam_high; idx++) { in damap_addrset_flush_locked()
529 if (DAM_IN_REPORT(mapp, idx)) { in damap_addrset_flush_locked()
530 dam_addr_report_release(mapp, idx); in damap_addrset_flush_locked()
534 bitset_zero(&mapp->dam_report_set); in damap_addrset_flush_locked()
535 mapp->dam_flags &= ~DAM_SETADD; in damap_addrset_flush_locked()
536 cv_signal(&mapp->dam_sync_cv); in damap_addrset_flush_locked()
553 dam_t *mapp = (dam_t *)damapp; in damap_addrset_begin() local
556 if (mapp == NULL) { in damap_addrset_begin()
561 char *, mapp->dam_name, dam_t *, mapp); in damap_addrset_begin()
563 mutex_enter(&mapp->dam_lock); in damap_addrset_begin()
564 if (dam_map_alloc(mapp) != DAM_SUCCESS) { in damap_addrset_begin()
565 mutex_exit(&mapp->dam_lock); in damap_addrset_begin()
572 mapp->dam_flags |= DAM_SETADD; in damap_addrset_begin()
574 mutex_exit(&mapp->dam_lock); in damap_addrset_begin()
591 dam_t *mapp = (dam_t *)damapp; in damap_addrset_flush() local
593 if (mapp == NULL) { in damap_addrset_flush()
598 char *, mapp->dam_name, dam_t *, mapp); in damap_addrset_flush()
600 mutex_enter(&mapp->dam_lock); in damap_addrset_flush()
602 mutex_exit(&mapp->dam_lock); in damap_addrset_flush()
625 dam_t *mapp = (dam_t *)damapp; in damap_addrset_add() local
629 if (!mapp || !address || (mapp->dam_rptmode != DAMAP_REPORT_FULLSET)) in damap_addrset_add()
633 char *, mapp->dam_name, dam_t *, mapp, char *, address); in damap_addrset_add()
635 mutex_enter(&mapp->dam_lock); in damap_addrset_add()
636 if (!(mapp->dam_flags & DAM_SETADD)) { in damap_addrset_add()
637 mutex_exit(&mapp->dam_lock); in damap_addrset_add()
641 if ((addrid = dam_get_addrid(mapp, address)) == 0) { in damap_addrset_add()
642 mutex_exit(&mapp->dam_lock); in damap_addrset_add()
646 passp = ddi_get_soft_state(mapp->dam_da, addrid); in damap_addrset_add()
648 if (DAM_IN_REPORT(mapp, addrid)) { in damap_addrset_add()
650 char *, mapp->dam_name, dam_t *, mapp, in damap_addrset_add()
652 dam_addr_report_release(mapp, addrid); in damap_addrset_add()
658 bitset_add(&mapp->dam_report_set, addrid); in damap_addrset_add()
661 mutex_exit(&mapp->dam_lock); in damap_addrset_add()
678 dam_t *mapp = (dam_t *)damapp; in damap_addrset_end() local
681 if (!mapp || (mapp->dam_rptmode != DAMAP_REPORT_FULLSET)) in damap_addrset_end()
685 char *, mapp->dam_name, dam_t *, mapp); in damap_addrset_end()
687 mutex_enter(&mapp->dam_lock); in damap_addrset_end()
688 if (!(mapp->dam_flags & DAM_SETADD)) { in damap_addrset_end()
689 mutex_exit(&mapp->dam_lock); in damap_addrset_end()
695 char *, mapp->dam_name, dam_t *, mapp); in damap_addrset_end()
696 dam_sched_timeout(NULL, mapp, 0); in damap_addrset_end()
697 for (i = 1; i < mapp->dam_high; i++) in damap_addrset_end()
698 if (DAM_IN_REPORT(mapp, i)) in damap_addrset_end()
699 dam_addr_report_release(mapp, i); in damap_addrset_end()
701 mapp->dam_last_update = gethrtime(); in damap_addrset_end()
702 dam_sched_timeout(dam_addrset_stable_cb, mapp, in damap_addrset_end()
703 mapp->dam_stable_ticks); in damap_addrset_end()
705 mutex_exit(&mapp->dam_lock); in damap_addrset_end()
721 dam_t *mapp = (dam_t *)damapp; in damap_id2nvlist() local
724 if (mapp->dam_high && ddi_strid_id2str(mapp->dam_addr_hash, addrid)) { in damap_id2nvlist()
725 if (pass = ddi_get_soft_state(mapp->dam_da, addrid)) in damap_id2nvlist()
743 dam_t *mapp = (dam_t *)damapp; in damap_id2addr() local
745 if (mapp->dam_high) in damap_id2addr()
746 return (ddi_strid_id2str(mapp->dam_addr_hash, addrid)); in damap_id2addr()
760 dam_t *mapp = (dam_t *)damapp; in damap_id_rele() local
764 passp = ddi_get_soft_state(mapp->dam_da, (id_t)addrid); in damap_id_rele()
769 char *, mapp->dam_name, dam_t *, mapp, in damap_id_rele()
772 mutex_enter(&mapp->dam_lock); in damap_id_rele()
778 dam_addr_release(mapp, (id_t)addrid); in damap_id_rele()
780 mutex_exit(&mapp->dam_lock); in damap_id_rele()
795 dam_t *mapp = (dam_t *)damapp; in damap_id_ref() local
799 passp = ddi_get_soft_state(mapp->dam_da, (id_t)addrid); in damap_id_ref()
821 dam_t *mapp = (dam_t *)damapp; in damap_id_next() local
824 if (!mapp || !dam_list) in damap_id_next()
828 for (i = start; i < mapp->dam_high; i++) { in damap_id_next()
847 dam_t *mapp = (dam_t *)damapp; in damap_id_priv_set() local
850 mutex_enter(&mapp->dam_lock); in damap_id_priv_set()
851 passp = ddi_get_soft_state(mapp->dam_da, (id_t)addrid); in damap_id_priv_set()
853 mutex_exit(&mapp->dam_lock); in damap_id_priv_set()
857 mutex_exit(&mapp->dam_lock); in damap_id_priv_set()
871 dam_t *mapp = (dam_t *)damapp; in damap_id_priv_get() local
875 mutex_enter(&mapp->dam_lock); in damap_id_priv_get()
876 passp = ddi_get_soft_state(mapp->dam_da, (id_t)addrid); in damap_id_priv_get()
878 mutex_exit(&mapp->dam_lock); in damap_id_priv_get()
882 mutex_exit(&mapp->dam_lock); in damap_id_priv_get()
900 dam_t *mapp = (dam_t *)damapp; in damap_lookup() local
905 char *, mapp->dam_name, dam_t *, mapp, in damap_lookup()
907 mutex_enter(&mapp->dam_lock); in damap_lookup()
908 if (!mapp->dam_high) in damap_lookup()
911 addrid = ddi_strid_str2id(mapp->dam_addr_hash, address); in damap_lookup()
913 if (DAM_IS_STABLE(mapp, addrid)) { in damap_lookup()
914 passp = ddi_get_soft_state(mapp->dam_da, addrid); in damap_lookup()
925 mutex_exit(&mapp->dam_lock); in damap_lookup()
927 char *, mapp->dam_name, dam_t *, mapp, in damap_lookup()
944 dam_t *mapp = (dam_t *)damapp; in damap_lookup_all() local
945 int mapsz = mapp->dam_size; in damap_lookup_all()
952 char *, mapp->dam_name, dam_t *, mapp); in damap_lookup_all()
953 mutex_enter(&mapp->dam_lock); in damap_lookup_all()
954 if (!mapp->dam_high) { in damap_lookup_all()
956 mutex_exit(&mapp->dam_lock); in damap_lookup_all()
958 char *, mapp->dam_name, dam_t *, mapp); in damap_lookup_all()
964 bitset_copy(&mapp->dam_active_set, bsp); in damap_lookup_all()
967 passp = ddi_get_soft_state(mapp->dam_da, i); in damap_lookup_all()
972 char *, mapp->dam_name, dam_t *, mapp, in damap_lookup_all()
981 mutex_exit(&mapp->dam_lock); in damap_lookup_all()
987 mutex_exit(&mapp->dam_lock); in damap_lookup_all()
1001 dam_t *mapp = (dam_t *)damapp; in damap_id_list_rele() local
1007 mutex_enter(&mapp->dam_lock); in damap_id_list_rele()
1008 for (i = 1; i < mapp->dam_high; i++) { in damap_id_list_rele()
1010 (void) dam_addr_release(mapp, i); in damap_id_list_rele()
1012 mutex_exit(&mapp->dam_lock); in damap_id_list_rele()
1021 dam_addr_activate(dam_t *mapp, id_t addrid) in dam_addr_activate() argument
1027 mutex_enter(&mapp->dam_lock); in dam_addr_activate()
1028 bitset_add(&mapp->dam_active_set, addrid); in dam_addr_activate()
1029 passp = ddi_get_soft_state(mapp->dam_da, addrid); in dam_addr_activate()
1035 addrstr = ddi_strid_id2str(mapp->dam_addr_hash, addrid); in dam_addr_activate()
1037 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_activate()
1045 mutex_exit(&mapp->dam_lock); in dam_addr_activate()
1046 if (mapp->dam_activate_cb) { in dam_addr_activate()
1047 (*mapp->dam_activate_cb)(mapp->dam_activate_arg, addrstr, in dam_addr_activate()
1055 config_rv = (*mapp->dam_configure_cb)(mapp->dam_config_arg, mapp, in dam_addr_activate()
1058 mutex_enter(&mapp->dam_lock); in dam_addr_activate()
1060 mutex_exit(&mapp->dam_lock); in dam_addr_activate()
1062 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_activate()
1064 dam_deact_cleanup(mapp, addrid, addrstr, in dam_addr_activate()
1068 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_activate()
1077 dam_addr_deactivate(dam_t *mapp, id_t addrid) in dam_addr_deactivate() argument
1081 addrstr = ddi_strid_id2str(mapp->dam_addr_hash, addrid); in dam_addr_deactivate()
1083 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_deactivate()
1089 (*mapp->dam_unconfig_cb)(mapp->dam_config_arg, mapp, addrid); in dam_addr_deactivate()
1090 dam_deact_cleanup(mapp, addrid, addrstr, DAMAP_DEACT_RSN_GONE); in dam_addr_deactivate()
1094 dam_deact_cleanup(dam_t *mapp, id_t addrid, char *addrstr, in dam_deact_cleanup() argument
1099 passp = ddi_get_soft_state(mapp->dam_da, addrid); in dam_deact_cleanup()
1101 if (mapp->dam_deactivate_cb) in dam_deact_cleanup()
1102 (*mapp->dam_deactivate_cb)(mapp->dam_activate_arg, in dam_deact_cleanup()
1103 ddi_strid_id2str(mapp->dam_addr_hash, addrid), in dam_deact_cleanup()
1110 mutex_enter(&mapp->dam_lock); in dam_deact_cleanup()
1111 bitset_del(&mapp->dam_active_set, addrid); in dam_deact_cleanup()
1120 char *, mapp->dam_name, dam_t *, mapp, in dam_deact_cleanup()
1123 (void) dam_addr_release(mapp, addrid); in dam_deact_cleanup()
1124 mutex_exit(&mapp->dam_lock); in dam_deact_cleanup()
1155 dam_addrset_activate(dam_t *mapp, bitset_t *activate) in dam_addrset_activate() argument
1164 if (mapp->dam_options & DAMAP_MTCONFIG) { in dam_addrset_activate()
1168 for (i = 1, nset = 0; i < mapp->dam_high; i++) in dam_addrset_activate()
1172 (void) snprintf(tqn, sizeof (tqn), "actv-%s", mapp->dam_name); in dam_addrset_activate()
1176 for (i = 1; i < mapp->dam_high; i++) { in dam_addrset_activate()
1179 dam_addr_activate(mapp, i); in dam_addrset_activate()
1185 tqd->tqd_mapp = mapp; in dam_addrset_activate()
1202 dam_addrset_deactivate(dam_t *mapp, bitset_t *deactivate) in dam_addrset_deactivate() argument
1210 char *, mapp->dam_name, dam_t *, mapp); in dam_addrset_deactivate()
1212 if (mapp->dam_options & DAMAP_MTCONFIG) { in dam_addrset_deactivate()
1216 for (i = 1, nset = 0; i < mapp->dam_high; i++) in dam_addrset_deactivate()
1220 mapp->dam_name); in dam_addrset_deactivate()
1224 for (i = 1; i < mapp->dam_high; i++) { in dam_addrset_deactivate()
1227 dam_addr_deactivate(mapp, i); in dam_addrset_deactivate()
1230 tqd->tqd_mapp = mapp; in dam_addrset_deactivate()
1248 dam_addr_release(dam_t *mapp, id_t addrid) in dam_addr_release() argument
1254 ASSERT(mutex_owned(&mapp->dam_lock)); in dam_addr_release()
1255 passp = ddi_get_soft_state(mapp->dam_da, addrid); in dam_addr_release()
1258 addrstr = ddi_strid_id2str(mapp->dam_addr_hash, addrid); in dam_addr_release()
1260 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_release()
1269 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_release()
1277 if (DAM_IN_REPORT(mapp, addrid)) { in dam_addr_release()
1279 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_release()
1284 ddi_strid_free(mapp->dam_addr_hash, addrid); in dam_addr_release()
1285 ddi_soft_state_free(mapp->dam_da, addrid); in dam_addr_release()
1294 dam_t *mapp = (dam_t *)arg; in dam_stabilize_map() local
1302 char *, mapp->dam_name, dam_t *, mapp); in dam_stabilize_map()
1305 bitset_resize(&delta, mapp->dam_size); in dam_stabilize_map()
1307 bitset_resize(&cfg, mapp->dam_size); in dam_stabilize_map()
1309 bitset_resize(&uncfg, mapp->dam_size); in dam_stabilize_map()
1315 mutex_enter(&mapp->dam_lock); in dam_stabilize_map()
1316 ASSERT(mapp->dam_flags & DAM_SPEND); in dam_stabilize_map()
1317 if (!bitset_xor(&mapp->dam_active_set, &mapp->dam_stable_set, in dam_stabilize_map()
1322 bitset_zero(&mapp->dam_stable_set); in dam_stabilize_map()
1323 mapp->dam_flags &= ~DAM_SPEND; in dam_stabilize_map()
1324 cv_signal(&mapp->dam_sync_cv); in dam_stabilize_map()
1325 mutex_exit(&mapp->dam_lock); in dam_stabilize_map()
1331 char *, mapp->dam_name, dam_t *, mapp); in dam_stabilize_map()
1338 has_cfg = bitset_and(&delta, &mapp->dam_stable_set, &cfg); in dam_stabilize_map()
1339 has_uncfg = bitset_and(&delta, &mapp->dam_active_set, &uncfg); in dam_stabilize_map()
1344 mutex_exit(&mapp->dam_lock); in dam_stabilize_map()
1350 dam_addrset_activate(mapp, &cfg); in dam_stabilize_map()
1356 dam_addrset_deactivate(mapp, &uncfg); in dam_stabilize_map()
1363 mutex_enter(&mapp->dam_lock); in dam_stabilize_map()
1364 bitset_zero(&mapp->dam_stable_set); in dam_stabilize_map()
1365 mapp->dam_last_stable = gethrtime(); in dam_stabilize_map()
1366 mapp->dam_stable_cnt++; in dam_stabilize_map()
1367 DAM_INCR_STAT(mapp, dam_cycles); in dam_stabilize_map()
1373 for (i = 1, n_active = 0; i < mapp->dam_high; i++) in dam_stabilize_map()
1374 if (bitset_in_set(&mapp->dam_active_set, i)) in dam_stabilize_map()
1376 DAM_SET_STAT(mapp, dam_active, n_active); in dam_stabilize_map()
1379 char *, mapp->dam_name, dam_t *, mapp, in dam_stabilize_map()
1382 mapp->dam_flags &= ~DAM_SPEND; in dam_stabilize_map()
1383 cv_signal(&mapp->dam_sync_cv); in dam_stabilize_map()
1384 mutex_exit(&mapp->dam_lock); in dam_stabilize_map()
1397 dam_t *mapp = (dam_t *)arg; in dam_addr_stable_cb() local
1404 mutex_enter(&mapp->dam_lock); in dam_addr_stable_cb()
1405 if (mapp->dam_tid == 0) { in dam_addr_stable_cb()
1407 char *, mapp->dam_name, dam_t *, mapp); in dam_addr_stable_cb()
1408 mutex_exit(&mapp->dam_lock); in dam_addr_stable_cb()
1411 mapp->dam_tid = 0; in dam_addr_stable_cb()
1418 if (mapp->dam_flags & DAM_SPEND) { in dam_addr_stable_cb()
1419 DAM_INCR_STAT(mapp, dam_overrun); in dam_addr_stable_cb()
1420 mapp->dam_stable_overrun++; in dam_addr_stable_cb()
1422 char *, mapp->dam_name, dam_t *, mapp); in dam_addr_stable_cb()
1423 dam_sched_timeout(dam_addr_stable_cb, mapp, in dam_addr_stable_cb()
1424 mapp->dam_stable_ticks); in dam_addr_stable_cb()
1425 mutex_exit(&mapp->dam_lock); in dam_addr_stable_cb()
1429 DAM_SET_STAT(mapp, dam_overrun, 0); in dam_addr_stable_cb()
1430 mapp->dam_stable_overrun = 0; in dam_addr_stable_cb()
1434 next_ticks = mapp->dam_stable_ticks; in dam_addr_stable_cb()
1435 for (i = 1; i < mapp->dam_high; i++) { in dam_addr_stable_cb()
1436 if (bitset_in_set(&mapp->dam_report_set, i)) { in dam_addr_stable_cb()
1437 passp = ddi_get_soft_state(mapp->dam_da, i); in dam_addr_stable_cb()
1457 mapp, TQ_NOSLEEP | TQ_NOQUEUE)) { in dam_addr_stable_cb()
1459 char *, mapp->dam_name, dam_t *, mapp); in dam_addr_stable_cb()
1470 mapp->dam_flags |= DAM_SPEND; in dam_addr_stable_cb()
1477 bitset_copy(&mapp->dam_active_set, in dam_addr_stable_cb()
1478 &mapp->dam_stable_set); in dam_addr_stable_cb()
1479 for (i = 1; i < mapp->dam_high; i++) { in dam_addr_stable_cb()
1480 if (!bitset_in_set(&mapp->dam_report_set, i)) in dam_addr_stable_cb()
1483 passp = ddi_get_soft_state(mapp->dam_da, i); in dam_addr_stable_cb()
1489 bitset_del(&mapp->dam_stable_set, i); in dam_addr_stable_cb()
1491 bitset_add(&mapp->dam_stable_set, i); in dam_addr_stable_cb()
1493 bitset_del(&mapp->dam_report_set, i); in dam_addr_stable_cb()
1497 char *, mapp->dam_name, dam_t *, mapp); in dam_addr_stable_cb()
1517 mapp->dam_name, dam_t *, mapp); in dam_addr_stable_cb()
1518 dam_sched_timeout(dam_addr_stable_cb, mapp, in dam_addr_stable_cb()
1522 mutex_exit(&mapp->dam_lock); in dam_addr_stable_cb()
1531 dam_t *mapp = (dam_t *)arg; in dam_addrset_stable_cb() local
1533 mutex_enter(&mapp->dam_lock); in dam_addrset_stable_cb()
1534 if (mapp->dam_tid == 0) { in dam_addrset_stable_cb()
1535 mutex_exit(&mapp->dam_lock); in dam_addrset_stable_cb()
1537 char *, mapp->dam_name, dam_t *, mapp); in dam_addrset_stable_cb()
1540 mapp->dam_tid = 0; in dam_addrset_stable_cb()
1547 if ((mapp->dam_flags & DAM_SPEND) || in dam_addrset_stable_cb()
1548 (taskq_dispatch(system_taskq, dam_stabilize_map, mapp, in dam_addrset_stable_cb()
1550 DAM_INCR_STAT(mapp, dam_overrun); in dam_addrset_stable_cb()
1551 mapp->dam_stable_overrun++; in dam_addrset_stable_cb()
1552 dam_sched_timeout(dam_addrset_stable_cb, mapp, in dam_addrset_stable_cb()
1556 char *, mapp->dam_name, dam_t *, mapp); in dam_addrset_stable_cb()
1557 mutex_exit(&mapp->dam_lock); in dam_addrset_stable_cb()
1561 DAM_SET_STAT(mapp, dam_overrun, 0); in dam_addrset_stable_cb()
1562 mapp->dam_stable_overrun = 0; in dam_addrset_stable_cb()
1563 bitset_copy(&mapp->dam_report_set, &mapp->dam_stable_set); in dam_addrset_stable_cb()
1564 bitset_zero(&mapp->dam_report_set); in dam_addrset_stable_cb()
1565 mapp->dam_flags |= DAM_SPEND; in dam_addrset_stable_cb()
1566 mapp->dam_flags &= ~DAM_SETADD; in dam_addrset_stable_cb()
1570 char *, mapp->dam_name, dam_t *, mapp); in dam_addrset_stable_cb()
1571 mutex_exit(&mapp->dam_lock); in dam_addrset_stable_cb()
1579 dam_sched_timeout(void (*timeout_cb)(), dam_t *mapp, clock_t ticks) in dam_sched_timeout() argument
1584 char *, mapp->dam_name, dam_t *, mapp, in dam_sched_timeout()
1585 int, ticks, timeout_id_t, mapp->dam_tid); in dam_sched_timeout()
1587 ASSERT(mutex_owned(&mapp->dam_lock)); in dam_sched_timeout()
1588 if ((tid = mapp->dam_tid) != 0) { in dam_sched_timeout()
1590 mapp->dam_tid = 0; in dam_sched_timeout()
1591 mutex_exit(&mapp->dam_lock); in dam_sched_timeout()
1593 mutex_enter(&mapp->dam_lock); in dam_sched_timeout()
1597 mapp->dam_tid = timeout(timeout_cb, mapp, ticks); in dam_sched_timeout()
1605 dam_addr_report(dam_t *mapp, dam_da_t *passp, id_t addrid, int rpt_type) in dam_addr_report() argument
1607 char *addrstr = damap_id2addr((damap_t *)mapp, addrid); in dam_addr_report()
1610 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_report()
1613 ASSERT(mutex_owned(&mapp->dam_lock)); in dam_addr_report()
1614 ASSERT(!DAM_IN_REPORT(mapp, addrid)); in dam_addr_report()
1616 mapp->dam_last_update = gethrtime(); in dam_addr_report()
1618 passp->da_deadline = ddi_get_lbolt64() + mapp->dam_stable_ticks; in dam_addr_report()
1623 bitset_add(&mapp->dam_report_set, addrid); in dam_addr_report()
1624 dam_sched_timeout(dam_addr_stable_cb, mapp, mapp->dam_stable_ticks); in dam_addr_report()
1631 dam_addr_report_release(dam_t *mapp, id_t addrid) in dam_addr_report_release() argument
1634 char *addrstr = damap_id2addr((damap_t *)mapp, addrid); in dam_addr_report_release()
1637 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_report_release()
1640 ASSERT(mutex_owned(&mapp->dam_lock)); in dam_addr_report_release()
1641 passp = ddi_get_soft_state(mapp->dam_da, addrid); in dam_addr_report_release()
1649 bitset_del(&mapp->dam_report_set, addrid); in dam_addr_report_release()
1650 if (!DAM_IS_STABLE(mapp, addrid) && mapp->dam_deactivate_cb && in dam_addr_report_release()
1652 mutex_exit(&mapp->dam_lock); in dam_addr_report_release()
1653 (*mapp->dam_deactivate_cb)(mapp->dam_activate_arg, in dam_addr_report_release()
1654 ddi_strid_id2str(mapp->dam_addr_hash, addrid), in dam_addr_report_release()
1656 mutex_enter(&mapp->dam_lock); in dam_addr_report_release()
1666 dam_get_addrid(dam_t *mapp, char *address) in dam_get_addrid() argument
1671 ASSERT(mutex_owned(&mapp->dam_lock)); in dam_get_addrid()
1672 if ((addrid = ddi_strid_str2id(mapp->dam_addr_hash, address)) == 0) { in dam_get_addrid()
1673 if ((addrid = ddi_strid_alloc(mapp->dam_addr_hash, in dam_get_addrid()
1677 if (ddi_soft_state_zalloc(mapp->dam_da, addrid) != in dam_get_addrid()
1679 ddi_strid_free(mapp->dam_addr_hash, addrid); in dam_get_addrid()
1683 if (addrid >= mapp->dam_high) in dam_get_addrid()
1684 mapp->dam_high = addrid + 1; in dam_get_addrid()
1689 if (mapp->dam_high > mapp->dam_size) { in dam_get_addrid()
1690 mapp->dam_size = mapp->dam_size + DAM_SIZE_BUMP; in dam_get_addrid()
1691 bitset_resize(&mapp->dam_active_set, mapp->dam_size); in dam_get_addrid()
1692 bitset_resize(&mapp->dam_stable_set, mapp->dam_size); in dam_get_addrid()
1693 bitset_resize(&mapp->dam_report_set, mapp->dam_size); in dam_get_addrid()
1696 passp = ddi_get_soft_state(mapp->dam_da, addrid); in dam_get_addrid()
1698 passp->da_addr = ddi_strid_id2str(mapp->dam_addr_hash, in dam_get_addrid()
1708 dam_kstat_create(dam_t *mapp) in dam_kstat_create() argument
1713 mapsp = kstat_create("dam", 0, mapp->dam_name, "damap", in dam_kstat_create()
1726 mapp->dam_kstatsp = mapsp; in dam_kstat_create()