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>