Print this page
OS-XXXX netstack_find_by_stackid() drops-and-reacquires

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/os/netstack.c
          +++ new/usr/src/uts/common/os/netstack.c
↓ open down ↓ 115 lines elided ↑ open up ↑
 116  116  static void     apply_all_netstacks(int, applyfn_t *);
 117  117  static void     apply_all_modules(netstack_t *, applyfn_t *);
 118  118  static void     apply_all_modules_reverse(netstack_t *, applyfn_t *);
 119  119  static boolean_t netstack_apply_create(kmutex_t *, netstack_t *, int);
 120  120  static boolean_t netstack_apply_shutdown(kmutex_t *, netstack_t *, int);
 121  121  static boolean_t netstack_apply_destroy(kmutex_t *, netstack_t *, int);
 122  122  static boolean_t wait_for_zone_creator(netstack_t *, kmutex_t *);
 123  123  static boolean_t wait_for_nms_inprogress(netstack_t *, nm_state_t *,
 124  124      kmutex_t *);
 125  125  
      126 +static void netstack_hold_locked(netstack_t *);
 126  127  static void netstack_reap_work(netstack_t *, boolean_t);
 127  128  ksema_t netstack_reap_limiter;
 128  129  
 129  130  void
 130  131  netstack_init(void)
 131  132  {
 132  133          mutex_init(&netstack_g_lock, NULL, MUTEX_DEFAULT, NULL);
 133  134          mutex_init(&netstack_shared_lock, NULL, MUTEX_DEFAULT, NULL);
 134  135  
 135  136          /* XXX KEBE SAYS hard-coded constant needs to be fixed. */
↓ open down ↓ 894 lines elided ↑ open up ↑
1030 1031  netstack_t *
1031 1032  netstack_find_by_stackid(netstackid_t stackid)
1032 1033  {
1033 1034          netstack_t *ns;
1034 1035  
1035 1036          mutex_enter(&netstack_g_lock);
1036 1037          for (ns = netstack_head; ns != NULL; ns = ns->netstack_next) {
1037 1038                  mutex_enter(&ns->netstack_lock);
1038 1039                  if (ns->netstack_stackid == stackid &&
1039 1040                      !(ns->netstack_flags & (NSF_UNINIT|NSF_CLOSING))) {
     1041 +                        netstack_hold_locked(ns);
1040 1042                          mutex_exit(&ns->netstack_lock);
1041      -                        netstack_hold(ns);
1042 1043                          mutex_exit(&netstack_g_lock);
1043 1044                          return (ns);
1044 1045                  }
1045 1046                  mutex_exit(&ns->netstack_lock);
1046 1047          }
1047 1048          mutex_exit(&netstack_g_lock);
1048 1049          return (NULL);
1049 1050  }
1050 1051  
1051 1052  boolean_t
↓ open down ↓ 136 lines elided ↑ open up ↑
1188 1189                           * Well shoot, why can't we taskq_dispatch?
1189 1190                           * Take our chances with a direct call.
1190 1191                           */
1191 1192                          DTRACE_PROBE1(netstack__reap__taskq__fail,
1192 1193                              netstack_t *, ns);
1193 1194                          netstack_reap_work(ns, is_not_intr);
1194 1195                  }
1195 1196          }
1196 1197  }
1197 1198  
     1199 +static void
     1200 +netstack_hold_locked(netstack_t *ns)
     1201 +{
     1202 +        ASSERT(MUTEX_HELD(&ns->netstack_lock));
     1203 +        ns->netstack_refcnt++;
     1204 +        ASSERT(ns->netstack_refcnt > 0);
     1205 +        DTRACE_PROBE1(netstack__inc__ref, netstack_t *, ns);
     1206 +}
     1207 +
1198 1208  void
1199 1209  netstack_hold(netstack_t *ns)
1200 1210  {
1201 1211          mutex_enter(&ns->netstack_lock);
1202      -        ns->netstack_refcnt++;
1203      -        ASSERT(ns->netstack_refcnt > 0);
     1212 +        netstack_hold_locked(ns);
1204 1213          mutex_exit(&ns->netstack_lock);
1205      -        DTRACE_PROBE1(netstack__inc__ref, netstack_t *, ns);
1206 1214  }
1207 1215  
1208 1216  /*
1209 1217   * To support kstat_create_netstack() using kstat_zone_add we need
1210 1218   * to track both
1211 1219   *  - all zoneids that use the global/shared stack
1212 1220   *  - all kstats that have been added for the shared stack
1213 1221   */
1214 1222  kstat_t *
1215 1223  kstat_create_netstack(char *ks_module, int ks_instance, char *ks_name,
↓ open down ↓ 248 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX