From owner-freebsd-net@FreeBSD.ORG  Mon Aug 22 23:40:12 2011
Return-Path: <owner-freebsd-net@FreeBSD.ORG>
Delivered-To: freebsd-net@hub.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id BCE141065677
	for <freebsd-net@hub.freebsd.org>; Mon, 22 Aug 2011 23:40:12 +0000 (UTC)
	(envelope-from gnats@FreeBSD.org)
Received: from freefall.freebsd.org (freefall.freebsd.org
	[IPv6:2001:4f8:fff6::28])
	by mx1.freebsd.org (Postfix) with ESMTP id 933D78FC0C
	for <freebsd-net@hub.freebsd.org>; Mon, 22 Aug 2011 23:40:12 +0000 (UTC)
Received: from freefall.freebsd.org (localhost [127.0.0.1])
	by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id p7MNeCJ5035483
	for <freebsd-net@freefall.freebsd.org>; Mon, 22 Aug 2011 23:40:12 GMT
	(envelope-from gnats@freefall.freebsd.org)
Received: (from gnats@localhost)
	by freefall.freebsd.org (8.14.4/8.14.4/Submit) id p7MNeCfc035482;
	Mon, 22 Aug 2011 23:40:12 GMT (envelope-from gnats)
Date: Mon, 22 Aug 2011 23:40:12 GMT
Message-Id: <201108222340.p7MNeCfc035482@freefall.freebsd.org>
To: freebsd-net@FreeBSD.org
From: dfilter@FreeBSD.ORG (dfilter service)
Cc: 
Subject: Re: kern/158426: commit references a PR
X-BeenThere: freebsd-net@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
Reply-To: dfilter service <dfilter@FreeBSD.ORG>
List-Id: Networking and TCP/IP with FreeBSD <freebsd-net.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/freebsd-net>,
	<mailto:freebsd-net-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/freebsd-net>
List-Post: <mailto:freebsd-net@freebsd.org>
List-Help: <mailto:freebsd-net-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/freebsd-net>,
	<mailto:freebsd-net-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Mon, 22 Aug 2011 23:40:12 -0000

The following reply was made to PR kern/158426; it has been noted by GNATS.

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: kern/158426: commit references a PR
Date: Mon, 22 Aug 2011 23:39:50 +0000 (UTC)

 Author: pluknet
 Date: Mon Aug 22 23:39:40 2011
 New Revision: 225096
 URL: http://svn.freebsd.org/changeset/base/225096
 
 Log:
   Fix if_addr_mtx recursion in mld6.
   
   mld_set_version() is called only from mld_v1_input_query() and
   mld_v2_input_query() both holding the if_addr_mtx lock, and then calling
   into mld_v2_cancel_link_timers() acquires it the second time, which results
   in mtx recursion. To avoid that, delay if_addr_mtx acquisition until after
   mld_set_version() is called; while here, further reduce locking scope
   to protect only the needed pieces: if_multiaddrs, in6m_lookup_locked().
   
   PR:		kern/158426
   Reported by:	Thomas <tps vr-web.de>,
   		Tom Vijlbrief <tom.vijlbrief xs4all.nl>
   Tested by:	Tom Vijlbrief
   Reviewed by:	bz
   Approved by:	re (kib)
 
 Modified:
   head/sys/netinet6/mld6.c
 
 Modified: head/sys/netinet6/mld6.c
 ==============================================================================
 --- head/sys/netinet6/mld6.c	Mon Aug 22 23:27:23 2011	(r225095)
 +++ head/sys/netinet6/mld6.c	Mon Aug 22 23:39:40 2011	(r225096)
 @@ -680,7 +680,6 @@ mld_v1_input_query(struct ifnet *ifp, co
  
  	IN6_MULTI_LOCK();
  	MLD_LOCK();
 -	IF_ADDR_LOCK(ifp);
  
  	/*
  	 * Switch to MLDv1 host compatibility mode.
 @@ -693,6 +692,7 @@ mld_v1_input_query(struct ifnet *ifp, co
  	if (timer == 0)
  		timer = 1;
  
 +	IF_ADDR_LOCK(ifp);
  	if (is_general_query) {
  		/*
  		 * For each reporting group joined on this
 @@ -888,7 +888,6 @@ mld_v2_input_query(struct ifnet *ifp, co
  
  	IN6_MULTI_LOCK();
  	MLD_LOCK();
 -	IF_ADDR_LOCK(ifp);
  
  	mli = MLD_IFINFO(ifp);
  	KASSERT(mli != NULL, ("%s: no mld_ifinfo for ifp %p", __func__, ifp));
 @@ -936,14 +935,18 @@ mld_v2_input_query(struct ifnet *ifp, co
  		 * Queries for groups we are not a member of on this
  		 * link are simply ignored.
  		 */
 +		IF_ADDR_LOCK(ifp);
  		inm = in6m_lookup_locked(ifp, &mld->mld_addr);
 -		if (inm == NULL)
 +		if (inm == NULL) {
 +			IF_ADDR_UNLOCK(ifp);
  			goto out_locked;
 +		}
  		if (nsrc > 0) {
  			if (!ratecheck(&inm->in6m_lastgsrtv,
  			    &V_mld_gsrdelay)) {
  				CTR1(KTR_MLD, "%s: GS query throttled.",
  				    __func__);
 +				IF_ADDR_UNLOCK(ifp);
  				goto out_locked;
  			}
  		}
 @@ -961,10 +964,10 @@ mld_v2_input_query(struct ifnet *ifp, co
  
  		/* XXX Clear embedded scope ID as userland won't expect it. */
  		in6_clearscope(&mld->mld_addr);
 +		IF_ADDR_UNLOCK(ifp);
  	}
  
  out_locked:
 -	IF_ADDR_UNLOCK(ifp);
  	MLD_UNLOCK();
  	IN6_MULTI_UNLOCK();
  
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"