On Tue, Dec 29, 2015 at 12:29:09PM -0500, Craig Gallek wrote: > From: Craig Gallek <kr...@google.com> > > Expose socket options for setting a classic or extended BPF program > for use when selecting sockets in an SO_REUSEPORT group. These options > can be used on the first socket to belong to a group before bind or > on any socket in the group after bind. > > This change includes refactoring of the existing sk_filter code to > allow reuse of the existing BPF filter validation checks. > > Signed-off-by: Craig Gallek <kr...@google.com> ... > @@ -75,6 +79,10 @@ static struct sock_reuseport *reuseport_grow(struct > sock_reuseport *reuse) > rcu_assign_pointer(reuse->socks[i]->sk_reuseport_cb, > more_reuse); > > + /* Note: we use kfree_rcu here instead of reuseport_free_rcu so > + * that reuse and more_reuse can temporarily share a reference > + * to prog. > + */ > kfree_rcu(reuse, rcu); > return more_reuse;
thanks for the comment. that bit definitely is tricky, but looks fine. > +static struct sock *run_bpf(struct sock_reuseport *reuse, u16 socks, > + struct bpf_prog *prog, struct sk_buff *skb, > + int hdr_len) > +{ > + struct sk_buff *nskb = NULL; > + u32 index; > + > + if (skb_shared(skb)) { > + nskb = skb_clone(skb, GFP_ATOMIC); > + if (!nskb) > + return NULL; > + skb = nskb; > + } > + > + /* temporarily advance data past protocol header */ > + if (!pskb_may_pull(skb, hdr_len) || !skb_pull_inline(skb, hdr_len)) { pskb_pull() would be cleaner. > + consume_skb(nskb); > + return NULL; > + } > + index = bpf_prog_run_save_cb(prog, skb); > + __skb_push(skb, hdr_len); This indeed matches what normal bpf filters see with udp sockets, so I guess that's fine. Acked-by: Alexei Starovoitov <a...@kernel.org> -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html