Panic: witness_warn (r191682; shared rw udpinp (udpinp)...netinet6/udp6_usrreq.c:360)

Bruce Simpson bms at incunabulum.net
Thu Apr 30 21:43:31 UTC 2009


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
-------------- next part --------------
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)


More information about the freebsd-current mailing list