On Mon, Nov 07, 2016 at 09:59 +0100, Martin Pieuchot wrote:
> splnet() was necessary when link state changes were executed from
> hardware interrupt handlers.  In 2013 they got deferred to their own
> task, so KERNEL_LOCK() is what really protect these data structures.
> 
> This is part of my bigger socket lock diff.
> 
> ok?
>

Looks correct to me.  OK mikeb

> Index: kern/uipc_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket.c,v
> retrieving revision 1.163
> diff -u -p -r1.163 uipc_socket.c
> --- kern/uipc_socket.c        6 Oct 2016 19:09:08 -0000       1.163
> +++ kern/uipc_socket.c        7 Nov 2016 08:52:42 -0000
> @@ -1037,12 +1037,10 @@ sorflush(struct socket *so)
>  {
>       struct sockbuf *sb = &so->so_rcv;
>       struct protosw *pr = so->so_proto;
> -     int s;
>       struct sockbuf asb;
>  
>       sb->sb_flags |= SB_NOINTR;
>       (void) sblock(sb, M_WAITOK);
> -     s = splnet();
>       socantrcvmore(so);
>       sbunlock(sb);
>       asb = *sb;
> @@ -1052,7 +1050,6 @@ sorflush(struct socket *so)
>               sb->sb_sel.si_note = asb.sb_sel.si_note;
>               sb->sb_flags = SB_KNOTE;
>       }
> -     splx(s);
>       if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose)
>               (*pr->pr_domain->dom_dispose)(asb.sb_mb);
>       sbrelease(&asb);
> @@ -1876,7 +1873,8 @@ soo_kqfilter(struct file *fp, struct kno
>  {
>       struct socket *so = kn->kn_fp->f_data;
>       struct sockbuf *sb;
> -     int s;
> +
> +     KERNEL_ASSERT_LOCKED();
>  
>       switch (kn->kn_filter) {
>       case EVFILT_READ:
> @@ -1894,10 +1892,9 @@ soo_kqfilter(struct file *fp, struct kno
>               return (EINVAL);
>       }
>  
> -     s = splnet();
>       SLIST_INSERT_HEAD(&sb->sb_sel.si_note, kn, kn_selnext);
>       sb->sb_flags |= SB_KNOTE;
> -     splx(s);
> +
>       return (0);
>  }
>  
> @@ -1905,12 +1902,12 @@ void
>  filt_sordetach(struct knote *kn)
>  {
>       struct socket *so = kn->kn_fp->f_data;
> -     int s = splnet();
> +
> +     KERNEL_ASSERT_LOCKED();
>  
>       SLIST_REMOVE(&so->so_rcv.sb_sel.si_note, kn, knote, kn_selnext);
>       if (SLIST_EMPTY(&so->so_rcv.sb_sel.si_note))
>               so->so_rcv.sb_flags &= ~SB_KNOTE;
> -     splx(s);
>  }
>  
>  int
> @@ -1939,12 +1936,12 @@ void
>  filt_sowdetach(struct knote *kn)
>  {
>       struct socket *so = kn->kn_fp->f_data;
> -     int s = splnet();
> +
> +     KERNEL_ASSERT_LOCKED();
>  
>       SLIST_REMOVE(&so->so_snd.sb_sel.si_note, kn, knote, kn_selnext);
>       if (SLIST_EMPTY(&so->so_snd.sb_sel.si_note))
>               so->so_snd.sb_flags &= ~SB_KNOTE;
> -     splx(s);
>  }
>  
>  int
> 

Reply via email to