Date: Wed, 3 Aug 2005 16:48:28 GMT From: Robert Watson <rwatson@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 81407 for review Message-ID: <200508031648.j73GmSXd005326@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=81407 Change 81407 by rwatson@rwatson_zoo on 2005/08/03 16:48:09 Mark in_multi_mtx as recursible instead of if_addr_mtx, that's what I meant to do before. This is necessary because IGMP calls into ip_output() to send out packets while holding the in_multi_mtx, but ip_output() has to acquire it to perform address checks. Really, this suggests IGMP shouldn't reenter the network code quite as much as it does. Affected files ... .. //depot/projects/netsmp/src/sys/net/if_var.h#8 edit .. //depot/projects/netsmp/src/sys/netinet/in.c#5 edit Differences ... ==== //depot/projects/netsmp/src/sys/net/if_var.h#8 (text+ko) ==== @@ -221,7 +221,7 @@ * Locks for address lists on the network interface. */ #define IF_ADDR_LOCK_INIT(if) mtx_init(&(if)->if_addr_mtx, \ - "if_addr_mtx", NULL, MTX_DEF | MTX_RECURSE) + "if_addr_mtx", NULL, MTX_DEF) #define IF_ADDR_LOCK_DESTROY(if) mtx_destroy(&(if)->if_addr_mtx) #define IF_ADDR_LOCK(if) mtx_lock(&(if)->if_addr_mtx) #define IF_ADDR_UNLOCK(if) mtx_unlock(&(if)->if_addr_mtx) ==== //depot/projects/netsmp/src/sys/netinet/in.c#5 (text+ko) ==== @@ -69,13 +69,15 @@ &subnetsarelocal, 0, "Treat all subnets as directly connected"); /* - * The IPv4 multicast list (in_multihead and associated structures) - * are protected by the global in_multi_mtx. See in_var.h for - * more details. + * The IPv4 multicast list (in_multihead and associated structures) are + * protected by the global in_multi_mtx. See in_var.h for more details. For + * now, in_multi_mtx is marked as recursible due to IGMP's calling back into + * ip_output() to send IGMP packets while holding the lock; this probably is + * not quite desirable. */ struct in_multihead in_multihead; /* XXX BSS initialization */ struct mtx in_multi_mtx; -MTX_SYSINIT(in_multi_mtx, &in_multi_mtx, "in_multi_mtx", MTX_DEF); +MTX_SYSINIT(in_multi_mtx, &in_multi_mtx, "in_multi_mtx", MTX_DEF | MTX_RECURSE); extern struct inpcbinfo ripcbinfo; extern struct inpcbinfo udbinfo;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200508031648.j73GmSXd005326>