Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 30 Apr 2009 22:43:26 +0100
From:      Bruce Simpson <bms@incunabulum.net>
To:        David Wolfskill <david@catwhisker.org>,  Chagin Dmitry <dchagin@freebsd.org>, Robert Watson <rwatson@freebsd.org>, current@freebsd.org
Subject:   Re: Panic: witness_warn (r191682; shared rw udpinp (udpinp)...netinet6/udp6_usrreq.c:360)
Message-ID:  <49FA1B7E.7060201@incunabulum.net>
In-Reply-To: <20090430213621.GA61978@albert.catwhisker.org>
References:  <20090430155408.GX1387@albert.catwhisker.org>	<alpine.BSF.2.00.0904302026460.8997@fledge.watson.org>	<20090430204828.GA6551@dchagin.static.corbina.ru> <20090430213621.GA61978@albert.catwhisker.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------080402050100010602080202
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

David Wolfskill wrote:
> ...
> I believe that qualifies as Goodness, as I was able to use ssh to
> access the machine, so it's definitely up in multi-user mode.
>   


Hi,

Can you try this patch? This patch is probably more correct -- but you 
can see my intent was to avoid thrashing the INP lock on mcast delivery. 
INP lock use in that routine is goopy to read. That'll teach me to do 
things from memory for IPv4... bah! :-)


cheers
BMS

--------------080402050100010602080202
Content-Type: text/plain;
 name="udp6inplock.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="udp6inplock.diff"

Index: udp6_usrreq.c
===================================================================
--- udp6_usrreq.c	(revision 191705)
+++ udp6_usrreq.c	(working copy)
@@ -279,8 +279,6 @@
 					continue;
 			}
 
-			INP_RLOCK(inp);
-
 			/*
 			 * Handle socket delivery policy for any-source
 			 * and source-specific multicast. [RFC3678]
@@ -290,6 +288,8 @@
 				struct sockaddr_in6	 mcaddr;
 				int			 blocked;
 
+				INP_RLOCK(inp);
+
 				bzero(&mcaddr, sizeof(struct sockaddr_in6));
 				mcaddr.sin6_len = sizeof(struct sockaddr_in6);
 				mcaddr.sin6_family = AF_INET6;
@@ -304,9 +304,11 @@
 					if (blocked == MCAST_NOTSMEMBER ||
 					    blocked == MCAST_MUTED)
 						UDPSTAT_INC(udps_filtermcast);
-					INP_RUNLOCK(inp);
+					INP_RUNLOCK(inp); /* XXX */
 					continue;
 				}
+
+				INP_RUNLOCK(inp);
 			}
 			if (last != NULL) {
 				struct mbuf *n;
@@ -423,8 +425,6 @@
 	return (IPPROTO_DONE);
 
 badheadlocked:
-	if (inp)
-		INP_RUNLOCK(inp);
 	INP_INFO_RUNLOCK(&V_udbinfo);
 badunlocked:
 	if (m)

--------------080402050100010602080202--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?49FA1B7E.7060201>