Module Name:    src
Committed By:   drochner
Date:           Mon Feb 14 13:43:45 UTC 2011

Modified Files:
        src/sys/netipsec: xform_ah.c xform_esp.c xform_ipcomp.c

Log Message:
change locking order, to make sure the cpu is at splsoftnet()
before the softnet_lock (adaptive) mutex is acquired, from
Wolfgang Stukenbrock, should fix a recursive lock panic


To generate a diff of this commit:
cvs rdiff -u -r1.27 -r1.28 src/sys/netipsec/xform_ah.c
cvs rdiff -u -r1.23 -r1.24 src/sys/netipsec/xform_esp.c
cvs rdiff -u -r1.21 -r1.22 src/sys/netipsec/xform_ipcomp.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/netipsec/xform_ah.c
diff -u src/sys/netipsec/xform_ah.c:1.27 src/sys/netipsec/xform_ah.c:1.28
--- src/sys/netipsec/xform_ah.c:1.27	Thu Feb 10 20:24:27 2011
+++ src/sys/netipsec/xform_ah.c	Mon Feb 14 13:43:45 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: xform_ah.c,v 1.27 2011/02/10 20:24:27 drochner Exp $	*/
+/*	$NetBSD: xform_ah.c,v 1.28 2011/02/14 13:43:45 drochner Exp $	*/
 /*	$FreeBSD: src/sys/netipsec/xform_ah.c,v 1.1.4.1 2003/01/24 05:11:36 sam Exp $	*/
 /*	$OpenBSD: ip_ah.c,v 1.63 2001/06/26 06:18:58 angelos Exp $ */
 /*
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xform_ah.c,v 1.27 2011/02/10 20:24:27 drochner Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xform_ah.c,v 1.28 2011/02/14 13:43:45 drochner Exp $");
 
 #include "opt_inet.h"
 #ifdef __FreeBSD__
@@ -829,8 +829,8 @@
 	}
 #endif
 
-	mutex_enter(softnet_lock);
 	s = splsoftnet();
+	mutex_enter(softnet_lock);
 
 	sav = KEY_ALLOCSA(&tc->tc_dst, tc->tc_proto, tc->tc_spi, sport, dport);
 	if (sav == NULL) {
@@ -854,8 +854,8 @@
 			sav->tdb_cryptoid = crp->crp_sid;
 
 		if (crp->crp_etype == EAGAIN) {
-			splx(s);
 			mutex_exit(softnet_lock);
+			splx(s);
 			return crypto_dispatch(crp);
 		}
 
@@ -964,14 +964,14 @@
 	IPSEC_COMMON_INPUT_CB(m, sav, skip, protoff, mtag);
 
 	KEY_FREESAV(&sav);
-	splx(s);
 	mutex_exit(softnet_lock);
+	splx(s);
 	return error;
 bad:
 	if (sav)
 		KEY_FREESAV(&sav);
-	splx(s);
 	mutex_exit(softnet_lock);
+	splx(s);
 	if (m != NULL)
 		m_freem(m);
 	if (tc != NULL)
@@ -1235,8 +1235,8 @@
 	ptr = (tc + 1);
 	m = (struct mbuf *) crp->crp_buf;
 
-	mutex_enter(softnet_lock);
 	s = splsoftnet();
+	mutex_enter(softnet_lock);
 
 	isr = tc->tc_isr;
 	sav = KEY_ALLOCSA(&tc->tc_dst, tc->tc_proto, tc->tc_spi, 0, 0);
@@ -1255,8 +1255,8 @@
 
 		if (crp->crp_etype == EAGAIN) {
 			KEY_FREESAV(&sav);
-			splx(s);
 			mutex_exit(softnet_lock);
+			splx(s);
 			return crypto_dispatch(crp);
 		}
 
@@ -1302,14 +1302,14 @@
 	/* NB: m is reclaimed by ipsec_process_done. */
 	err = ipsec_process_done(m, isr);
 	KEY_FREESAV(&sav);
-	splx(s);
 	mutex_exit(softnet_lock);
+	splx(s);
 	return err;
 bad:
 	if (sav)
 		KEY_FREESAV(&sav);
-	splx(s);
 	mutex_exit(softnet_lock);
+	splx(s);
 	if (m)
 		m_freem(m);
 	free(tc, M_XDATA);

Index: src/sys/netipsec/xform_esp.c
diff -u src/sys/netipsec/xform_esp.c:1.23 src/sys/netipsec/xform_esp.c:1.24
--- src/sys/netipsec/xform_esp.c:1.23	Thu Feb 10 20:24:27 2011
+++ src/sys/netipsec/xform_esp.c	Mon Feb 14 13:43:45 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: xform_esp.c,v 1.23 2011/02/10 20:24:27 drochner Exp $	*/
+/*	$NetBSD: xform_esp.c,v 1.24 2011/02/14 13:43:45 drochner Exp $	*/
 /*	$FreeBSD: src/sys/netipsec/xform_esp.c,v 1.2.2.1 2003/01/24 05:11:36 sam Exp $	*/
 /*	$OpenBSD: ip_esp.c,v 1.69 2001/06/26 06:18:59 angelos Exp $ */
 
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xform_esp.c,v 1.23 2011/02/10 20:24:27 drochner Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xform_esp.c,v 1.24 2011/02/14 13:43:45 drochner Exp $");
 
 #include "opt_inet.h"
 #ifdef __FreeBSD__
@@ -498,8 +498,8 @@
 	}
 #endif
 
-	mutex_enter(softnet_lock);
 	s = splsoftnet();
+	mutex_enter(softnet_lock);
 
 	sav = KEY_ALLOCSA(&tc->tc_dst, tc->tc_proto, tc->tc_spi, sport, dport);
 	if (sav == NULL) {
@@ -528,8 +528,8 @@
 
 		if (crp->crp_etype == EAGAIN) {
 			KEY_FREESAV(&sav);
-			splx(s);
 			mutex_exit(softnet_lock);
+			splx(s);
 			return crypto_dispatch(crp);
 		}
 
@@ -667,14 +667,14 @@
 	IPSEC_COMMON_INPUT_CB(m, sav, skip, protoff, mtag);
 
 	KEY_FREESAV(&sav);
-	splx(s);
 	mutex_exit(softnet_lock);
+	splx(s);
 	return error;
 bad:
 	if (sav)
 		KEY_FREESAV(&sav);
-	splx(s);
 	mutex_exit(softnet_lock);
+	splx(s);
 	if (m != NULL)
 		m_freem(m);
 	if (tc != NULL)
@@ -939,8 +939,8 @@
 	IPSEC_ASSERT(tc != NULL, ("esp_output_cb: null opaque data area!"));
 	m = (struct mbuf *) crp->crp_buf;
 
-	mutex_enter(softnet_lock);
 	s = splsoftnet();
+	mutex_enter(softnet_lock);
 
 	isr = tc->tc_isr;
 	sav = KEY_ALLOCSA(&tc->tc_dst, tc->tc_proto, tc->tc_spi, 0, 0);
@@ -963,8 +963,8 @@
 
 		if (crp->crp_etype == EAGAIN) {
 			KEY_FREESAV(&sav);
-			splx(s);
 			mutex_exit(softnet_lock);
+			splx(s);
 			return crypto_dispatch(crp);
 		}
 
@@ -1010,14 +1010,14 @@
 	/* NB: m is reclaimed by ipsec_process_done. */
 	err = ipsec_process_done(m, isr);
 	KEY_FREESAV(&sav);
-	splx(s);
 	mutex_exit(softnet_lock);
+	splx(s);
 	return err;
 bad:
 	if (sav)
 		KEY_FREESAV(&sav);
-	splx(s);
 	mutex_exit(softnet_lock);
+	splx(s);
 	if (m)
 		m_freem(m);
 	free(tc, M_XDATA);

Index: src/sys/netipsec/xform_ipcomp.c
diff -u src/sys/netipsec/xform_ipcomp.c:1.21 src/sys/netipsec/xform_ipcomp.c:1.22
--- src/sys/netipsec/xform_ipcomp.c:1.21	Thu Feb 10 20:24:27 2011
+++ src/sys/netipsec/xform_ipcomp.c	Mon Feb 14 13:43:45 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: xform_ipcomp.c,v 1.21 2011/02/10 20:24:27 drochner Exp $	*/
+/*	$NetBSD: xform_ipcomp.c,v 1.22 2011/02/14 13:43:45 drochner Exp $	*/
 /*	$FreeBSD: src/sys/netipsec/xform_ipcomp.c,v 1.1.4.1 2003/01/24 05:11:36 sam Exp $	*/
 /* $OpenBSD: ip_ipcomp.c,v 1.1 2001/07/05 12:08:52 jjbg Exp $ */
 
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xform_ipcomp.c,v 1.21 2011/02/10 20:24:27 drochner Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xform_ipcomp.c,v 1.22 2011/02/14 13:43:45 drochner Exp $");
 
 /* IP payload compression protocol (IPComp), see RFC 2393 */
 #include "opt_inet.h"
@@ -258,8 +258,8 @@
 	}
 #endif
 
-	mutex_enter(softnet_lock);
 	s = splsoftnet();
+	mutex_enter(softnet_lock);
 
 	sav = KEY_ALLOCSA(&tc->tc_dst, tc->tc_proto, tc->tc_spi, sport, dport);
 	if (sav == NULL) {
@@ -283,8 +283,8 @@
 
 		if (crp->crp_etype == EAGAIN) {
 			KEY_FREESAV(&sav);
-			splx(s);
 			mutex_exit(softnet_lock);
+			splx(s);
 			return crypto_dispatch(crp);
 		}
 
@@ -342,14 +342,14 @@
 	IPSEC_COMMON_INPUT_CB(m, sav, skip, protoff, NULL);
 
 	KEY_FREESAV(&sav);
-	splx(s);
 	mutex_exit(softnet_lock);
+	splx(s);
 	return error;
 bad:
 	if (sav)
 		KEY_FREESAV(&sav);
-	splx(s);
 	mutex_exit(softnet_lock);
+	splx(s);
 	if (m)
 		m_freem(m);
 	if (tc != NULL)
@@ -518,8 +518,8 @@
 	skip = tc->tc_skip;
 	rlen = crp->crp_ilen - skip;
 
-	mutex_enter(softnet_lock);
 	s = splsoftnet();
+	mutex_enter(softnet_lock);
 
 	isr = tc->tc_isr;
 	sav = KEY_ALLOCSA(&tc->tc_dst, tc->tc_proto, tc->tc_spi, 0, 0);
@@ -539,8 +539,8 @@
 
 		if (crp->crp_etype == EAGAIN) {
 			KEY_FREESAV(&sav);
-			splx(s);
 			mutex_exit(softnet_lock);
+			splx(s);
 			return crypto_dispatch(crp);
 		}
 		IPCOMP_STATINC(IPCOMP_STAT_NOXFORM);
@@ -635,14 +635,14 @@
 	/* NB: m is reclaimed by ipsec_process_done. */
 	error = ipsec_process_done(m, isr);
 	KEY_FREESAV(&sav);
-	splx(s);
 	mutex_exit(softnet_lock);
+	splx(s);
 	return error;
 bad:
 	if (sav)
 		KEY_FREESAV(&sav);
-	splx(s);
 	mutex_exit(softnet_lock);
+	splx(s);
 	if (m)
 		m_freem(m);
 	free(tc, M_XDATA);

Reply via email to