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)----