1093 static void
1094 dam_deact_cleanup(dam_t *mapp, id_t addrid, char *addrstr,
1095 damap_deact_rsn_t deact_rsn)
1096 {
1097 dam_da_t *passp;
1098
1099 passp = ddi_get_soft_state(mapp->dam_da, addrid);
1100 ASSERT(passp);
1101 if (mapp->dam_deactivate_cb)
1102 (*mapp->dam_deactivate_cb)(mapp->dam_activate_arg,
1103 ddi_strid_id2str(mapp->dam_addr_hash, addrid),
1104 addrid, passp->da_ppriv, deact_rsn);
1105
1106 /*
1107 * clear the active bit and free the backing info for
1108 * this address
1109 */
1110 mutex_enter(&mapp->dam_lock);
1111 bitset_del(&mapp->dam_active_set, addrid);
1112 passp->da_ppriv = NULL;
1113 if (passp->da_nvl)
1114 nvlist_free(passp->da_nvl);
1115 passp->da_nvl = NULL;
1116 passp->da_ppriv_rpt = NULL;
1117 if (passp->da_nvl_rpt)
1118 nvlist_free(passp->da_nvl_rpt);
1119 passp->da_nvl_rpt = NULL;
1120
1121 DTRACE_PROBE3(damap__addr__deactivate__end,
1122 char *, mapp->dam_name, dam_t *, mapp,
1123 char *, addrstr);
1124
1125 (void) dam_addr_release(mapp, addrid);
1126 mutex_exit(&mapp->dam_lock);
1127 }
1128
1129 /*
1130 * taskq callback for multi-thread activation
1131 */
1132 static void
1133 dam_tq_config(void *arg)
1134 {
1135 cfg_tqd_t *tqd = (cfg_tqd_t *)arg;
1136
1137 dam_addr_activate(tqd->tqd_mapp, tqd->tqd_id);
1641
1642 ASSERT(mutex_owned(&mapp->dam_lock));
1643 passp = ddi_get_soft_state(mapp->dam_da, addrid);
1644 ASSERT(passp);
1645 /*
1646 * clear the report bit
1647 * if the address has a registered deactivation handler and
1648 * we are holding a private data pointer and the address has not
1649 * stabilized, deactivate the address (private data).
1650 */
1651 bitset_del(&mapp->dam_report_set, addrid);
1652 if (!DAM_IS_STABLE(mapp, addrid) && mapp->dam_deactivate_cb &&
1653 passp->da_ppriv_rpt) {
1654 mutex_exit(&mapp->dam_lock);
1655 (*mapp->dam_deactivate_cb)(mapp->dam_activate_arg,
1656 ddi_strid_id2str(mapp->dam_addr_hash, addrid),
1657 addrid, passp->da_ppriv_rpt, DAMAP_DEACT_RSN_UNSTBL);
1658 mutex_enter(&mapp->dam_lock);
1659 }
1660 passp->da_ppriv_rpt = NULL;
1661 if (passp->da_nvl_rpt)
1662 nvlist_free(passp->da_nvl_rpt);
1663 }
1664
1665 /*
1666 * return the map ID of an address
1667 */
1668 static id_t
1669 dam_get_addrid(dam_t *mapp, char *address)
1670 {
1671 damap_id_t addrid;
1672 dam_da_t *passp;
1673
1674 ASSERT(mutex_owned(&mapp->dam_lock));
1675 if ((addrid = ddi_strid_str2id(mapp->dam_addr_hash, address)) == 0) {
1676 if ((addrid = ddi_strid_alloc(mapp->dam_addr_hash,
1677 address)) == (damap_id_t)0) {
1678 return (0);
1679 }
1680 if (ddi_soft_state_zalloc(mapp->dam_da, addrid) !=
1681 DDI_SUCCESS) {
|
1093 static void
1094 dam_deact_cleanup(dam_t *mapp, id_t addrid, char *addrstr,
1095 damap_deact_rsn_t deact_rsn)
1096 {
1097 dam_da_t *passp;
1098
1099 passp = ddi_get_soft_state(mapp->dam_da, addrid);
1100 ASSERT(passp);
1101 if (mapp->dam_deactivate_cb)
1102 (*mapp->dam_deactivate_cb)(mapp->dam_activate_arg,
1103 ddi_strid_id2str(mapp->dam_addr_hash, addrid),
1104 addrid, passp->da_ppriv, deact_rsn);
1105
1106 /*
1107 * clear the active bit and free the backing info for
1108 * this address
1109 */
1110 mutex_enter(&mapp->dam_lock);
1111 bitset_del(&mapp->dam_active_set, addrid);
1112 passp->da_ppriv = NULL;
1113 nvlist_free(passp->da_nvl);
1114 passp->da_nvl = NULL;
1115 passp->da_ppriv_rpt = NULL;
1116 nvlist_free(passp->da_nvl_rpt);
1117 passp->da_nvl_rpt = NULL;
1118
1119 DTRACE_PROBE3(damap__addr__deactivate__end,
1120 char *, mapp->dam_name, dam_t *, mapp,
1121 char *, addrstr);
1122
1123 (void) dam_addr_release(mapp, addrid);
1124 mutex_exit(&mapp->dam_lock);
1125 }
1126
1127 /*
1128 * taskq callback for multi-thread activation
1129 */
1130 static void
1131 dam_tq_config(void *arg)
1132 {
1133 cfg_tqd_t *tqd = (cfg_tqd_t *)arg;
1134
1135 dam_addr_activate(tqd->tqd_mapp, tqd->tqd_id);
1639
1640 ASSERT(mutex_owned(&mapp->dam_lock));
1641 passp = ddi_get_soft_state(mapp->dam_da, addrid);
1642 ASSERT(passp);
1643 /*
1644 * clear the report bit
1645 * if the address has a registered deactivation handler and
1646 * we are holding a private data pointer and the address has not
1647 * stabilized, deactivate the address (private data).
1648 */
1649 bitset_del(&mapp->dam_report_set, addrid);
1650 if (!DAM_IS_STABLE(mapp, addrid) && mapp->dam_deactivate_cb &&
1651 passp->da_ppriv_rpt) {
1652 mutex_exit(&mapp->dam_lock);
1653 (*mapp->dam_deactivate_cb)(mapp->dam_activate_arg,
1654 ddi_strid_id2str(mapp->dam_addr_hash, addrid),
1655 addrid, passp->da_ppriv_rpt, DAMAP_DEACT_RSN_UNSTBL);
1656 mutex_enter(&mapp->dam_lock);
1657 }
1658 passp->da_ppriv_rpt = NULL;
1659 nvlist_free(passp->da_nvl_rpt);
1660 }
1661
1662 /*
1663 * return the map ID of an address
1664 */
1665 static id_t
1666 dam_get_addrid(dam_t *mapp, char *address)
1667 {
1668 damap_id_t addrid;
1669 dam_da_t *passp;
1670
1671 ASSERT(mutex_owned(&mapp->dam_lock));
1672 if ((addrid = ddi_strid_str2id(mapp->dam_addr_hash, address)) == 0) {
1673 if ((addrid = ddi_strid_alloc(mapp->dam_addr_hash,
1674 address)) == (damap_id_t)0) {
1675 return (0);
1676 }
1677 if (ddi_soft_state_zalloc(mapp->dam_da, addrid) !=
1678 DDI_SUCCESS) {
|