svn commit: r356240 - head/sys/netinet

Kubilay Kocak koobs at FreeBSD.org
Wed Jan 1 02:37:51 UTC 2020


On 1/01/2020 5:58 am, Alexander Motin wrote:
> Author: mav
> Date: Tue Dec 31 18:58:29 2019
> New Revision: 356240
> URL: https://svnweb.freebsd.org/changeset/base/356240
> 
> Log:
>    Relax locking of carp_forus().
>    
>    This fixes deadlock between CARP and bridge.  Bridge calls this function
>    taking CARP lock while holding bridge lock.  Same time CARP tries to send
>    its announcements via the bridge while holding CARP lock.
>    
>    Use of CARP_LOCK() here does not solve anything, since sc_addr is constant
>    while race on sc_state is harmless and use of the lock does not close it.
>    
>    Reviewed by:	glebius
>    MFC after:	2 weeks
>    Sponsored by:	iXsystems, Inc.
> 
> Modified:
>    head/sys/netinet/ip_carp.c
> 
> Modified: head/sys/netinet/ip_carp.c
> ==============================================================================
> --- head/sys/netinet/ip_carp.c	Tue Dec 31 18:28:25 2019	(r356239)
> +++ head/sys/netinet/ip_carp.c	Tue Dec 31 18:58:29 2019	(r356240)
> @@ -1230,14 +1230,15 @@ carp_forus(struct ifnet *ifp, u_char *dhost)
>   
>   	CIF_LOCK(ifp->if_carp);
>   	IFNET_FOREACH_CARP(ifp, sc) {
> -		CARP_LOCK(sc);
> +		/*
> +		 * CARP_LOCK() is not here, since would protect nothing, but
> +		 * cause deadlock with if_bridge, calling this under its lock.
> +		 */
>   		if (sc->sc_state == MASTER && !bcmp(dhost, LLADDR(&sc->sc_addr),
>   		    ETHER_ADDR_LEN)) {
> -			CARP_UNLOCK(sc);
>   			CIF_UNLOCK(ifp->if_carp);
>   			return (1);
>   		}
> -		CARP_UNLOCK(sc);
>   	}
>   	CIF_UNLOCK(ifp->if_carp);
>   
> _______________________________________________
> svn-src-head at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscribe at freebsd.org"
> 

Hi Alexander,

Is this a only-head-impacted fix, or does the issue impact stable/12,11 
too, warranting MFC ?


More information about the svn-src-all mailing list