Author: glebius
Date: Fri Jan  8 19:03:20 2016
New Revision: 293432
URL: https://svnweb.freebsd.org/changeset/base/293432

Log:
  Make it possible for sbappend() to preserve M_NOTREADY on mbufs, just like
  sbappendstream() does. Although, M_NOTREADY may appear only on SOCK_STREAM
  sockets, due to sendfile(2) supporting only the latter, there is a corner
  case of AF_UNIX/SOCK_STREAM socket, that still uses records for the sake
  of control data, albeit being stream socket.
  
  Provide private version of m_clrprotoflags(), which understands PRUS_NOTREADY,
  similar to m_demote().

Modified:
  head/sys/kern/uipc_sockbuf.c
  head/sys/kern/uipc_usrreq.c
  head/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c
  head/sys/ofed/drivers/infiniband/ulp/sdp/sdp_rx.c
  head/sys/sys/sockbuf.h

Modified: head/sys/kern/uipc_sockbuf.c
==============================================================================
--- head/sys/kern/uipc_sockbuf.c        Fri Jan  8 19:02:54 2016        
(r293431)
+++ head/sys/kern/uipc_sockbuf.c        Fri Jan  8 19:03:20 2016        
(r293432)
@@ -69,6 +69,23 @@ static struct mbuf   *sbcut_internal(struc
 static void    sbflush_internal(struct sockbuf *sb);
 
 /*
+ * Our own version of m_clrprotoflags(), that can preserve M_NOTREADY.
+ */
+static void
+sbm_clrprotoflags(struct mbuf *m, int flags)
+{
+       int mask;
+
+       mask = ~M_PROTOFLAGS;
+       if (flags & PRUS_NOTREADY)
+               mask |= M_NOTREADY;
+       while (m) {
+               m->m_flags &= mask;
+               m = m->m_next;
+       }
+}
+
+/*
  * Mark ready "count" mbufs starting with "m".
  */
 int
@@ -569,7 +586,7 @@ sblastmbufchk(struct sockbuf *sb, const 
  * are discarded and mbufs are compacted where possible.
  */
 void
-sbappend_locked(struct sockbuf *sb, struct mbuf *m)
+sbappend_locked(struct sockbuf *sb, struct mbuf *m, int flags)
 {
        struct mbuf *n;
 
@@ -577,7 +594,7 @@ sbappend_locked(struct sockbuf *sb, stru
 
        if (m == 0)
                return;
-       m_clrprotoflags(m);
+       sbm_clrprotoflags(m, flags);
        SBLASTRECORDCHK(sb);
        n = sb->sb_mb;
        if (n) {
@@ -620,11 +637,11 @@ sbappend_locked(struct sockbuf *sb, stru
  * are discarded and mbufs are compacted where possible.
  */
 void
-sbappend(struct sockbuf *sb, struct mbuf *m)
+sbappend(struct sockbuf *sb, struct mbuf *m, int flags)
 {
 
        SOCKBUF_LOCK(sb);
-       sbappend_locked(sb, m);
+       sbappend_locked(sb, m, flags);
        SOCKBUF_UNLOCK(sb);
 }
 

Modified: head/sys/kern/uipc_usrreq.c
==============================================================================
--- head/sys/kern/uipc_usrreq.c Fri Jan  8 19:02:54 2016        (r293431)
+++ head/sys/kern/uipc_usrreq.c Fri Jan  8 19:03:20 2016        (r293432)
@@ -981,7 +981,7 @@ uipc_send(struct socket *so, int flags, 
                                    control))
                                        control = NULL;
                        } else
-                               sbappend_locked(&so2->so_rcv, m);
+                               sbappend_locked(&so2->so_rcv, m, flags);
                        break;
 
                case SOCK_SEQPACKET: {

Modified: head/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c
==============================================================================
--- head/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c     Fri Jan  8 
19:02:54 2016        (r293431)
+++ head/sys/netgraph/bluetooth/socket/ng_btsocket_rfcomm.c     Fri Jan  8 
19:03:20 2016        (r293432)
@@ -972,7 +972,7 @@ ng_btsocket_rfcomm_send(struct socket *s
        }
 
        /* Put the packet on the socket's send queue and wakeup RFCOMM task */
-       sbappend(&pcb->so->so_snd, m);
+       sbappend(&pcb->so->so_snd, m, flags);
        m = NULL;
        
        if (!(pcb->flags & NG_BTSOCKET_RFCOMM_DLC_SENDING)) {
@@ -2396,7 +2396,7 @@ ng_btsocket_rfcomm_receive_uih(ng_btsock
                        error = ENOBUFS;
                } else {
                        /* Append packet to the socket receive queue */
-                       sbappend(&pcb->so->so_rcv, m0);
+                       sbappend(&pcb->so->so_rcv, m0, 0);
                        m0 = NULL;
 
                        sorwakeup(pcb->so);

Modified: head/sys/ofed/drivers/infiniband/ulp/sdp/sdp_rx.c
==============================================================================
--- head/sys/ofed/drivers/infiniband/ulp/sdp/sdp_rx.c   Fri Jan  8 19:02:54 
2016        (r293431)
+++ head/sys/ofed/drivers/infiniband/ulp/sdp/sdp_rx.c   Fri Jan  8 19:03:20 
2016        (r293432)
@@ -242,7 +242,7 @@ sdp_sock_queue_rcv_mb(struct socket *sk,
        SOCKBUF_LOCK(&sk->so_rcv);
        if (unlikely(h->flags & SDP_OOB_PRES))
                sdp_urg(ssk, mb);
-       sbappend_locked(&sk->so_rcv, mb);
+       sbappend_locked(&sk->so_rcv, mb, 0);
        sorwakeup_locked(sk);
        return mb;
 }

Modified: head/sys/sys/sockbuf.h
==============================================================================
--- head/sys/sys/sockbuf.h      Fri Jan  8 19:02:54 2016        (r293431)
+++ head/sys/sys/sockbuf.h      Fri Jan  8 19:03:20 2016        (r293432)
@@ -129,8 +129,8 @@ struct      sockbuf {
 #define        M_BLOCKED       M_PROTO2        /* M_NOTREADY in front of m */
 #define        M_NOTAVAIL      (M_NOTREADY | M_BLOCKED)
 
-void   sbappend(struct sockbuf *sb, struct mbuf *m);
-void   sbappend_locked(struct sockbuf *sb, struct mbuf *m);
+void   sbappend(struct sockbuf *sb, struct mbuf *m, int flags);
+void   sbappend_locked(struct sockbuf *sb, struct mbuf *m, int flags);
 void   sbappendstream(struct sockbuf *sb, struct mbuf *m, int flags);
 void   sbappendstream_locked(struct sockbuf *sb, struct mbuf *m, int flags);
 int    sbappendaddr(struct sockbuf *sb, const struct sockaddr *asa,
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to