Print this page
OS-6441 netstack_find_by_stackid() drops-and-reacquires
*** 121,130 ****
--- 121,131 ----
static boolean_t netstack_apply_destroy(kmutex_t *, netstack_t *, int);
static boolean_t wait_for_zone_creator(netstack_t *, kmutex_t *);
static boolean_t wait_for_nms_inprogress(netstack_t *, nm_state_t *,
kmutex_t *);
+ static void netstack_hold_locked(netstack_t *);
static void netstack_reap_work(netstack_t *, boolean_t);
ksema_t netstack_reap_limiter;
void
netstack_init(void)
*** 1035,1046 ****
mutex_enter(&netstack_g_lock);
for (ns = netstack_head; ns != NULL; ns = ns->netstack_next) {
mutex_enter(&ns->netstack_lock);
if (ns->netstack_stackid == stackid &&
!(ns->netstack_flags & (NSF_UNINIT|NSF_CLOSING))) {
mutex_exit(&ns->netstack_lock);
- netstack_hold(ns);
mutex_exit(&netstack_g_lock);
return (ns);
}
mutex_exit(&ns->netstack_lock);
}
--- 1036,1047 ----
mutex_enter(&netstack_g_lock);
for (ns = netstack_head; ns != NULL; ns = ns->netstack_next) {
mutex_enter(&ns->netstack_lock);
if (ns->netstack_stackid == stackid &&
!(ns->netstack_flags & (NSF_UNINIT|NSF_CLOSING))) {
+ netstack_hold_locked(ns);
mutex_exit(&ns->netstack_lock);
mutex_exit(&netstack_g_lock);
return (ns);
}
mutex_exit(&ns->netstack_lock);
}
*** 1193,1210 ****
netstack_reap_work(ns, is_not_intr);
}
}
}
void
netstack_hold(netstack_t *ns)
{
mutex_enter(&ns->netstack_lock);
! ns->netstack_refcnt++;
! ASSERT(ns->netstack_refcnt > 0);
mutex_exit(&ns->netstack_lock);
- DTRACE_PROBE1(netstack__inc__ref, netstack_t *, ns);
}
/*
* To support kstat_create_netstack() using kstat_zone_add we need
* to track both
--- 1194,1218 ----
netstack_reap_work(ns, is_not_intr);
}
}
}
+ static void
+ netstack_hold_locked(netstack_t *ns)
+ {
+ ASSERT(MUTEX_HELD(&ns->netstack_lock));
+ ns->netstack_refcnt++;
+ ASSERT(ns->netstack_refcnt > 0);
+ DTRACE_PROBE1(netstack__inc__ref, netstack_t *, ns);
+ }
+
void
netstack_hold(netstack_t *ns)
{
mutex_enter(&ns->netstack_lock);
! netstack_hold_locked(ns);
mutex_exit(&ns->netstack_lock);
}
/*
* To support kstat_create_netstack() using kstat_zone_add we need
* to track both