Subject: Re: Add "last record" and "last mbuf" pointers to sockbuf
To: None <thorpej@wasabisystems.com>
From: YAMAMOTO Takashi <yamt@mwd.biglobe.ne.jp>
List: tech-kern
Date: 07/03/2002 18:30:58
----Next_Part(Wed_Jul__3_18:30:58_2002_619)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

From: Jason R Thorpe <thorpej@wasabisystems.com>
Subject: Re: Add "last record" and "last mbuf" pointers to sockbuf
Date: Tue, 2 Jul 2002 21:00:43 -0700
> On Wed, Jul 03, 2002 at 05:14:46AM +0900, YAMAMOTO Takashi wrote:
> 
>  > why not if you want people to debug it? :-)
> 
> Ok, you asked for it :-)

:-)

> It is possible that my assertion checks are wrong, but I really need
> a fresh set of eyes to look at this :-)

i made a patch. (attached)
both tcp and udp seems to work with it.

---
YAMAMOTO Takashi<yamt@mwd.biglobe.ne.jp>

----Next_Part(Wed_Jul__3_18:30:58_2002_619)--
Content-Type: Text/Plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline; filename="mbtail.diff"

--- bak/uipc_socket.c	Wed Jul  3 13:40:41 2002
+++ uipc_socket.c	Wed Jul  3 18:07:00 2002
@@ -894,6 +894,8 @@
 			error = EWOULDBLOCK;
 			goto release;
 		}
+		SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 1");
+		SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 1");
 		sbunlock(&so->so_rcv);
 		error = sbwait(&so->so_rcv);
 		splx(s);
@@ -931,12 +933,10 @@
 			if (paddr) {
 				*paddr = m;
 				so->so_rcv.sb_mb = m->m_next;
-				SB_UPDATE_TAIL(&so->so_rcv);
 				m->m_next = 0;
 				m = so->so_rcv.sb_mb;
 			} else {
 				MFREE(m, so->so_rcv.sb_mb);
-				SB_UPDATE_TAIL(&so->so_rcv);
 				m = so->so_rcv.sb_mb;
 			}
 		}
@@ -956,12 +956,10 @@
 					error = (*pr->pr_domain->dom_externalize)(m);
 				*controlp = m;
 				so->so_rcv.sb_mb = m->m_next;
-				SB_UPDATE_TAIL(&so->so_rcv);
 				m->m_next = 0;
 				m = so->so_rcv.sb_mb;
 			} else {
 				MFREE(m, so->so_rcv.sb_mb);
-				SB_UPDATE_TAIL(&so->so_rcv);
 				m = so->so_rcv.sb_mb;
 			}
 		}
@@ -984,6 +982,13 @@
 		if (type == MT_OOBDATA)
 			flags |= MSG_OOB;
 	}
+	else {
+		if ((flags & MSG_PEEK) == 0) {
+			KASSERT(so->so_rcv.sb_mb == m);
+			so->so_rcv.sb_mb = nextrecord;
+			SB_UPDATE_TAIL(&so->so_rcv);
+		}
+	}
 
 	/*
 	 * If nextrecord == NULL (this is a single chain), then
@@ -1024,6 +1029,8 @@
 		 * block interrupts again.
 		 */
 		if (mp == 0) {
+			SBLASTRECORDCHK(&so->so_rcv, "soreceive uiomove");
+			SBLASTMBUFCHK(&so->so_rcv, "soreceive uiomove");
 			splx(s);
 			error = uiomove(mtod(m, caddr_t) + moff, (int)len, uio);
 			s = splsoftnet();
@@ -1060,28 +1067,23 @@
 					*mp = m;
 					mp = &m->m_next;
 					so->so_rcv.sb_mb = m = m->m_next;
-//					SB_UPDATE_TAIL(&so->so_rcv);
 					*mp = (struct mbuf *)0;
 				} else {
 					MFREE(m, so->so_rcv.sb_mb);
-//					SB_UPDATE_TAIL(&so->so_rcv);
 					m = so->so_rcv.sb_mb;
 				}
 				/*
 				 * If m != NULL, we also know that
 				 * so->so_rcv.sb_mb != NULL.
 				 */
+				KASSERT(so->so_rcv.sb_mb == m);
 				if (m) {
 					m->m_nextpkt = nextrecord;
 					if (nextrecord == NULL)
 						so->so_rcv.sb_lastrecord = m;
 				} else {
-					/*
-					 * This replaces using SB_UPDATE_TAIL()
-					 * above.
-					 */
-					so->so_rcv.sb_lastrecord = NULL;
-					so->so_rcv.sb_mbtail = NULL;
+					so->so_rcv.sb_mb = nextrecord;
+					SB_UPDATE_TAIL(&so->so_rcv);
 				}
 				SBLASTRECORDCHK(&so->so_rcv, "soreceive 3");
 				SBLASTMBUFCHK(&so->so_rcv, "soreceive 3");
@@ -1140,6 +1142,8 @@
 				    (struct mbuf *)(long)flags,
 				    (struct mbuf *)0,
 				    (struct proc *)0);
+			SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2");
+			SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2");
 			error = sbwait(&so->so_rcv);
 			if (error) {
 				sbunlock(&so->so_rcv);
--- bak/uipc_socket2.c	Wed Jul  3 13:40:41 2002
+++ uipc_socket2.c	Wed Jul  3 18:05:49 2002
@@ -531,16 +531,11 @@
 	KASSERT(m->m_nextpkt == NULL);	/* XXXJRT KDASSERT */
 	KASSERT(sb->sb_mb == sb->sb_lastrecord);
 
-	/*
-	 * If this is the first record in the socket buffer, it's
-	 * also the last record.
-	 */
-	if (sb->sb_mb == NULL)
-		sb->sb_lastrecord = m;
-
 	SBLASTMBUFCHK(sb, __func__);
 
 	sbcompress(sb, m, sb->sb_mbtail);
+
+	sb->sb_lastrecord = sb->sb_mb;
 }
 
 #ifdef SOCKBUF_DEBUG

----Next_Part(Wed_Jul__3_18:30:58_2002_619)----