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

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

Log:
  Provide pru_ready method for AF_LOCAL sockets. Like uipc_send(),
  it locates remote part of the socket pair, and issues sbready()
  on it. If the latter returned unblocked data, it wakeups remote
  socket.
  
  In uipc_send() do remote wakeup only if our write provided any
  available data.
  
  Sponsored by:	Netflix
  Sponsored by:	Nginx, Inc.

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

Modified: projects/sendfile/sys/kern/uipc_usrreq.c
==============================================================================
--- projects/sendfile/sys/kern/uipc_usrreq.c	Mon Jun  9 14:27:37 2014	(r267272)
+++ projects/sendfile/sys/kern/uipc_usrreq.c	Mon Jun  9 14:29:55 2014	(r267273)
@@ -997,7 +997,10 @@ uipc_send(struct socket *so, int flags, 
 
 		mbcnt = so2->so_rcv.sb_mbcnt;
 		sbcc = sbavail(&so2->so_rcv);
-		sorwakeup_locked(so2);
+		if (sbcc)
+			sorwakeup_locked(so2);
+		else
+			SOCKBUF_UNLOCK(&so2->so_rcv);
 
 		/*
 		 * The PCB lock on unp2 protects the SB_STOP flag.  Without it,
@@ -1042,6 +1045,35 @@ release:
 }
 
 static int
+uipc_ready(struct socket *so, struct mbuf *m, int count)
+{
+	struct unpcb *unp, *unp2;
+	struct socket *so2;
+	int error;
+
+	unp = sotounpcb(so);
+
+	UNP_LINK_RLOCK();
+	unp2 = unp->unp_conn;
+	UNP_PCB_LOCK(unp2);
+	so2 = unp2->unp_socket;
+
+	SOCKBUF_LOCK(&so2->so_rcv);
+	if (so2->so_rcv.sb_state & SBS_CANTRCVMORE) {
+		SOCKBUF_UNLOCK(&so2->so_rcv);
+		error = ENOTCONN;
+	} else if ((error = sbready(&so2->so_rcv, m, count)) == 0)
+		sorwakeup_locked(so2);
+	else
+		SOCKBUF_UNLOCK(&so2->so_rcv);
+
+	UNP_PCB_UNLOCK(unp2);
+	UNP_LINK_RUNLOCK();
+
+	return (error);
+}
+
+static int
 uipc_sense(struct socket *so, struct stat *sb)
 {
 	struct unpcb *unp;
@@ -1111,6 +1143,7 @@ static struct pr_usrreqs uipc_usrreqs_dg
 	.pru_peeraddr =		uipc_peeraddr,
 	.pru_rcvd =		uipc_rcvd,
 	.pru_send =		uipc_send,
+	.pru_ready =		uipc_ready,
 	.pru_sense =		uipc_sense,
 	.pru_shutdown =		uipc_shutdown,
 	.pru_sockaddr =		uipc_sockaddr,
@@ -1133,6 +1166,7 @@ static struct pr_usrreqs uipc_usrreqs_se
 	.pru_peeraddr =		uipc_peeraddr,
 	.pru_rcvd =		uipc_rcvd,
 	.pru_send =		uipc_send,
+	.pru_ready =		uipc_ready,
 	.pru_sense =		uipc_sense,
 	.pru_shutdown =		uipc_shutdown,
 	.pru_sockaddr =		uipc_sockaddr,
@@ -1155,6 +1189,7 @@ static struct pr_usrreqs uipc_usrreqs_st
 	.pru_peeraddr =		uipc_peeraddr,
 	.pru_rcvd =		uipc_rcvd,
 	.pru_send =		uipc_send,
+	.pru_ready =		uipc_ready,
 	.pru_sense =		uipc_sense,
 	.pru_shutdown =		uipc_shutdown,
 	.pru_sockaddr =		uipc_sockaddr,



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