svn commit: r267273 - projects/sendfile/sys/kern
Gleb Smirnoff
glebius at FreeBSD.org
Mon Jun 9 14:29:55 UTC 2014
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,
More information about the svn-src-projects
mailing list