On Thu, Dec 07, 2017 at 01:37:15PM +0100, Martin Pieuchot wrote:
> Right, updated diff below.

OK bluhm@

> Index: kern/uipc_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket.c,v
> retrieving revision 1.209
> diff -u -p -r1.209 uipc_socket.c
> --- kern/uipc_socket.c        23 Nov 2017 13:45:46 -0000      1.209
> +++ kern/uipc_socket.c        4 Dec 2017 14:26:24 -0000
> @@ -1054,9 +1054,9 @@ sorflush(struct socket *so)
>       aso.so_rcv = *sb;
>       memset(sb, 0, sizeof (*sb));
>       /* XXX - the memset stomps all over so_rcv */
> -     if (aso.so_rcv.sb_flags & SB_KNOTE) {
> +     if (aso.so_rcv.sb_flagsintr & SB_KNOTE) {
>               sb->sb_sel.si_note = aso.so_rcv.sb_sel.si_note;
> -             sb->sb_flags = SB_KNOTE;
> +             sb->sb_flagsintr = SB_KNOTE;
>       }
>       if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose)
>               (*pr->pr_domain->dom_dispose)(aso.so_rcv.sb_mb);
> @@ -1178,8 +1178,8 @@ sosplice(struct socket *so, int fd, off_
>        * we sleep, the socket buffers are not marked as spliced yet.
>        */
>       if (somove(so, M_WAIT)) {
> -             so->so_rcv.sb_flagsintr |= SB_SPLICE;
> -             sosp->so_snd.sb_flagsintr |= SB_SPLICE;
> +             so->so_rcv.sb_flags |= SB_SPLICE;
> +             sosp->so_snd.sb_flags |= SB_SPLICE;
>       }
>  
>   release:
> @@ -1196,8 +1196,8 @@ sounsplice(struct socket *so, struct soc
>  
>       task_del(sosplice_taskq, &so->so_splicetask);
>       timeout_del(&so->so_idleto);
> -     sosp->so_snd.sb_flagsintr &= ~SB_SPLICE;
> -     so->so_rcv.sb_flagsintr &= ~SB_SPLICE;
> +     sosp->so_snd.sb_flags &= ~SB_SPLICE;
> +     so->so_rcv.sb_flags &= ~SB_SPLICE;
>       so->so_sp->ssp_socket = sosp->so_sp->ssp_soback = NULL;
>       if (wakeup && soreadable(so))
>               sorwakeup(so);
> @@ -1210,7 +1210,7 @@ soidle(void *arg)
>       int s;
>  
>       s = solock(so);
> -     if (so->so_rcv.sb_flagsintr & SB_SPLICE) {
> +     if (so->so_rcv.sb_flags & SB_SPLICE) {
>               so->so_error = ETIMEDOUT;
>               sounsplice(so, so->so_sp->ssp_socket, 1);
>       }
> @@ -1224,7 +1224,7 @@ sotask(void *arg)
>       int s;
>  
>       s = solock(so);
> -     if (so->so_rcv.sb_flagsintr & SB_SPLICE) {
> +     if (so->so_rcv.sb_flags & SB_SPLICE) {
>               /*
>                * We may not sleep here as sofree() and unsplice() may be
>                * called from softnet interrupt context.  This would remove
> @@ -1527,7 +1527,7 @@ sorwakeup(struct socket *so)
>       soassertlocked(so);
>  
>  #ifdef SOCKET_SPLICE
> -     if (so->so_rcv.sb_flagsintr & SB_SPLICE) {
> +     if (so->so_rcv.sb_flags & SB_SPLICE) {
>               /*
>                * TCP has a sendbuffer that can handle multiple packets
>                * at once.  So queue the stream a bit to accumulate data.
> @@ -1555,7 +1555,7 @@ sowwakeup(struct socket *so)
>       soassertlocked(so);
>  
>  #ifdef SOCKET_SPLICE
> -     if (so->so_snd.sb_flagsintr & SB_SPLICE)
> +     if (so->so_snd.sb_flags & SB_SPLICE)
>               task_add(sosplice_taskq, &so->so_sp->ssp_soback->so_splicetask);
>  #endif
>       sowakeup(so, &so->so_snd);
> @@ -1871,9 +1871,10 @@ sogetopt(struct socket *so, int level, i
>  void
>  sohasoutofband(struct socket *so)
>  {
> -     KERNEL_ASSERT_LOCKED();
> +     KERNEL_LOCK();
>       csignal(so->so_pgid, SIGURG, so->so_siguid, so->so_sigeuid);
>       selwakeup(&so->so_rcv.sb_sel);
> +     KERNEL_UNLOCK();
>  }
>  
>  int
> @@ -1901,7 +1902,7 @@ soo_kqfilter(struct file *fp, struct kno
>       }
>  
>       SLIST_INSERT_HEAD(&sb->sb_sel.si_note, kn, kn_selnext);
> -     sb->sb_flags |= SB_KNOTE;
> +     sb->sb_flagsintr |= SB_KNOTE;
>  
>       return (0);
>  }
> @@ -1915,7 +1916,7 @@ filt_sordetach(struct knote *kn)
>  
>       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;
> +             so->so_rcv.sb_flagsintr &= ~SB_KNOTE;
>  }
>  
>  int
> @@ -1958,7 +1959,7 @@ filt_sowdetach(struct knote *kn)
>  
>       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;
> +             so->so_snd.sb_flagsintr &= ~SB_KNOTE;
>  }
>  
>  int
> Index: kern/sys_socket.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/sys_socket.c,v
> retrieving revision 1.34
> diff -u -p -r1.34 sys_socket.c
> --- kern/sys_socket.c 14 Nov 2017 16:01:55 -0000      1.34
> +++ kern/sys_socket.c 4 Dec 2017 14:20:55 -0000
> @@ -166,11 +166,11 @@ soo_poll(struct file *fp, int events, st
>       if (revents == 0) {
>               if (events & (POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND)) {
>                       selrecord(p, &so->so_rcv.sb_sel);
> -                     so->so_rcv.sb_flagsintr |= SB_SEL;
> +                     so->so_rcv.sb_flags |= SB_SEL;
>               }
>               if (events & (POLLOUT | POLLWRNORM)) {
>                       selrecord(p, &so->so_snd.sb_sel);
> -                     so->so_snd.sb_flagsintr |= SB_SEL;
> +                     so->so_snd.sb_flags |= SB_SEL;
>               }
>       }
>       sounlock(s);
> Index: kern/uipc_socket2.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_socket2.c,v
> retrieving revision 1.87
> diff -u -p -r1.87 uipc_socket2.c
> --- kern/uipc_socket2.c       23 Nov 2017 13:42:53 -0000      1.87
> +++ kern/uipc_socket2.c       4 Dec 2017 14:22:21 -0000
> @@ -329,12 +329,12 @@ sosleep(struct socket *so, void *ident, 
>  int
>  sbwait(struct socket *so, struct sockbuf *sb)
>  {
> +     int prio = (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK | PCATCH;
> +
>       soassertlocked(so);
>  
> -     sb->sb_flagsintr |= SB_WAIT;
> -     return (sosleep(so, &sb->sb_cc,
> -         (sb->sb_flags & SB_NOINTR) ? PSOCK : PSOCK | PCATCH, "netio",
> -         sb->sb_timeo));
> +     sb->sb_flags |= SB_WAIT;
> +     return (sosleep(so, &sb->sb_cc, prio, "netio", sb->sb_timeo));
>  }
>  
>  int
> @@ -381,17 +381,18 @@ sbunlock(struct socket *so, struct sockb
>  void
>  sowakeup(struct socket *so, struct sockbuf *sb)
>  {
> -     KERNEL_ASSERT_LOCKED();
>       soassertlocked(so);
>  
> -     selwakeup(&sb->sb_sel);
> -     sb->sb_flagsintr &= ~SB_SEL;
> -     if (sb->sb_flagsintr & SB_WAIT) {
> -             sb->sb_flagsintr &= ~SB_WAIT;
> +     sb->sb_flags &= ~SB_SEL;
> +     if (sb->sb_flags & SB_WAIT) {
> +             sb->sb_flags &= ~SB_WAIT;
>               wakeup(&sb->sb_cc);
>       }
> +     KERNEL_LOCK();
>       if (so->so_state & SS_ASYNC)
>               csignal(so->so_pgid, SIGIO, so->so_siguid, so->so_sigeuid);
> +     selwakeup(&sb->sb_sel);
> +     KERNEL_UNLOCK();
>  }
>  
>  /*
> Index: miscfs/fifofs/fifo_vnops.c
> ===================================================================
> RCS file: /cvs/src/sys/miscfs/fifofs/fifo_vnops.c,v
> retrieving revision 1.59
> diff -u -p -r1.59 fifo_vnops.c
> --- miscfs/fifofs/fifo_vnops.c        4 Nov 2017 14:13:53 -0000       1.59
> +++ miscfs/fifofs/fifo_vnops.c        7 Dec 2017 12:31:07 -0000
> @@ -307,10 +307,12 @@ fifo_poll(void *v)
>       struct socket *wso = ap->a_vp->v_fifoinfo->fi_writesock;
>       int events = 0;
>       int revents = 0;
> +     int s;
>  
>       /*
>        * FIFOs don't support out-of-band or high priority data.
>        */
> +     s = solock(rso);
>       if (ap->a_fflag & FREAD)
>               events |= ap->a_events & (POLLIN | POLLRDNORM);
>       if (ap->a_fflag & FWRITE)
> @@ -333,13 +335,14 @@ fifo_poll(void *v)
>                       events = POLLIN;
>               if (events & (POLLIN | POLLRDNORM)) {
>                       selrecord(ap->a_p, &rso->so_rcv.sb_sel);
> -                     rso->so_rcv.sb_flagsintr |= SB_SEL;
> +                     rso->so_rcv.sb_flags |= SB_SEL;
>               }
>               if (events & (POLLOUT | POLLWRNORM)) {
>                       selrecord(ap->a_p, &wso->so_snd.sb_sel);
> -                     wso->so_snd.sb_flagsintr |= SB_SEL;
> +                     wso->so_snd.sb_flags |= SB_SEL;
>               }
>       }
> +     sounlock(s);
>       return (revents);
>  }
>  
> @@ -526,7 +529,7 @@ fifo_kqfilter(void *v)
>       ap->a_kn->kn_hook = so;
>  
>       SLIST_INSERT_HEAD(&sb->sb_sel.si_note, ap->a_kn, kn_selnext);
> -     sb->sb_flags |= SB_KNOTE;
> +     sb->sb_flagsintr |= SB_KNOTE;
>  
>       return (0);
>  }
> @@ -538,7 +541,7 @@ filt_fifordetach(struct knote *kn)
>  
>       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;
> +             so->so_rcv.sb_flagsintr &= ~SB_KNOTE;
>  }
>  
>  int
> @@ -570,7 +573,7 @@ filt_fifowdetach(struct knote *kn)
>  
>       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;
> +             so->so_snd.sb_flagsintr &= ~SB_KNOTE;
>  }
>  
>  int

Reply via email to