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
> 
> 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 09:16:04 -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 09:16:04 -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>
>  
>  /*
> @@ -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().

>  
>       soqinsque(head, so, 0);
> 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 09:16:04 -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);
> 

Reply via email to