On Wed, Feb 15, 2023 at 08:08:42PM +0100, Alexander Bluhm wrote:
> On Mon, Jan 30, 2023 at 05:03:30PM +0300, Vitaliy Makkoveev wrote:
> > It makes sense to push solock() down to sosetopt() too. For a half cases
> > (*pr_ctloutput)() is just null op, so there is no reason to call it.
> > Also, a lot of things could be done without solock() held.
>
> You do a bunch of things together
> - push solock()
> - move code around
> - return error instead of error =
> - set sb to &so->so_snd or &so->so_rcv
>
> Some of the refactorings make sense, others change the code just
> to be different in my eyes.
>
> Can we discuss theses things in separate diffs?
>
Does this "set sb to &so->so_snd or &so->so_rcv" chunk look reasonable?
Merge sosetopt() SO_SND* with corresponding SO_RCV* code paths. The
difference they have is only the socket buffer.
Index: sys/kern/uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.301
diff -u -p -r1.301 uipc_socket.c
--- sys/kern/uipc_socket.c 10 Feb 2023 14:34:17 -0000 1.301
+++ sys/kern/uipc_socket.c 17 Feb 2023 12:00:54 -0000
@@ -1844,6 +1844,9 @@ sosetopt(struct socket *so, int level, i
case SO_SNDLOWAT:
case SO_RCVLOWAT:
{
+ struct sockbuf *sb = ((optname == SO_SNDBUF ||
+ optname == SO_SNDLOWAT) ?
+ &so->so_snd : &so->so_rcv);
u_long cnt;
if (m == NULL || m->m_len < sizeof (int))
@@ -1852,34 +1855,21 @@ sosetopt(struct socket *so, int level, i
if ((long)cnt <= 0)
cnt = 1;
switch (optname) {
-
case SO_SNDBUF:
- if (so->so_snd.sb_state & SS_CANTSENDMORE)
- return (EINVAL);
- if (sbcheckreserve(cnt, so->so_snd.sb_wat) ||
- sbreserve(so, &so->so_snd, cnt))
- return (ENOBUFS);
- so->so_snd.sb_wat = cnt;
- break;
-
case SO_RCVBUF:
- if (so->so_rcv.sb_state & SS_CANTRCVMORE)
+ if (sb->sb_state & (SS_CANTSENDMORE |
+ SS_CANTRCVMORE))
return (EINVAL);
- if (sbcheckreserve(cnt, so->so_rcv.sb_wat) ||
- sbreserve(so, &so->so_rcv, cnt))
+ if (sbcheckreserve(cnt, sb->sb_wat) ||
+ sbreserve(so, sb, cnt))
return (ENOBUFS);
- so->so_rcv.sb_wat = cnt;
+ sb->sb_wat = cnt;
break;
case SO_SNDLOWAT:
- so->so_snd.sb_lowat =
- (cnt > so->so_snd.sb_hiwat) ?
- so->so_snd.sb_hiwat : cnt;
- break;
case SO_RCVLOWAT:
- so->so_rcv.sb_lowat =
- (cnt > so->so_rcv.sb_hiwat) ?
- so->so_rcv.sb_hiwat : cnt;
+ sb->sb_lowat = (cnt > sb->sb_hiwat) ?
+ sb->sb_hiwat : cnt;
break;
}
break;
@@ -1888,6 +1878,8 @@ sosetopt(struct socket *so, int level, i
case SO_SNDTIMEO:
case SO_RCVTIMEO:
{
+ struct sockbuf *sb = (optname == SO_SNDTIMEO ?
+ &so->so_snd : &so->so_rcv);
struct timeval tv;
uint64_t nsecs;
@@ -1901,15 +1893,9 @@ sosetopt(struct socket *so, int level, i
return (EDOM);
if (nsecs == 0)
nsecs = INFSLP;
- switch (optname) {
- case SO_SNDTIMEO:
- so->so_snd.sb_timeo_nsecs = nsecs;
- break;
- case SO_RCVTIMEO:
- so->so_rcv.sb_timeo_nsecs = nsecs;
- break;
- }
+ sb->sb_timeo_nsecs = nsecs;
+
break;
}