On 28/05/20(Thu) 14:59, Vitaliy Makkoveev wrote:
> socket(2) layer is already protected by solock(). It grabs NET_LOCK()
> for inet{,6}(4) sockets, but all other sockets are still under
> KERNEL_LOCK().
> 
> I guess solock is already placed everythere it's required. Also `struct
> file' is already mp-safe. 
> 
> Diff below introduces rwlock `unp_lock'. It's like NET_LOCK()'s
> `netlock' but for PF_UNIX sockets. This lock protects the whole PF_UNIX
> layer. Vnode layer accessed in "connect" "bind" and "desconnect" cases
> is still under KERNEL_LOCK().
> 
> I'am experimenting with his diff since 19.04.2020 and my test systems,
> include Gnome workstaion are stable, without any issue.

Looks great, more tests are required :)

Your diff has many trailing spaces, could you remove them?  Commonly
used editors or diff programs have a way to highlight them :)

One comment:

> Index: sys/kern/uipc_usrreq.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_usrreq.c,v
> retrieving revision 1.142
> diff -u -p -r1.142 uipc_usrreq.c
> --- sys/kern/uipc_usrreq.c    16 Jul 2019 21:41:37 -0000      1.142
> +++ sys/kern/uipc_usrreq.c    1 May 2020 13:47:11 -0000
> @@ -409,12 +418,17 @@ unp_detach(struct unpcb *unp)
>  {
>       struct vnode *vp;
>  
> +     rw_assert_wrlock(&unp_lock);
> +
>       LIST_REMOVE(unp, unp_link);
>       if (unp->unp_vnode) {
> +             /* this is an unlocked cleaning of `v_socket', but it's safe */
>               unp->unp_vnode->v_socket = NULL;
>               vp = unp->unp_vnode;
>               unp->unp_vnode = NULL;
> +             KERNEL_LOCK();
>               vrele(vp);
> +             KERNEL_UNLOCK();

Why is it safe?  That's what the comment should explain :)  If the code
doesn't take the lock that implies it is not required.  Why it is not
required is not obvious.

Reply via email to