Lines Matching refs:mapp

69 #define	DAM_INCR_STAT(mapp, stat)				\  argument
70 if ((mapp)->dam_kstatsp) { \
71 struct dam_kstats *stp = (mapp)->dam_kstatsp->ks_data; \
75 #define DAM_SET_STAT(mapp, stat, val) \ argument
76 if ((mapp)->dam_kstatsp) { \
77 struct dam_kstats *stp = (mapp)->dam_kstatsp->ks_data; \
129 dam_t *mapp; in damap_create() local
134 mapp = kmem_zalloc(sizeof (*mapp), KM_SLEEP); in damap_create()
135 mapp->dam_options = map_opts; in damap_create()
136 mapp->dam_stable_ticks = drv_usectohz(stable_usec); in damap_create()
137 mapp->dam_size = 0; in damap_create()
138 mapp->dam_rptmode = mode; in damap_create()
139 mapp->dam_activate_arg = activate_arg; in damap_create()
140 mapp->dam_activate_cb = (activate_cb_t)activate_cb; in damap_create()
141 mapp->dam_deactivate_cb = (deactivate_cb_t)deactivate_cb; in damap_create()
142 mapp->dam_config_arg = config_arg; in damap_create()
143 mapp->dam_configure_cb = (configure_cb_t)configure_cb; in damap_create()
144 mapp->dam_unconfig_cb = (unconfig_cb_t)unconfig_cb; in damap_create()
145 mapp->dam_name = i_ddi_strdup(name, KM_SLEEP); in damap_create()
146 mutex_init(&mapp->dam_lock, NULL, MUTEX_DRIVER, NULL); in damap_create()
147 cv_init(&mapp->dam_sync_cv, NULL, CV_DRIVER, NULL); in damap_create()
148 bitset_init(&mapp->dam_active_set); in damap_create()
149 bitset_init(&mapp->dam_stable_set); in damap_create()
150 bitset_init(&mapp->dam_report_set); in damap_create()
151 *damapp = (damap_t *)mapp; in damap_create()
154 char *, mapp->dam_name, damap_t *, mapp, in damap_create()
168 dam_map_alloc(dam_t *mapp) in dam_map_alloc() argument
172 ASSERT(mutex_owned(&mapp->dam_lock)); in dam_map_alloc()
173 if (mapp->dam_flags & DAM_DESTROYPEND) in dam_map_alloc()
179 if (mapp->dam_high) in dam_map_alloc()
182 mapp->dam_size = DAM_SIZE_BUMP; in dam_map_alloc()
184 mapp->dam_size) != DDI_SUCCESS) in dam_map_alloc()
187 if (ddi_strid_init(&mapp->dam_addr_hash, mapp->dam_size) != in dam_map_alloc()
192 if (dam_kstat_create(mapp) != DDI_SUCCESS) { in dam_map_alloc()
194 ddi_strid_fini(&mapp->dam_addr_hash); in dam_map_alloc()
197 mapp->dam_da = softstate_p; in dam_map_alloc()
198 mapp->dam_high = 1; in dam_map_alloc()
199 bitset_resize(&mapp->dam_active_set, mapp->dam_size); in dam_map_alloc()
200 bitset_resize(&mapp->dam_stable_set, mapp->dam_size); in dam_map_alloc()
201 bitset_resize(&mapp->dam_report_set, mapp->dam_size); in dam_map_alloc()
218 dam_t *mapp = (dam_t *)damapp; in damap_destroy() local
220 ASSERT(mapp); in damap_destroy()
223 char *, mapp->dam_name, damap_t *, mapp); in damap_destroy()
225 mutex_enter(&mapp->dam_lock); in damap_destroy()
230 mapp->dam_flags |= DAM_DESTROYPEND; in damap_destroy()
232 if (mapp->dam_high) { in damap_destroy()
233 mutex_exit(&mapp->dam_lock); in damap_destroy()
239 mutex_enter(&mapp->dam_lock); in damap_destroy()
240 dam_sched_timeout(NULL, mapp, 0); in damap_destroy()
247 mutex_exit(&mapp->dam_lock); in damap_destroy()
248 for (i = 1; i < mapp->dam_high; i++) { in damap_destroy()
249 if (ddi_get_soft_state(mapp->dam_da, i) == NULL) in damap_destroy()
252 ASSERT(DAM_IN_REPORT(mapp, i) == 0); in damap_destroy()
254 if (DAM_IS_STABLE(mapp, i)) { in damap_destroy()
255 dam_addr_deactivate(mapp, i); in damap_destroy()
257 ddi_strid_free(mapp->dam_addr_hash, i); in damap_destroy()
258 ddi_soft_state_free(mapp->dam_da, i); in damap_destroy()
261 ddi_strid_fini(&mapp->dam_addr_hash); in damap_destroy()
262 ddi_soft_state_fini(&mapp->dam_da); in damap_destroy()
263 kstat_delete(mapp->dam_kstatsp); in damap_destroy()
265 mutex_exit(&mapp->dam_lock); in damap_destroy()
267 bitset_fini(&mapp->dam_active_set); in damap_destroy()
268 bitset_fini(&mapp->dam_stable_set); in damap_destroy()
269 bitset_fini(&mapp->dam_report_set); in damap_destroy()
270 mutex_destroy(&mapp->dam_lock); in damap_destroy()
271 cv_destroy(&mapp->dam_sync_cv); in damap_destroy()
272 if (mapp->dam_name) in damap_destroy()
273 kmem_free(mapp->dam_name, strlen(mapp->dam_name) + 1); in damap_destroy()
274 kmem_free(mapp, sizeof (*mapp)); in damap_destroy()
290 dam_t *mapp = (dam_t *)damapp; in damap_sync() local
293 ASSERT(mapp); in damap_sync()
295 char *, mapp->dam_name, dam_t *, mapp, in damap_sync()
305 mutex_enter(&mapp->dam_lock); in damap_sync()
306 again: while ((mapp->dam_flags & WAITFOR_FLAGS) || in damap_sync()
307 (!bitset_is_null(&mapp->dam_report_set)) || in damap_sync()
308 (mapp->dam_tid != 0)) { in damap_sync()
310 char *, mapp->dam_name, dam_t *, mapp); in damap_sync()
314 if (cv_reltimedwait(&mapp->dam_sync_cv, &mapp->dam_lock, in damap_sync()
316 mapp->dam_sync_to_cnt++; in damap_sync()
321 cv_wait(&mapp->dam_sync_cv, &mapp->dam_lock); in damap_sync()
329 (void) cv_reltimedwait(&mapp->dam_sync_cv, &mapp->dam_lock, in damap_sync()
330 mapp->dam_stable_ticks, TR_MICROSEC); in damap_sync()
331 if (rv && ((mapp->dam_flags & WAITFOR_FLAGS) || in damap_sync()
332 (!bitset_is_null(&mapp->dam_report_set)) || in damap_sync()
333 (mapp->dam_tid != 0))) in damap_sync()
336 mutex_exit(&mapp->dam_lock); in damap_sync()
339 char *, mapp->dam_name, dam_t *, mapp, in damap_sync()
350 dam_t *mapp = (dam_t *)damapp; in damap_is_empty() local
353 mutex_enter(&mapp->dam_lock); in damap_is_empty()
354 rv = bitset_is_null(&mapp->dam_active_set); in damap_is_empty()
355 mutex_exit(&mapp->dam_lock); in damap_is_empty()
369 dam_t *mapp = (dam_t *)damapp; in damap_name() local
371 return (mapp ? mapp->dam_name : "UNKNOWN_damap"); in damap_name()
384 dam_t *mapp = (dam_t *)damapp; in damap_size() local
386 return (mapp->dam_size); in damap_size()
406 dam_t *mapp = (dam_t *)damapp; in damap_addr_add() local
410 if (!mapp || !address || (mapp->dam_rptmode != DAMAP_REPORT_PERADDR)) in damap_addr_add()
414 char *, mapp->dam_name, dam_t *, mapp, in damap_addr_add()
417 mutex_enter(&mapp->dam_lock); in damap_addr_add()
418 if ((dam_map_alloc(mapp) != DAM_SUCCESS) || in damap_addr_add()
419 ((addrid = dam_get_addrid(mapp, address)) == 0)) { in damap_addr_add()
420 mutex_exit(&mapp->dam_lock); in damap_addr_add()
424 passp = ddi_get_soft_state(mapp->dam_da, addrid); in damap_addr_add()
431 if (DAM_IN_REPORT(mapp, addrid)) { in damap_addr_add()
433 char *, mapp->dam_name, dam_t *, mapp, in damap_addr_add()
435 DAM_INCR_STAT(mapp, dam_jitter); in damap_addr_add()
436 dam_addr_report_release(mapp, addrid); in damap_addr_add()
443 dam_addr_report(mapp, passp, addrid, RPT_ADDR_ADD); in damap_addr_add()
446 mutex_exit(&mapp->dam_lock); in damap_addr_add()
463 dam_t *mapp = (dam_t *)damapp; in damap_addr_del() local
467 if (!mapp || !address || (mapp->dam_rptmode != DAMAP_REPORT_PERADDR)) in damap_addr_del()
471 char *, mapp->dam_name, dam_t *, mapp, in damap_addr_del()
473 mutex_enter(&mapp->dam_lock); in damap_addr_del()
474 if (dam_map_alloc(mapp) != DAM_SUCCESS) { in damap_addr_del()
475 mutex_exit(&mapp->dam_lock); in damap_addr_del()
483 if (!(addrid = ddi_strid_str2id(mapp->dam_addr_hash, address))) { in damap_addr_del()
484 mutex_exit(&mapp->dam_lock); in damap_addr_del()
487 passp = ddi_get_soft_state(mapp->dam_da, addrid); in damap_addr_del()
489 if (DAM_IN_REPORT(mapp, addrid)) { in damap_addr_del()
491 char *, mapp->dam_name, dam_t *, mapp, in damap_addr_del()
493 DAM_INCR_STAT(mapp, dam_jitter); in damap_addr_del()
494 dam_addr_report_release(mapp, addrid); in damap_addr_del()
497 dam_addr_report(mapp, passp, addrid, RPT_ADDR_DEL); in damap_addr_del()
498 mutex_exit(&mapp->dam_lock); in damap_addr_del()
505 dam_t *mapp = (dam_t *)damapp; in damap_addrset_flush_locked() local
508 ASSERT(mapp); in damap_addrset_flush_locked()
509 ASSERT(mutex_owned(&mapp->dam_lock)); in damap_addrset_flush_locked()
510 if (mapp->dam_rptmode != DAMAP_REPORT_FULLSET) { in damap_addrset_flush_locked()
515 char *, mapp->dam_name, dam_t *, mapp); in damap_addrset_flush_locked()
516 if (mapp->dam_flags & DAM_SETADD) { in damap_addrset_flush_locked()
518 char *, mapp->dam_name, dam_t *, mapp); in damap_addrset_flush_locked()
523 dam_sched_timeout(NULL, mapp, 0); in damap_addrset_flush_locked()
524 DAM_INCR_STAT(mapp, dam_jitter); in damap_addrset_flush_locked()
529 for (idx = 1; idx < mapp->dam_high; idx++) { in damap_addrset_flush_locked()
530 if (DAM_IN_REPORT(mapp, idx)) { in damap_addrset_flush_locked()
531 dam_addr_report_release(mapp, idx); in damap_addrset_flush_locked()
535 bitset_zero(&mapp->dam_report_set); in damap_addrset_flush_locked()
536 mapp->dam_flags &= ~DAM_SETADD; in damap_addrset_flush_locked()
537 cv_signal(&mapp->dam_sync_cv); in damap_addrset_flush_locked()
554 dam_t *mapp = (dam_t *)damapp; in damap_addrset_begin() local
557 if (mapp == NULL) { in damap_addrset_begin()
562 char *, mapp->dam_name, dam_t *, mapp); in damap_addrset_begin()
564 mutex_enter(&mapp->dam_lock); in damap_addrset_begin()
565 if (dam_map_alloc(mapp) != DAM_SUCCESS) { in damap_addrset_begin()
566 mutex_exit(&mapp->dam_lock); in damap_addrset_begin()
573 mapp->dam_flags |= DAM_SETADD; in damap_addrset_begin()
575 mutex_exit(&mapp->dam_lock); in damap_addrset_begin()
592 dam_t *mapp = (dam_t *)damapp; in damap_addrset_flush() local
594 if (mapp == NULL) { in damap_addrset_flush()
599 char *, mapp->dam_name, dam_t *, mapp); in damap_addrset_flush()
601 mutex_enter(&mapp->dam_lock); in damap_addrset_flush()
603 mutex_exit(&mapp->dam_lock); in damap_addrset_flush()
626 dam_t *mapp = (dam_t *)damapp; in damap_addrset_add() local
630 if (!mapp || !address || (mapp->dam_rptmode != DAMAP_REPORT_FULLSET)) in damap_addrset_add()
634 char *, mapp->dam_name, dam_t *, mapp, char *, address); in damap_addrset_add()
636 mutex_enter(&mapp->dam_lock); in damap_addrset_add()
637 if (!(mapp->dam_flags & DAM_SETADD)) { in damap_addrset_add()
638 mutex_exit(&mapp->dam_lock); in damap_addrset_add()
642 if ((addrid = dam_get_addrid(mapp, address)) == 0) { in damap_addrset_add()
643 mutex_exit(&mapp->dam_lock); in damap_addrset_add()
647 passp = ddi_get_soft_state(mapp->dam_da, addrid); in damap_addrset_add()
649 if (DAM_IN_REPORT(mapp, addrid)) { in damap_addrset_add()
651 char *, mapp->dam_name, dam_t *, mapp, in damap_addrset_add()
653 dam_addr_report_release(mapp, addrid); in damap_addrset_add()
659 bitset_add(&mapp->dam_report_set, addrid); in damap_addrset_add()
662 mutex_exit(&mapp->dam_lock); in damap_addrset_add()
679 dam_t *mapp = (dam_t *)damapp; in damap_addrset_end() local
682 if (!mapp || (mapp->dam_rptmode != DAMAP_REPORT_FULLSET)) in damap_addrset_end()
686 char *, mapp->dam_name, dam_t *, mapp); in damap_addrset_end()
688 mutex_enter(&mapp->dam_lock); in damap_addrset_end()
689 if (!(mapp->dam_flags & DAM_SETADD)) { in damap_addrset_end()
690 mutex_exit(&mapp->dam_lock); in damap_addrset_end()
696 char *, mapp->dam_name, dam_t *, mapp); in damap_addrset_end()
697 dam_sched_timeout(NULL, mapp, 0); in damap_addrset_end()
698 for (i = 1; i < mapp->dam_high; i++) in damap_addrset_end()
699 if (DAM_IN_REPORT(mapp, i)) in damap_addrset_end()
700 dam_addr_report_release(mapp, i); in damap_addrset_end()
702 mapp->dam_last_update = gethrtime(); in damap_addrset_end()
703 dam_sched_timeout(dam_addrset_stable_cb, mapp, in damap_addrset_end()
704 mapp->dam_stable_ticks); in damap_addrset_end()
706 mutex_exit(&mapp->dam_lock); in damap_addrset_end()
722 dam_t *mapp = (dam_t *)damapp; in damap_id2nvlist() local
725 if (mapp->dam_high && ddi_strid_id2str(mapp->dam_addr_hash, addrid)) { in damap_id2nvlist()
726 if (pass = ddi_get_soft_state(mapp->dam_da, addrid)) in damap_id2nvlist()
744 dam_t *mapp = (dam_t *)damapp; in damap_id2addr() local
746 if (mapp->dam_high) in damap_id2addr()
747 return (ddi_strid_id2str(mapp->dam_addr_hash, addrid)); in damap_id2addr()
761 dam_t *mapp = (dam_t *)damapp; in damap_id_rele() local
765 passp = ddi_get_soft_state(mapp->dam_da, (id_t)addrid); in damap_id_rele()
770 char *, mapp->dam_name, dam_t *, mapp, in damap_id_rele()
773 mutex_enter(&mapp->dam_lock); in damap_id_rele()
779 dam_addr_release(mapp, (id_t)addrid); in damap_id_rele()
781 mutex_exit(&mapp->dam_lock); in damap_id_rele()
796 dam_t *mapp = (dam_t *)damapp; in damap_id_ref() local
800 passp = ddi_get_soft_state(mapp->dam_da, (id_t)addrid); in damap_id_ref()
822 dam_t *mapp = (dam_t *)damapp; in damap_id_next() local
825 if (!mapp || !dam_list) in damap_id_next()
829 for (i = start; i < mapp->dam_high; i++) { in damap_id_next()
848 dam_t *mapp = (dam_t *)damapp; in damap_id_priv_set() local
851 mutex_enter(&mapp->dam_lock); in damap_id_priv_set()
852 passp = ddi_get_soft_state(mapp->dam_da, (id_t)addrid); in damap_id_priv_set()
854 mutex_exit(&mapp->dam_lock); in damap_id_priv_set()
858 mutex_exit(&mapp->dam_lock); in damap_id_priv_set()
872 dam_t *mapp = (dam_t *)damapp; in damap_id_priv_get() local
876 mutex_enter(&mapp->dam_lock); in damap_id_priv_get()
877 passp = ddi_get_soft_state(mapp->dam_da, (id_t)addrid); in damap_id_priv_get()
879 mutex_exit(&mapp->dam_lock); in damap_id_priv_get()
883 mutex_exit(&mapp->dam_lock); in damap_id_priv_get()
901 dam_t *mapp = (dam_t *)damapp; in damap_lookup() local
906 char *, mapp->dam_name, dam_t *, mapp, in damap_lookup()
908 mutex_enter(&mapp->dam_lock); in damap_lookup()
909 if (!mapp->dam_high) in damap_lookup()
912 addrid = ddi_strid_str2id(mapp->dam_addr_hash, address); in damap_lookup()
914 if (DAM_IS_STABLE(mapp, addrid)) { in damap_lookup()
915 passp = ddi_get_soft_state(mapp->dam_da, addrid); in damap_lookup()
926 mutex_exit(&mapp->dam_lock); in damap_lookup()
928 char *, mapp->dam_name, dam_t *, mapp, in damap_lookup()
945 dam_t *mapp = (dam_t *)damapp; in damap_lookup_all() local
946 int mapsz = mapp->dam_size; in damap_lookup_all()
953 char *, mapp->dam_name, dam_t *, mapp); in damap_lookup_all()
954 mutex_enter(&mapp->dam_lock); in damap_lookup_all()
955 if (!mapp->dam_high) { in damap_lookup_all()
957 mutex_exit(&mapp->dam_lock); in damap_lookup_all()
959 char *, mapp->dam_name, dam_t *, mapp); in damap_lookup_all()
965 bitset_copy(&mapp->dam_active_set, bsp); in damap_lookup_all()
968 passp = ddi_get_soft_state(mapp->dam_da, i); in damap_lookup_all()
973 char *, mapp->dam_name, dam_t *, mapp, in damap_lookup_all()
982 mutex_exit(&mapp->dam_lock); in damap_lookup_all()
988 mutex_exit(&mapp->dam_lock); in damap_lookup_all()
1002 dam_t *mapp = (dam_t *)damapp; in damap_id_list_rele() local
1008 mutex_enter(&mapp->dam_lock); in damap_id_list_rele()
1009 for (i = 1; i < mapp->dam_high; i++) { in damap_id_list_rele()
1011 (void) dam_addr_release(mapp, i); in damap_id_list_rele()
1013 mutex_exit(&mapp->dam_lock); in damap_id_list_rele()
1022 dam_addr_activate(dam_t *mapp, id_t addrid) in dam_addr_activate() argument
1028 mutex_enter(&mapp->dam_lock); in dam_addr_activate()
1029 bitset_add(&mapp->dam_active_set, addrid); in dam_addr_activate()
1030 passp = ddi_get_soft_state(mapp->dam_da, addrid); in dam_addr_activate()
1036 addrstr = ddi_strid_id2str(mapp->dam_addr_hash, addrid); in dam_addr_activate()
1038 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_activate()
1044 mutex_exit(&mapp->dam_lock); in dam_addr_activate()
1045 if (mapp->dam_activate_cb) { in dam_addr_activate()
1046 (*mapp->dam_activate_cb)(mapp->dam_activate_arg, addrstr, in dam_addr_activate()
1054 config_rv = (*mapp->dam_configure_cb)(mapp->dam_config_arg, mapp, in dam_addr_activate()
1057 mutex_enter(&mapp->dam_lock); in dam_addr_activate()
1059 mutex_exit(&mapp->dam_lock); in dam_addr_activate()
1061 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_activate()
1063 dam_deact_cleanup(mapp, addrid, addrstr, in dam_addr_activate()
1067 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_activate()
1076 dam_addr_deactivate(dam_t *mapp, id_t addrid) in dam_addr_deactivate() argument
1080 addrstr = ddi_strid_id2str(mapp->dam_addr_hash, addrid); in dam_addr_deactivate()
1082 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_deactivate()
1088 (*mapp->dam_unconfig_cb)(mapp->dam_config_arg, mapp, addrid); in dam_addr_deactivate()
1089 dam_deact_cleanup(mapp, addrid, addrstr, DAMAP_DEACT_RSN_GONE); in dam_addr_deactivate()
1093 dam_deact_cleanup(dam_t *mapp, id_t addrid, char *addrstr, in dam_deact_cleanup() argument
1098 passp = ddi_get_soft_state(mapp->dam_da, addrid); in dam_deact_cleanup()
1100 if (mapp->dam_deactivate_cb) in dam_deact_cleanup()
1101 (*mapp->dam_deactivate_cb)(mapp->dam_activate_arg, in dam_deact_cleanup()
1102 ddi_strid_id2str(mapp->dam_addr_hash, addrid), in dam_deact_cleanup()
1109 mutex_enter(&mapp->dam_lock); in dam_deact_cleanup()
1110 bitset_del(&mapp->dam_active_set, addrid); in dam_deact_cleanup()
1118 char *, mapp->dam_name, dam_t *, mapp, in dam_deact_cleanup()
1121 (void) dam_addr_release(mapp, addrid); in dam_deact_cleanup()
1122 mutex_exit(&mapp->dam_lock); in dam_deact_cleanup()
1153 dam_addrset_activate(dam_t *mapp, bitset_t *activate) in dam_addrset_activate() argument
1162 if (mapp->dam_options & DAMAP_MTCONFIG) { in dam_addrset_activate()
1166 for (i = 1, nset = 0; i < mapp->dam_high; i++) in dam_addrset_activate()
1170 (void) snprintf(tqn, sizeof (tqn), "actv-%s", mapp->dam_name); in dam_addrset_activate()
1174 for (i = 1; i < mapp->dam_high; i++) { in dam_addrset_activate()
1177 dam_addr_activate(mapp, i); in dam_addrset_activate()
1183 tqd->tqd_mapp = mapp; in dam_addrset_activate()
1200 dam_addrset_deactivate(dam_t *mapp, bitset_t *deactivate) in dam_addrset_deactivate() argument
1208 char *, mapp->dam_name, dam_t *, mapp); in dam_addrset_deactivate()
1210 if (mapp->dam_options & DAMAP_MTCONFIG) { in dam_addrset_deactivate()
1214 for (i = 1, nset = 0; i < mapp->dam_high; i++) in dam_addrset_deactivate()
1218 mapp->dam_name); in dam_addrset_deactivate()
1222 for (i = 1; i < mapp->dam_high; i++) { in dam_addrset_deactivate()
1225 dam_addr_deactivate(mapp, i); in dam_addrset_deactivate()
1228 tqd->tqd_mapp = mapp; in dam_addrset_deactivate()
1246 dam_addr_release(dam_t *mapp, id_t addrid) in dam_addr_release() argument
1252 ASSERT(mutex_owned(&mapp->dam_lock)); in dam_addr_release()
1253 passp = ddi_get_soft_state(mapp->dam_da, addrid); in dam_addr_release()
1256 addrstr = ddi_strid_id2str(mapp->dam_addr_hash, addrid); in dam_addr_release()
1258 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_release()
1267 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_release()
1275 if (DAM_IN_REPORT(mapp, addrid)) { in dam_addr_release()
1277 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_release()
1282 ddi_strid_free(mapp->dam_addr_hash, addrid); in dam_addr_release()
1283 ddi_soft_state_free(mapp->dam_da, addrid); in dam_addr_release()
1292 dam_t *mapp = (dam_t *)arg; in dam_stabilize_map() local
1300 char *, mapp->dam_name, dam_t *, mapp); in dam_stabilize_map()
1303 bitset_resize(&delta, mapp->dam_size); in dam_stabilize_map()
1305 bitset_resize(&cfg, mapp->dam_size); in dam_stabilize_map()
1307 bitset_resize(&uncfg, mapp->dam_size); in dam_stabilize_map()
1313 mutex_enter(&mapp->dam_lock); in dam_stabilize_map()
1314 ASSERT(mapp->dam_flags & DAM_SPEND); in dam_stabilize_map()
1315 if (!bitset_xor(&mapp->dam_active_set, &mapp->dam_stable_set, in dam_stabilize_map()
1320 bitset_zero(&mapp->dam_stable_set); in dam_stabilize_map()
1321 mapp->dam_flags &= ~DAM_SPEND; in dam_stabilize_map()
1322 cv_signal(&mapp->dam_sync_cv); in dam_stabilize_map()
1323 mutex_exit(&mapp->dam_lock); in dam_stabilize_map()
1329 char *, mapp->dam_name, dam_t *, mapp); in dam_stabilize_map()
1336 has_cfg = bitset_and(&delta, &mapp->dam_stable_set, &cfg); in dam_stabilize_map()
1337 has_uncfg = bitset_and(&delta, &mapp->dam_active_set, &uncfg); in dam_stabilize_map()
1342 mutex_exit(&mapp->dam_lock); in dam_stabilize_map()
1348 dam_addrset_activate(mapp, &cfg); in dam_stabilize_map()
1354 dam_addrset_deactivate(mapp, &uncfg); in dam_stabilize_map()
1361 mutex_enter(&mapp->dam_lock); in dam_stabilize_map()
1362 bitset_zero(&mapp->dam_stable_set); in dam_stabilize_map()
1363 mapp->dam_last_stable = gethrtime(); in dam_stabilize_map()
1364 mapp->dam_stable_cnt++; in dam_stabilize_map()
1365 DAM_INCR_STAT(mapp, dam_cycles); in dam_stabilize_map()
1371 for (i = 1, n_active = 0; i < mapp->dam_high; i++) in dam_stabilize_map()
1372 if (bitset_in_set(&mapp->dam_active_set, i)) in dam_stabilize_map()
1374 DAM_SET_STAT(mapp, dam_active, n_active); in dam_stabilize_map()
1377 char *, mapp->dam_name, dam_t *, mapp, in dam_stabilize_map()
1380 mapp->dam_flags &= ~DAM_SPEND; in dam_stabilize_map()
1381 cv_signal(&mapp->dam_sync_cv); in dam_stabilize_map()
1382 mutex_exit(&mapp->dam_lock); in dam_stabilize_map()
1395 dam_t *mapp = (dam_t *)arg; in dam_addr_stable_cb() local
1402 mutex_enter(&mapp->dam_lock); in dam_addr_stable_cb()
1403 if (mapp->dam_tid == 0) { in dam_addr_stable_cb()
1405 char *, mapp->dam_name, dam_t *, mapp); in dam_addr_stable_cb()
1406 mutex_exit(&mapp->dam_lock); in dam_addr_stable_cb()
1409 mapp->dam_tid = 0; in dam_addr_stable_cb()
1416 if (mapp->dam_flags & DAM_SPEND) { in dam_addr_stable_cb()
1417 DAM_INCR_STAT(mapp, dam_overrun); in dam_addr_stable_cb()
1418 mapp->dam_stable_overrun++; in dam_addr_stable_cb()
1420 char *, mapp->dam_name, dam_t *, mapp); in dam_addr_stable_cb()
1421 dam_sched_timeout(dam_addr_stable_cb, mapp, in dam_addr_stable_cb()
1422 mapp->dam_stable_ticks); in dam_addr_stable_cb()
1423 mutex_exit(&mapp->dam_lock); in dam_addr_stable_cb()
1427 DAM_SET_STAT(mapp, dam_overrun, 0); in dam_addr_stable_cb()
1428 mapp->dam_stable_overrun = 0; in dam_addr_stable_cb()
1432 next_ticks = mapp->dam_stable_ticks; in dam_addr_stable_cb()
1433 for (i = 1; i < mapp->dam_high; i++) { in dam_addr_stable_cb()
1434 if (bitset_in_set(&mapp->dam_report_set, i)) { in dam_addr_stable_cb()
1435 passp = ddi_get_soft_state(mapp->dam_da, i); in dam_addr_stable_cb()
1455 mapp, TQ_NOSLEEP | TQ_NOQUEUE) != TASKQID_INVALID) { in dam_addr_stable_cb()
1457 char *, mapp->dam_name, dam_t *, mapp); in dam_addr_stable_cb()
1468 mapp->dam_flags |= DAM_SPEND; in dam_addr_stable_cb()
1475 bitset_copy(&mapp->dam_active_set, in dam_addr_stable_cb()
1476 &mapp->dam_stable_set); in dam_addr_stable_cb()
1477 for (i = 1; i < mapp->dam_high; i++) { in dam_addr_stable_cb()
1478 if (!bitset_in_set(&mapp->dam_report_set, i)) in dam_addr_stable_cb()
1481 passp = ddi_get_soft_state(mapp->dam_da, i); in dam_addr_stable_cb()
1487 bitset_del(&mapp->dam_stable_set, i); in dam_addr_stable_cb()
1489 bitset_add(&mapp->dam_stable_set, i); in dam_addr_stable_cb()
1491 bitset_del(&mapp->dam_report_set, i); in dam_addr_stable_cb()
1495 char *, mapp->dam_name, dam_t *, mapp); in dam_addr_stable_cb()
1515 mapp->dam_name, dam_t *, mapp); in dam_addr_stable_cb()
1516 dam_sched_timeout(dam_addr_stable_cb, mapp, in dam_addr_stable_cb()
1520 mutex_exit(&mapp->dam_lock); in dam_addr_stable_cb()
1529 dam_t *mapp = (dam_t *)arg; in dam_addrset_stable_cb() local
1531 mutex_enter(&mapp->dam_lock); in dam_addrset_stable_cb()
1532 if (mapp->dam_tid == 0) { in dam_addrset_stable_cb()
1533 mutex_exit(&mapp->dam_lock); in dam_addrset_stable_cb()
1535 char *, mapp->dam_name, dam_t *, mapp); in dam_addrset_stable_cb()
1538 mapp->dam_tid = 0; in dam_addrset_stable_cb()
1545 if ((mapp->dam_flags & DAM_SPEND) || in dam_addrset_stable_cb()
1546 (taskq_dispatch(system_taskq, dam_stabilize_map, mapp, in dam_addrset_stable_cb()
1548 DAM_INCR_STAT(mapp, dam_overrun); in dam_addrset_stable_cb()
1549 mapp->dam_stable_overrun++; in dam_addrset_stable_cb()
1550 dam_sched_timeout(dam_addrset_stable_cb, mapp, in dam_addrset_stable_cb()
1554 char *, mapp->dam_name, dam_t *, mapp); in dam_addrset_stable_cb()
1555 mutex_exit(&mapp->dam_lock); in dam_addrset_stable_cb()
1559 DAM_SET_STAT(mapp, dam_overrun, 0); in dam_addrset_stable_cb()
1560 mapp->dam_stable_overrun = 0; in dam_addrset_stable_cb()
1561 bitset_copy(&mapp->dam_report_set, &mapp->dam_stable_set); in dam_addrset_stable_cb()
1562 bitset_zero(&mapp->dam_report_set); in dam_addrset_stable_cb()
1563 mapp->dam_flags |= DAM_SPEND; in dam_addrset_stable_cb()
1564 mapp->dam_flags &= ~DAM_SETADD; in dam_addrset_stable_cb()
1568 char *, mapp->dam_name, dam_t *, mapp); in dam_addrset_stable_cb()
1569 mutex_exit(&mapp->dam_lock); in dam_addrset_stable_cb()
1577 dam_sched_timeout(void (*timeout_cb)(), dam_t *mapp, clock_t ticks) in dam_sched_timeout() argument
1582 char *, mapp->dam_name, dam_t *, mapp, in dam_sched_timeout()
1583 int, ticks, timeout_id_t, mapp->dam_tid); in dam_sched_timeout()
1585 ASSERT(mutex_owned(&mapp->dam_lock)); in dam_sched_timeout()
1586 if ((tid = mapp->dam_tid) != 0) { in dam_sched_timeout()
1588 mapp->dam_tid = 0; in dam_sched_timeout()
1589 mutex_exit(&mapp->dam_lock); in dam_sched_timeout()
1591 mutex_enter(&mapp->dam_lock); in dam_sched_timeout()
1595 mapp->dam_tid = timeout(timeout_cb, mapp, ticks); in dam_sched_timeout()
1603 dam_addr_report(dam_t *mapp, dam_da_t *passp, id_t addrid, int rpt_type) in dam_addr_report() argument
1605 char *addrstr = damap_id2addr((damap_t *)mapp, addrid); in dam_addr_report()
1608 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_report()
1611 ASSERT(mutex_owned(&mapp->dam_lock)); in dam_addr_report()
1612 ASSERT(!DAM_IN_REPORT(mapp, addrid)); in dam_addr_report()
1614 mapp->dam_last_update = gethrtime(); in dam_addr_report()
1616 passp->da_deadline = ddi_get_lbolt64() + mapp->dam_stable_ticks; in dam_addr_report()
1621 bitset_add(&mapp->dam_report_set, addrid); in dam_addr_report()
1622 dam_sched_timeout(dam_addr_stable_cb, mapp, mapp->dam_stable_ticks); in dam_addr_report()
1629 dam_addr_report_release(dam_t *mapp, id_t addrid) in dam_addr_report_release() argument
1632 char *addrstr = damap_id2addr((damap_t *)mapp, addrid); in dam_addr_report_release()
1635 char *, mapp->dam_name, dam_t *, mapp, in dam_addr_report_release()
1638 ASSERT(mutex_owned(&mapp->dam_lock)); in dam_addr_report_release()
1639 passp = ddi_get_soft_state(mapp->dam_da, addrid); in dam_addr_report_release()
1647 bitset_del(&mapp->dam_report_set, addrid); in dam_addr_report_release()
1648 if (!DAM_IS_STABLE(mapp, addrid) && mapp->dam_deactivate_cb && in dam_addr_report_release()
1650 mutex_exit(&mapp->dam_lock); in dam_addr_report_release()
1651 (*mapp->dam_deactivate_cb)(mapp->dam_activate_arg, in dam_addr_report_release()
1652 ddi_strid_id2str(mapp->dam_addr_hash, addrid), in dam_addr_report_release()
1654 mutex_enter(&mapp->dam_lock); in dam_addr_report_release()
1664 dam_get_addrid(dam_t *mapp, char *address) in dam_get_addrid() argument
1669 ASSERT(mutex_owned(&mapp->dam_lock)); in dam_get_addrid()
1670 if ((addrid = ddi_strid_str2id(mapp->dam_addr_hash, address)) == 0) { in dam_get_addrid()
1671 if ((addrid = ddi_strid_alloc(mapp->dam_addr_hash, in dam_get_addrid()
1675 if (ddi_soft_state_zalloc(mapp->dam_da, addrid) != in dam_get_addrid()
1677 ddi_strid_free(mapp->dam_addr_hash, addrid); in dam_get_addrid()
1681 if (addrid >= mapp->dam_high) in dam_get_addrid()
1682 mapp->dam_high = addrid + 1; in dam_get_addrid()
1687 if (mapp->dam_high > mapp->dam_size) { in dam_get_addrid()
1688 mapp->dam_size = mapp->dam_size + DAM_SIZE_BUMP; in dam_get_addrid()
1689 bitset_resize(&mapp->dam_active_set, mapp->dam_size); in dam_get_addrid()
1690 bitset_resize(&mapp->dam_stable_set, mapp->dam_size); in dam_get_addrid()
1691 bitset_resize(&mapp->dam_report_set, mapp->dam_size); in dam_get_addrid()
1694 passp = ddi_get_soft_state(mapp->dam_da, addrid); in dam_get_addrid()
1696 passp->da_addr = ddi_strid_id2str(mapp->dam_addr_hash, in dam_get_addrid()
1706 dam_kstat_create(dam_t *mapp) in dam_kstat_create() argument
1711 mapsp = kstat_create("dam", 0, mapp->dam_name, "damap", in dam_kstat_create()
1724 mapp->dam_kstatsp = mapsp; in dam_kstat_create()