6953698 panic with "rw_enter: bad rwlock" in ire_dep_incr_generation w/excl-ip S10c zones
authorErik Nordmark <Erik.Nordmark@Sun.COM>
Mon, 24 May 2010 12:23:05 -0700
changeset 12479 3bda5bd65aa6
parent 12478 a267bf553e0e
child 12480 4396cf7006f1
6953698 panic with "rw_enter: bad rwlock" in ire_dep_incr_generation w/excl-ip S10c zones
usr/src/uts/common/inet/ip/ip.c
usr/src/uts/common/inet/ip/ip_ire.c
--- a/usr/src/uts/common/inet/ip/ip.c	Mon May 24 13:00:02 2010 -0600
+++ b/usr/src/uts/common/inet/ip/ip.c	Mon May 24 12:23:05 2010 -0700
@@ -4356,11 +4356,7 @@
 	arp_hook_destroy(ipst);
 	ip_net_destroy(ipst);
 
-	mutex_destroy(&ipst->ips_capab_taskq_lock);
-	cv_destroy(&ipst->ips_capab_taskq_cv);
-
 	ipmp_destroy(ipst);
-	rw_destroy(&ipst->ips_srcid_lock);
 
 	ip_kstat_fini(stackid, ipst->ips_ip_mibkp);
 	ipst->ips_ip_mibkp = NULL;
@@ -4380,9 +4376,6 @@
 	dce_stack_destroy(ipst);
 	ip_mrouter_stack_destroy(ipst);
 
-	mutex_destroy(&ipst->ips_ip_mi_lock);
-	rw_destroy(&ipst->ips_ill_g_usesrc_lock);
-
 	ret = untimeout(ipst->ips_igmp_timeout_id);
 	if (ret == -1) {
 		ASSERT(ipst->ips_igmp_timeout_id == 0);
@@ -4412,13 +4405,6 @@
 		ipst->ips_mld_slowtimeout_id = 0;
 	}
 
-	mutex_destroy(&ipst->ips_igmp_timer_lock);
-	mutex_destroy(&ipst->ips_mld_timer_lock);
-	mutex_destroy(&ipst->ips_igmp_slowtimeout_lock);
-	mutex_destroy(&ipst->ips_mld_slowtimeout_lock);
-	mutex_destroy(&ipst->ips_ip_addr_avail_lock);
-	rw_destroy(&ipst->ips_ill_g_lock);
-
 	ip_ire_fini(ipst);
 	ip6_asp_free(ipst);
 	conn_drain_fini(ipst);
@@ -4436,6 +4422,21 @@
 		ipst->ips_loopback_ksp = NULL;
 	}
 
+	mutex_destroy(&ipst->ips_capab_taskq_lock);
+	cv_destroy(&ipst->ips_capab_taskq_cv);
+
+	rw_destroy(&ipst->ips_srcid_lock);
+
+	mutex_destroy(&ipst->ips_ip_mi_lock);
+	rw_destroy(&ipst->ips_ill_g_usesrc_lock);
+
+	mutex_destroy(&ipst->ips_igmp_timer_lock);
+	mutex_destroy(&ipst->ips_mld_timer_lock);
+	mutex_destroy(&ipst->ips_igmp_slowtimeout_lock);
+	mutex_destroy(&ipst->ips_mld_slowtimeout_lock);
+	mutex_destroy(&ipst->ips_ip_addr_avail_lock);
+	rw_destroy(&ipst->ips_ill_g_lock);
+
 	kmem_free(ipst->ips_phyint_g_list, sizeof (phyint_list_t));
 	ipst->ips_phyint_g_list = NULL;
 	kmem_free(ipst->ips_ill_g_heads, sizeof (ill_g_head_t) * MAX_G_HEADS);
--- a/usr/src/uts/common/inet/ip/ip_ire.c	Mon May 24 13:00:02 2010 -0600
+++ b/usr/src/uts/common/inet/ip/ip_ire.c	Mon May 24 12:23:05 2010 -0700
@@ -2356,9 +2356,6 @@
 {
 	int i;
 
-	rw_destroy(&ipst->ips_ire_dep_lock);
-	rw_destroy(&ipst->ips_ip6_ire_head_lock);
-
 	ire_make_condemned(ipst->ips_ire_reject_v6);
 	ire_refrele_notr(ipst->ips_ire_reject_v6);
 	ipst->ips_ire_reject_v6 = NULL;
@@ -2384,6 +2381,9 @@
 	rn_freehead(ipst->ips_ip_ftable);
 	ipst->ips_ip_ftable = NULL;
 
+	rw_destroy(&ipst->ips_ire_dep_lock);
+	rw_destroy(&ipst->ips_ip6_ire_head_lock);
+
 	mutex_destroy(&ipst->ips_ire_ft_init_lock);
 
 	for (i = 0; i < IP6_MASK_TABLE_SIZE; i++) {