Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 22 Dec 2004 08:55:31 +0000 (GMT)
From:      Robert Watson <rwatson@freebsd.org>
To:        Alan Cox <alc@cs.rice.edu>
Cc:        current@freebsd.org
Subject:   Re: panic: sbflush_locked
Message-ID:  <Pine.NEB.3.96L.1041222085240.62809E-100000@fledge.watson.org>
In-Reply-To: <20041220201953.GI1362@cs.rice.edu>

next in thread | previous in thread | raw e-mail | index | archive | help

On Mon, 20 Dec 2004, Alan Cox wrote:

> > I haven't seen this in a very long time, but I've definitely tried to
> > track it down before with zero luck.
> 
> With the attached change, I've had no more crashes. 
> 
> I speculate uipc_send() is missing needed synchronization on so_snd. 
> Robert, can you verify the patch? 

Sorry for the delay in responding to your original post; I'm still
catching up with e-mail from my trip to Bangladesh.  I actually had
similar changes to this in the netperf branch at one point, but think I
removed them due to concerns about lock order.  However, this change is
careful to acquire the send lock before the receive lock, so I think
shouldn't present a problem from that perspective.  Please go ahead and
commit, perhaps with a 2 week MFC time? 

Thanks!

Robert N M Watson             FreeBSD Core Team, TrustedBSD Projects
robert@fledge.watson.org      Principal Research Scientist, McAfee Research



> Index: kern/uipc_usrreq.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/kern/uipc_usrreq.c,v
> retrieving revision 1.143
> diff -u -r1.143 uipc_usrreq.c
> --- kern/uipc_usrreq.c	1 Dec 2004 09:22:26 -0000	1.143
> +++ kern/uipc_usrreq.c	19 Dec 2004 03:22:50 -0000
> @@ -452,7 +452,9 @@
>  			}
>  		}
>  
> +		SOCKBUF_LOCK(&so->so_snd);
>  		if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
> +			SOCKBUF_UNLOCK(&so->so_snd);
>  			error = EPIPE;
>  			break;
>  		}
> @@ -478,6 +480,7 @@
>  		    (so2->so_rcv.sb_cc - unp->unp_conn->unp_cc);
>  		(void)chgsbsize(so->so_cred->cr_uidinfo, &so->so_snd.sb_hiwat,
>  		    newhiwat, RLIM_INFINITY);
> +		SOCKBUF_UNLOCK(&so->so_snd);
>  		unp->unp_conn->unp_cc = so2->so_rcv.sb_cc;
>  		sorwakeup_locked(so2);
>  		m = NULL;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.NEB.3.96L.1041222085240.62809E-100000>