Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 9 Jun 2014 14:24:42 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r267271 - projects/sendfile/sys/kern
Message-ID:  <201406091424.s59EOg1V039696@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Mon Jun  9 14:24:41 2014
New Revision: 267271
URL: http://svnweb.freebsd.org/changeset/base/267271

Log:
  - Relax assertion in sb_shift_nrdy(), there is corner case when it
    is not held.
  - Make sbready() capable to work not only on send buffer, but on
    receive buffers, as well. Caller should lock the buffer and
    check that it can SEND/RECVMORE.
  
  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 Jun  9 14:18:24 2014	(r267270)
+++ projects/sendfile/sys/kern/uipc_sockbuf.c	Mon Jun  9 14:24:41 2014	(r267271)
@@ -72,7 +72,9 @@ static void
 sb_shift_nrdy(struct sockbuf *sb, struct mbuf *m)
 {
 
+#if 0	/* XXX: not yet: soclose() call path comes here w/o lock. */
 	SOCKBUF_LOCK_ASSERT(sb);
+#endif
 	KASSERT(m->m_flags & M_NOTREADY, ("%s: m %p !M_NOTREADY", __func__, m));
 
 	m = m->m_next;
@@ -90,12 +92,7 @@ sbready(struct sockbuf *sb, struct mbuf 
 {
 	u_int blocker;
 
-	SOCKBUF_LOCK(sb);
-
-	if (sb->sb_state & SBS_CANTSENDMORE) {
-		SOCKBUF_UNLOCK(sb);
-		return (ENOTCONN);
-	}
+	SOCKBUF_LOCK_ASSERT(sb);
 
 	KASSERT(sb->sb_fnrdy != NULL, ("%s: sb %p NULL fnrdy", __func__, sb));
 
@@ -109,10 +106,8 @@ sbready(struct sockbuf *sb, struct mbuf 
 			sb->sb_acc += m->m_len;
 	}
 
-	if (!blocker) {
-		SOCKBUF_UNLOCK(sb);
-		return (EWOULDBLOCK);
-	}
+	if (!blocker)
+		return (EINPROGRESS);
 
 	/* This one was blocking all the queue. */
 	for (; m && (m->m_flags & M_NOTREADY) == 0; m = m->m_next) {
@@ -124,8 +119,6 @@ sbready(struct sockbuf *sb, struct mbuf 
 
 	sb->sb_fnrdy = m;
 
-	SOCKBUF_UNLOCK(sb);
-
 	return (0);
 }
 



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