Hi,
I have two more socket splicing fixes.
When a process reads from a spliced socket that already got an
end-of-file but still has data in the receive buffer, soreceive()
should block until all data has been moved. Note that (so->so_rcv.sb_cc
== 0) can only be false, if splicing is active. Otherwise it would
panic a few lines above.
To make kqueue work with socket splicing, it has to report spliced
sockets as non-readable.
ok?
bluhm
Index: kern/uipc_socket.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.87
diff -u -p -r1.87 uipc_socket.c
--- kern/uipc_socket.c 12 Mar 2011 18:31:41 -0000 1.87
+++ kern/uipc_socket.c 12 Mar 2011 22:41:27 -0000
@@ -650,7 +650,7 @@ restart:
if (so->so_state & SS_CANTRCVMORE) {
if (m)
goto dontblock;
- else
+ else if (so->so_rcv.sb_cc == 0)
goto release;
}
for (; m; m = m->m_next)
@@ -1633,6 +1637,10 @@ filt_soread(struct knote *kn, long hint)
struct socket *so = (struct socket *)kn->kn_fp->f_data;
kn->kn_data = so->so_rcv.sb_cc;
+#ifdef SOCKET_SPLICE
+ if (so->so_splice)
+ return (0);
+#endif /* SOCKET_SPLICE */
if (so->so_state & SS_CANTRCVMORE) {
kn->kn_flags |= EV_EOF;
kn->kn_fflags = so->so_error;