summaryrefslogtreecommitdiffstats
path: root/sys/netinet
diff options
context:
space:
mode:
authorrodrigc <rodrigc@FreeBSD.org>2013-11-25 18:49:37 +0000
committerrodrigc <rodrigc@FreeBSD.org>2013-11-25 18:49:37 +0000
commit919a38db633a7eec6c5533f47ebeecc35bcac5ba (patch)
tree59a065f38fee65c49ef20d2271b0e3f65ee10a5f /sys/netinet
parent80415152a8912ab195f433916f4ecb7cf03f834e (diff)
downloadFreeBSD-src-919a38db633a7eec6c5533f47ebeecc35bcac5ba.zip
FreeBSD-src-919a38db633a7eec6c5533f47ebeecc35bcac5ba.tar.gz
Only initialize some mutexes for the default VNET.
In r208160, sctp_it_ctl was made a global variable, across all VNETs. However, sctp_init() is called for every VNET that is created. This results in the same global mutexes which are part of sctp_it_ctl being initialized. This can result in crashes if many jails are created. To reproduce the problem: (1) Take a GENERIC kernel config, and add options for: VIMAGE, WITNESS, INVARIANTS. (2) Run this command in a loop: jail -l -u root -c path=/ name=foo persist vnet && jexec foo ifconfig lo0 127.0.0.1/8 && jail -r foo (see http://lists.freebsd.org/pipermail/freebsd-current/2010-November/021280.html ) Witness will warn about the same mutex being initialized. Fix the problem by only initializing these mutexes in the default VNET.
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/sctp_pcb.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/sys/netinet/sctp_pcb.c b/sys/netinet/sctp_pcb.c
index 75e22be..c3439be 100644
--- a/sys/netinet/sctp_pcb.c
+++ b/sys/netinet/sctp_pcb.c
@@ -5864,8 +5864,14 @@ sctp_pcb_init()
for (i = 0; i < SCTP_STACK_VTAG_HASH_SIZE; i++) {
LIST_INIT(&SCTP_BASE_INFO(vtag_timewait)[i]);
}
- SCTP_ITERATOR_LOCK_INIT();
- SCTP_IPI_ITERATOR_WQ_INIT();
+ /*
+ * Only initialize non-VNET global mutexes for the
+ * default instance.
+ */
+ if (IS_DEFAULT_VNET(curvnet)) {
+ SCTP_ITERATOR_LOCK_INIT();
+ SCTP_IPI_ITERATOR_WQ_INIT();
+ }
sctp_startup_iterator();
#if defined(__FreeBSD__) && defined(SCTP_MCORE_INPUT) && defined(SMP)
OpenPOWER on IntegriCloud