Hi,

I have seen a hang in my socket splicing test on loopback with large
mbufs and reduced buffer size.  If the send buffer size is less
than the size of a single mbuf, it will never fit.  So if the send
buffer is empty, split the large mbuf and move only a part.

ok?

bluhm

Index: kern/uipc_socket.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.164
diff -u -p -r1.164 uipc_socket.c
--- kern/uipc_socket.c  14 Nov 2016 08:45:30 -0000      1.164
+++ kern/uipc_socket.c  16 Nov 2016 19:01:35 -0000
@@ -1365,8 +1365,16 @@ somove(struct socket *so, int wait)
                            "m_type %d", so, so->so_type, *mp, (*mp)->m_type);
 #endif
                if ((*mp)->m_len > size) {
-                       if (!maxreached || (*mp = m_copym(
-                           so->so_rcv.sb_mb, 0, size, wait)) == NULL) {
+                       /*
+                        * Move only a partial mbuf at maximum splice lenght or
+                        * if the drain buffer is too small for this large mbuf.
+                        */
+                       if (!maxreached && so->so_snd.sb_datacc > 0) {
+                               len -= size;
+                               break;
+                       }
+                       *mp = m_copym(so->so_rcv.sb_mb, 0, size, wait);
+                       if (*mp == NULL) {
                                len -= size;
                                break;
                        }

Reply via email to