Re: Pass "socket *" to sballoc/sbfree & co

2021-07-25 Thread Martin Pieuchot
On 24/07/21(Sat) 11:43, Martin Pieuchot wrote:
> Diff below adds an extra argument, a pointer to the socket corresponding
> to the buffer given to: sballoc(), sbfree(), sbcompress(), sbcheck() and
> sbdroprecord().
> 
> This pointer will be used to assert for or grab a per-socket lock.
> 
> There is no functional change in this diff.  Its goal is to simplify the
> review (and possible revert) of the change introducing `so_mtx' [0].
> 
> Note that this diff includes the removal of sbinsertoob() sent
> previously.

Updated diff now that sbinsertoob() has been removed.

> [0] https://marc.info/?l=openbsd-tech=162685565421248=2

ok?

Index: kern/uipc_socket.c
===
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.263
diff -u -p -r1.263 uipc_socket.c
--- kern/uipc_socket.c  28 May 2021 16:24:53 -  1.263
+++ kern/uipc_socket.c  25 Jul 2021 14:14:28 -
@@ -860,7 +860,7 @@ dontblock:
*paddr = m_copym(m, 0, m->m_len, M_NOWAIT);
m = m->m_next;
} else {
-   sbfree(>so_rcv, m);
+   sbfree(so, >so_rcv, m);
if (paddr) {
*paddr = m;
so->so_rcv.sb_mb = m->m_next;
@@ -884,7 +884,7 @@ dontblock:
*controlp = m_copym(m, 0, m->m_len, M_NOWAIT);
m = m->m_next;
} else {
-   sbfree(>so_rcv, m);
+   sbfree(so, >so_rcv, m);
so->so_rcv.sb_mb = m->m_next;
m->m_nextpkt = m->m_next = NULL;
cm = m;
@@ -984,7 +984,7 @@ dontblock:
orig_resid = 0;
} else {
nextrecord = m->m_nextpkt;
-   sbfree(>so_rcv, m);
+   sbfree(so, >so_rcv, m);
if (mp) {
*mp = m;
mp = >m_next;
@@ -1065,7 +1065,7 @@ dontblock:
if (m && pr->pr_flags & PR_ATOMIC) {
flags |= MSG_TRUNC;
if ((flags & MSG_PEEK) == 0)
-   (void) sbdroprecord(>so_rcv);
+   (void) sbdroprecord(so, >so_rcv);
}
if ((flags & MSG_PEEK) == 0) {
if (m == NULL) {
@@ -1452,7 +1452,7 @@ somove(struct socket *so, int wait)
while (m && m->m_type == MT_CONTROL)
m = m->m_next;
if (m == NULL) {
-   sbdroprecord(>so_rcv);
+   sbdroprecord(so, >so_rcv);
if (so->so_proto->pr_flags & PR_WANTRCVD && so->so_pcb)
(so->so_proto->pr_usrreq)(so, PRU_RCVD, NULL,
NULL, NULL, NULL);
@@ -1492,7 +1492,7 @@ somove(struct socket *so, int wait)
 * that the whole first record can be processed.
 */
m = so->so_rcv.sb_mb;
-   sbfree(>so_rcv, m);
+   sbfree(so, >so_rcv, m);
so->so_rcv.sb_mb = m_free(m);
sbsync(>so_rcv, nextrecord);
}
@@ -1502,7 +1502,7 @@ somove(struct socket *so, int wait)
 */
m = so->so_rcv.sb_mb;
while (m && m->m_type == MT_CONTROL) {
-   sbfree(>so_rcv, m);
+   sbfree(so, >so_rcv, m);
so->so_rcv.sb_mb = m_free(m);
m = so->so_rcv.sb_mb;
sbsync(>so_rcv, nextrecord);
@@ -1541,7 +1541,7 @@ somove(struct socket *so, int wait)
so->so_rcv.sb_datacc -= size;
} else {
*mp = so->so_rcv.sb_mb;
-   sbfree(>so_rcv, *mp);
+   sbfree(so, >so_rcv, *mp);
so->so_rcv.sb_mb = (*mp)->m_next;
sbsync(>so_rcv, nextrecord);
}
@@ -1550,7 +1550,7 @@ somove(struct socket *so, int wait)
 
SBLASTRECORDCHK(>so_rcv, "somove 3");
SBLASTMBUFCHK(>so_rcv, "somove 3");
-   SBCHECK(>so_rcv);
+   SBCHECK(so, >so_rcv);
if (m == NULL)
goto release;
m->m_nextpkt = NULL;
Index: kern/uipc_socket2.c
===
RCS file: /cvs/src/sys/kern/uipc_socket2.c,v
retrieving revision 1.112
diff -u -p -r1.112 uipc_socket2.c
--- kern/uipc_socket2.c 25 Jul 2021 14:13:47 -  1.112
+++ kern/uipc_socket2.c 25 Jul 2021 14:14:28 -
@@ -654,7 +654,7 @@ sbappend(struct socket *so, struct sockb
 */
sb->sb_lastrecord = m;
}
-   sbcompress(sb, m, n);
+   sbcompress(so, sb, m, n);
SBLASTRECORDCHK(sb, "sbappend 2");
 }
 
@@ -673,7 +673,7 @@ sbappendstream(struct socket *so, struct
 
   

Pass "socket *" to sballoc/sbfree & co

2021-07-24 Thread Martin Pieuchot
Diff below adds an extra argument, a pointer to the socket corresponding
to the buffer given to: sballoc(), sbfree(), sbcompress(), sbcheck() and
sbdroprecord().

This pointer will be used to assert for or grab a per-socket lock.

There is no functional change in this diff.  Its goal is to simplify the
review (and possible revert) of the change introducing `so_mtx' [0].

Note that this diff includes the removal of sbinsertoob() sent
previously.

ok?

[0] https://marc.info/?l=openbsd-tech=162685565421248=2

Index: kern/uipc_socket.c
===
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.263
diff -u -p -r1.263 uipc_socket.c
--- kern/uipc_socket.c  28 May 2021 16:24:53 -  1.263
+++ kern/uipc_socket.c  24 Jul 2021 09:32:10 -
@@ -860,7 +860,7 @@ dontblock:
*paddr = m_copym(m, 0, m->m_len, M_NOWAIT);
m = m->m_next;
} else {
-   sbfree(>so_rcv, m);
+   sbfree(so, >so_rcv, m);
if (paddr) {
*paddr = m;
so->so_rcv.sb_mb = m->m_next;
@@ -884,7 +884,7 @@ dontblock:
*controlp = m_copym(m, 0, m->m_len, M_NOWAIT);
m = m->m_next;
} else {
-   sbfree(>so_rcv, m);
+   sbfree(so, >so_rcv, m);
so->so_rcv.sb_mb = m->m_next;
m->m_nextpkt = m->m_next = NULL;
cm = m;
@@ -984,7 +984,7 @@ dontblock:
orig_resid = 0;
} else {
nextrecord = m->m_nextpkt;
-   sbfree(>so_rcv, m);
+   sbfree(so, >so_rcv, m);
if (mp) {
*mp = m;
mp = >m_next;
@@ -1065,7 +1065,7 @@ dontblock:
if (m && pr->pr_flags & PR_ATOMIC) {
flags |= MSG_TRUNC;
if ((flags & MSG_PEEK) == 0)
-   (void) sbdroprecord(>so_rcv);
+   (void) sbdroprecord(so, >so_rcv);
}
if ((flags & MSG_PEEK) == 0) {
if (m == NULL) {
@@ -1452,7 +1452,7 @@ somove(struct socket *so, int wait)
while (m && m->m_type == MT_CONTROL)
m = m->m_next;
if (m == NULL) {
-   sbdroprecord(>so_rcv);
+   sbdroprecord(so, >so_rcv);
if (so->so_proto->pr_flags & PR_WANTRCVD && so->so_pcb)
(so->so_proto->pr_usrreq)(so, PRU_RCVD, NULL,
NULL, NULL, NULL);
@@ -1492,7 +1492,7 @@ somove(struct socket *so, int wait)
 * that the whole first record can be processed.
 */
m = so->so_rcv.sb_mb;
-   sbfree(>so_rcv, m);
+   sbfree(so, >so_rcv, m);
so->so_rcv.sb_mb = m_free(m);
sbsync(>so_rcv, nextrecord);
}
@@ -1502,7 +1502,7 @@ somove(struct socket *so, int wait)
 */
m = so->so_rcv.sb_mb;
while (m && m->m_type == MT_CONTROL) {
-   sbfree(>so_rcv, m);
+   sbfree(so, >so_rcv, m);
so->so_rcv.sb_mb = m_free(m);
m = so->so_rcv.sb_mb;
sbsync(>so_rcv, nextrecord);
@@ -1541,7 +1541,7 @@ somove(struct socket *so, int wait)
so->so_rcv.sb_datacc -= size;
} else {
*mp = so->so_rcv.sb_mb;
-   sbfree(>so_rcv, *mp);
+   sbfree(so, >so_rcv, *mp);
so->so_rcv.sb_mb = (*mp)->m_next;
sbsync(>so_rcv, nextrecord);
}
@@ -1550,7 +1550,7 @@ somove(struct socket *so, int wait)
 
SBLASTRECORDCHK(>so_rcv, "somove 3");
SBLASTMBUFCHK(>so_rcv, "somove 3");
-   SBCHECK(>so_rcv);
+   SBCHECK(so, >so_rcv);
if (m == NULL)
goto release;
m->m_nextpkt = NULL;
Index: kern/uipc_socket2.c
===
RCS file: /cvs/src/sys/kern/uipc_socket2.c,v
retrieving revision 1.111
diff -u -p -r1.111 uipc_socket2.c
--- kern/uipc_socket2.c 7 Jun 2021 09:10:32 -   1.111
+++ kern/uipc_socket2.c 24 Jul 2021 09:34:21 -
@@ -654,7 +654,7 @@ sbappend(struct socket *so, struct sockb
 */
sb->sb_lastrecord = m;
}
-   sbcompress(sb, m, n);
+   sbcompress(so, sb, m, n);
SBLASTRECORDCHK(sb, "sbappend 2");
 }
 
@@ -673,7 +673,7 @@ sbappendstream(struct socket *so, struct
 
SBLASTMBUFCHK(sb, __func__);
 
-   sbcompress(sb, m, sb->sb_mbtail);
+   sbcompress(so, sb, m, sb->sb_mbtail);