On Tue, Jan 31, 2023 at 06:00:45PM +0000, Visa Hankala wrote: > On Tue, Jan 31, 2023 at 12:44:47PM +0300, Vitaliy Makkoveev wrote: > > Since we have soalloc() to do common socket initialization, move the > > rest within. I mostly need to do this because standalone socket's buffer > > locking require to introduce another klistops data for buffers and there > > is no reason to add more copypaste to sonewconn(). > > > > Also this makes `socket_klistops' private to kern/uipc_socket.c > > > > @@ -226,9 +225,6 @@ sonewconn(struct socket *head, int conns > > so->so_rcv.sb_lowat = head->so_rcv.sb_lowat; > > so->so_rcv.sb_timeo_nsecs = head->so_rcv.sb_timeo_nsecs; > > > > - klist_init(&so->so_rcv.sb_klist, &socket_klistops, so); > > - klist_init(&so->so_snd.sb_klist, &socket_klistops, so); > > - sigio_init(&so->so_sigio); > > sigio_copy(&so->so_sigio, &head->so_sigio); > > With this change, something should call klist_free() and sigio_free() > for 'so' if soreserve() fails in sonewconn(). >
klist_init() and sigio_init() alloc nothing, but for consistency reason they shold. I like to do this in the combined error path for soneconn() and pru_attach(). Index: sys/kern/uipc_socket.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_socket.c,v retrieving revision 1.299 diff -u -p -r1.299 uipc_socket.c --- sys/kern/uipc_socket.c 27 Jan 2023 21:01:59 -0000 1.299 +++ sys/kern/uipc_socket.c 31 Jan 2023 18:44:57 -0000 @@ -112,6 +112,16 @@ const struct filterops soexcept_filtops .f_process = filt_soprocess, }; +void klist_soassertlk(void *); +int klist_solock(void *); +void klist_sounlock(void *, int); + +const struct klistops socket_klistops = { + .klo_assertlk = klist_soassertlk, + .klo_lock = klist_solock, + .klo_unlock = klist_sounlock, +}; + #ifndef SOMINCONN #define SOMINCONN 80 #endif /* SOMINCONN */ @@ -148,6 +158,11 @@ soalloc(int wait) return (NULL); rw_init_flags(&so->so_lock, "solock", RWL_DUPOK); refcnt_init(&so->so_refcnt); + klist_init(&so->so_rcv.sb_klist, &socket_klistops, so); + klist_init(&so->so_snd.sb_klist, &socket_klistops, so); + sigio_init(&so->so_sigio); + TAILQ_INIT(&so->so_q0); + TAILQ_INIT(&so->so_q); return (so); } @@ -176,11 +191,6 @@ socreate(int dom, struct socket **aso, i if (prp->pr_type != type) return (EPROTOTYPE); so = soalloc(M_WAIT); - klist_init(&so->so_rcv.sb_klist, &socket_klistops, so); - klist_init(&so->so_snd.sb_klist, &socket_klistops, so); - sigio_init(&so->so_sigio); - TAILQ_INIT(&so->so_q0); - TAILQ_INIT(&so->so_q); so->so_type = type; if (suser(p) == 0) so->so_state = SS_PRIV; @@ -2333,12 +2343,6 @@ klist_sounlock(void *arg, int ls) sounlock(so); } - -const struct klistops socket_klistops = { - .klo_assertlk = klist_soassertlk, - .klo_lock = klist_solock, - .klo_unlock = klist_sounlock, -}; #ifdef DDB void Index: sys/kern/uipc_socket2.c =================================================================== RCS file: /cvs/src/sys/kern/uipc_socket2.c,v retrieving revision 1.134 diff -u -p -r1.134 uipc_socket2.c --- sys/kern/uipc_socket2.c 27 Jan 2023 18:46:34 -0000 1.134 +++ sys/kern/uipc_socket2.c 31 Jan 2023 18:44:57 -0000 @@ -41,7 +41,6 @@ #include <sys/socket.h> #include <sys/socketvar.h> #include <sys/signalvar.h> -#include <sys/event.h> #include <sys/pool.h> /* @@ -213,12 +212,8 @@ sonewconn(struct socket *head, int conns /* * Inherit watermarks but those may get clamped in low mem situations. */ - if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat)) { - if (persocket) - sounlock(so); - pool_put(&socket_pool, so); - return (NULL); - } + if (soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat)) + goto error; so->so_snd.sb_wat = head->so_snd.sb_wat; so->so_snd.sb_lowat = head->so_snd.sb_lowat; so->so_snd.sb_timeo_nsecs = head->so_snd.sb_timeo_nsecs; @@ -226,9 +221,6 @@ sonewconn(struct socket *head, int conns so->so_rcv.sb_lowat = head->so_rcv.sb_lowat; so->so_rcv.sb_timeo_nsecs = head->so_rcv.sb_timeo_nsecs; - klist_init(&so->so_rcv.sb_klist, &socket_klistops, so); - klist_init(&so->so_snd.sb_klist, &socket_klistops, so); - sigio_init(&so->so_sigio); sigio_copy(&so->so_sigio, &head->so_sigio); soqinsque(head, so, 0); @@ -259,13 +251,7 @@ sonewconn(struct socket *head, int conns if (error) { soqremque(so, 0); - if (persocket) - sounlock(so); - sigio_free(&so->so_sigio); - klist_free(&so->so_rcv.sb_klist); - klist_free(&so->so_snd.sb_klist); - pool_put(&socket_pool, so); - return (NULL); + goto error; } if (connstatus) { @@ -280,6 +266,16 @@ sonewconn(struct socket *head, int conns sounlock(so); return (so); + +error: + if (persocket) + sounlock(so); + sigio_free(&so->so_sigio); + klist_free(&so->so_rcv.sb_klist); + klist_free(&so->so_snd.sb_klist); + pool_put(&socket_pool, so); + + return (NULL); } void Index: sys/sys/event.h =================================================================== RCS file: /cvs/src/sys/sys/event.h,v retrieving revision 1.67 diff -u -p -r1.67 event.h --- sys/sys/event.h 31 Mar 2022 01:41:22 -0000 1.67 +++ sys/sys/event.h 31 Jan 2023 18:44:57 -0000 @@ -286,7 +286,6 @@ struct timespec; extern const struct filterops sig_filtops; extern const struct filterops dead_filtops; -extern const struct klistops socket_klistops; extern void kqpoll_init(unsigned int); extern void kqpoll_done(unsigned int);