Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 27 Jan 2014 07:59:04 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r261206 - projects/sendfile/sys/kern
Message-ID:  <201401270759.s0R7x4kf088116@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Mon Jan 27 07:59:04 2014
New Revision: 261206
URL: http://svnweb.freebsd.org/changeset/base/261206

Log:
  Fixes to socket buffer readiness routines:
  
  - Assert buffer lock in sb_shift_nrdy().
  - Handle race with socket shutdown in sbready().
  - Fix sb->sb_acc counting logic error in sbready().
  
  Sponsored by:	Netflix
  Sponsored by:	Nginx, Inc.

Modified:
  projects/sendfile/sys/kern/uipc_sockbuf.c

Modified: projects/sendfile/sys/kern/uipc_sockbuf.c
==============================================================================
--- projects/sendfile/sys/kern/uipc_sockbuf.c	Mon Jan 27 07:53:10 2014	(r261205)
+++ projects/sendfile/sys/kern/uipc_sockbuf.c	Mon Jan 27 07:59:04 2014	(r261206)
@@ -72,6 +72,7 @@ static void
 sb_shift_nrdy(struct sockbuf *sb, struct mbuf *m)
 {
 
+	SOCKBUF_LOCK_ASSERT(sb);
 	KASSERT(m->m_flags & M_NOTREADY, ("%s: m %p !M_NOTREADY", __func__, m));
 
 	m = m->m_next;
@@ -91,6 +92,11 @@ sbready(struct sockbuf *sb, struct mbuf 
 
 	SOCKBUF_LOCK(sb);
 
+	if (sb->sb_state & SBS_CANTSENDMORE) {
+		SOCKBUF_UNLOCK(sb);
+		return (ENOTCONN);
+	}
+
 	KASSERT(sb->sb_fnrdy != NULL, ("%s: sb %p NULL fnrdy", __func__, sb));
 
 	blocker = (sb->sb_fnrdy == m) ? M_BLOCKED : 0;
@@ -99,7 +105,8 @@ sbready(struct sockbuf *sb, struct mbuf 
 		KASSERT(m->m_flags & M_NOTREADY,
 		    ("%s: m %p !M_NOTREADY", __func__, m));
 		m->m_flags &= ~(M_NOTREADY | blocker);
-		sb->sb_acc += m->m_len;
+		if (blocker)
+			sb->sb_acc += m->m_len;
 	}
 
 	if (!blocker) {



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