On 07/02/18(Wed) 15:45, Martin Pieuchot wrote:
> I'd like to push the lock *inside* soconnect2().  This is mostly a noop
> as only AF_LOCAL support PRU_CONNECT2.  But having less solock/sounlock
> dances in kern/uipc_syscalls.c helps mentally :)
> 
> ok?

Anyone?

> Index: kern/uipc_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket.c,v
> retrieving revision 1.215
> diff -u -p -r1.215 uipc_socket.c
> --- kern/uipc_socket.c        10 Jan 2018 18:14:34 -0000      1.215
> +++ kern/uipc_socket.c        7 Feb 2018 14:40:14 -0000
> @@ -337,11 +337,12 @@ soconnect(struct socket *so, struct mbuf
>  int
>  soconnect2(struct socket *so1, struct socket *so2)
>  {
> -     int error;
> +     int s, error;
>  
> -     soassertlocked(so1);
> +     s = solock(so1);
>       error = (*so1->so_proto->pr_usrreq)(so1, PRU_CONNECT2, NULL,
>           (struct mbuf *)so2, NULL, curproc);
> +     sounlock(s);
>       return (error);
>  }
>  
> Index: kern/uipc_syscalls.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v
> retrieving revision 1.162
> diff -u -p -r1.162 uipc_syscalls.c
> --- kern/uipc_syscalls.c      9 Jan 2018 15:14:23 -0000       1.162
> +++ kern/uipc_syscalls.c      7 Feb 2018 14:39:23 -0000
> @@ -447,7 +447,7 @@ sys_socketpair(struct proc *p, void *v, 
>       struct filedesc *fdp = p->p_fd;
>       struct file *fp1, *fp2;
>       struct socket *so1, *so2;
> -     int s, type, cloexec, nonblock, fflag, error, sv[2];
> +     int type, cloexec, nonblock, fflag, error, sv[2];
>  
>       type  = SCARG(uap, type) & ~(SOCK_CLOEXEC | SOCK_NONBLOCK);
>       cloexec = (SCARG(uap, type) & SOCK_CLOEXEC) ? UF_EXCLOSE : 0;
> @@ -461,9 +461,7 @@ sys_socketpair(struct proc *p, void *v, 
>       if (error)
>               goto free1;
>  
> -     s = solock(so1);
>       error = soconnect2(so1, so2);
> -     sounlock(s);
>       if (error != 0)
>               goto free2;
>  
> @@ -471,9 +469,7 @@ sys_socketpair(struct proc *p, void *v, 
>               /*
>                * Datagram socket connection is asymmetric.
>                */
> -             s = solock(so2);
>               error = soconnect2(so2, so1);
> -             sounlock(s);
>               if (error != 0)
>                       goto free2;
>       }
> Index: miscfs/fifofs/fifo_vnops.c
> ===================================================================
> RCS file: /cvs/src/sys/miscfs/fifofs/fifo_vnops.c,v
> retrieving revision 1.62
> diff -u -p -r1.62 fifo_vnops.c
> --- miscfs/fifofs/fifo_vnops.c        2 Jan 2018 06:38:45 -0000       1.62
> +++ miscfs/fifofs/fifo_vnops.c        7 Feb 2018 14:38:38 -0000
> @@ -143,14 +143,7 @@ fifo_open(void *v)
>                       return (error);
>               }
>               fip->fi_writesock = wso;
> -             /*
> -              * XXXSMP
> -              * We only lock `wso' because AF_LOCAL sockets are
> -              * still relying on the KERNEL_LOCK().
> -              */
> -             s = solock(wso);
>               if ((error = soconnect2(wso, rso)) != 0) {
> -                     sounlock(s);
>                       (void)soclose(wso);
>                       (void)soclose(rso);
>                       free(fip, M_VNODE, sizeof *fip);
> @@ -158,6 +151,7 @@ fifo_open(void *v)
>                       return (error);
>               }
>               fip->fi_readers = fip->fi_writers = 0;
> +             s = solock(wso);
>               wso->so_state |= SS_CANTSENDMORE;
>               wso->so_snd.sb_lowat = PIPE_BUF;
>       } else {
> 

Reply via email to