svn commit: r266066 - stable/9/sys/netinet
Michael Tuexen
tuexen at FreeBSD.org
Wed May 14 18:18:17 UTC 2014
Author: tuexen
Date: Wed May 14 18:18:16 2014
New Revision: 266066
URL: http://svnweb.freebsd.org/changeset/base/266066
Log:
MFC r258574 from rodrigc@
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.
Modified:
stable/9/sys/netinet/sctp_pcb.c
Directory Properties:
stable/9/sys/ (props changed)
Modified: stable/9/sys/netinet/sctp_pcb.c
==============================================================================
--- stable/9/sys/netinet/sctp_pcb.c Wed May 14 18:16:32 2014 (r266065)
+++ stable/9/sys/netinet/sctp_pcb.c Wed May 14 18:18:16 2014 (r266066)
@@ -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)
More information about the svn-src-stable-9
mailing list