svn commit: r293432 - in head/sys: kern netgraph/bluetooth/socket ofed/drivers/infiniband/ulp/sdp sys

Gleb Smirnoff glebius at FreeBSD.org
Fri Jan 8 19:03:22 UTC 2016


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,


More information about the svn-src-all mailing list