On Tue, Jun 06, 2017 at 05:15:40PM +0200, Martin Pieuchot wrote:
> TCP/UDP are almost ready to run without KERNEL_LOCK() because accesses
> to their sockets are serialized via the NET_LOCK().  On the other hand
> pfkey and routing sockets accesses still rely on the KERNEL_LOCK().
> 
> Since we're going to work at the socket layer, first to remove the
> KERNEL_LOCK() from routing/pfkey sockets then to split the NET_LOCK(),
> we need some tooling to move faster and avoid mistakes.
> 
> Currently all operations on socket buffers are protected by these
> locks.  I'd like to assert that, at least for all functions used in
> TCP/UDP layers.
> 
> The idea is to later change the lock asserted in soassertlocked(). 
> 
> Comments, ok?

Good idea, mostly OK.

> @@ -1058,7 +1058,9 @@ sorflush(struct socket *so)
>       }
>       if (pr->pr_flags & PR_RIGHTS && pr->pr_domain->dom_dispose)
>               (*pr->pr_domain->dom_dispose)(asb.sb_mb);
> -     sbrelease(&asb);
> +     *sb = asb;
> +     sbrelease(so, sb);
> +     memset(sb, 0, sizeof (*sb));
>  }

A few lines above we have
        /* XXX - the memset stomps all over so_rcv */
        if (asb.sb_flags & SB_KNOTE) {
                sb->sb_sel.si_note = asb.sb_sel.si_note;
                sb->sb_flags = SB_KNOTE;
        }
I think this has to be redone after your memset() as the socket is
still used after a soshutdown().

> @@ -1270,7 +1272,7 @@ somove(struct socket *so, int wait)
>                       maxreached = 1;
>               }
>       }
> -     space = sbspace(&sosp->so_snd);
> +     space = sbspace(so, &sosp->so_snd);
>       if (so->so_oobmark && so->so_oobmark < len &&
>           so->so_oobmark < space + 1024)
>               space += 1024;

This must be sosp.
+       space = sbspace(sosp, &sosp->so_snd);

> -sbappendstream(struct sockbuf *sb, struct mbuf *m)
> +sbappendstream(struct socket *so, struct sockbuf *sb, struct mbuf *m)
> -sbappendaddr(struct sockbuf *sb, struct sockaddr *asa, struct mbuf *m0,
> +sbappendaddr(struct socket *so, struct sockbuf *sb, struct sockaddr *asa,
> -sbappendcontrol(struct sockbuf *sb, struct mbuf *m0, struct mbuf *control)
> +sbappendcontrol(struct socket *so, struct sockbuf *sb, struct mbuf *m0,

Should we also change sbappendrecord() and sbappend() ?

>  /* can we write something to so? */
>  #define      sowriteable(so) \
> -    ((sbspace(&(so)->so_snd) >= (so)->so_snd.sb_lowat && \
> +    ((sbspace(so, &(so)->so_snd) >= (so)->so_snd.sb_lowat && \
>       (((so)->so_state & SS_ISCONNECTED) || \
>         ((so)->so_proto->pr_flags & PR_CONNREQUIRED)==0)) || \
>      ((so)->so_state & SS_CANTSENDMORE) || (so)->so_error)

You need () around marco arguments.
+       ((sbspace((so), &(so)->so_snd) >= (so)->so_snd.sb_lowat && \

bluhm

Reply via email to