Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next
authorDavid S. Miller <davem@davemloft.net>
Tue, 4 Aug 2020 01:27:40 +0000 (18:27 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 4 Aug 2020 01:27:40 +0000 (18:27 -0700)
Daniel Borkmann says:

====================
pull-request: bpf-next 2020-08-04

The following pull-request contains BPF updates for your *net-next* tree.

We've added 73 non-merge commits during the last 9 day(s) which contain
a total of 135 files changed, 4603 insertions(+), 1013 deletions(-).

The main changes are:

1) Implement bpf_link support for XDP. Also add LINK_DETACH operation for the BPF
   syscall allowing processes with BPF link FD to force-detach, from Andrii Nakryiko.

2) Add BPF iterator for map elements and to iterate all BPF programs for efficient
   in-kernel inspection, from Yonghong Song and Alexei Starovoitov.

3) Separate bpf_get_{stack,stackid}() helpers for perf events in BPF to avoid
   unwinder errors, from Song Liu.

4) Allow cgroup local storage map to be shared between programs on the same
   cgroup. Also extend BPF selftests with coverage, from YiFei Zhu.

5) Add BPF exception tables to ARM64 JIT in order to be able to JIT BPF_PROBE_MEM
   load instructions, from Jean-Philippe Brucker.

6) Follow-up fixes on BPF socket lookup in combination with reuseport group
   handling. Also add related BPF selftests, from Jakub Sitnicki.

7) Allow to use socket storage in BPF_PROG_TYPE_CGROUP_SOCK-typed programs for
   socket create/release as well as bind functions, from Stanislav Fomichev.

8) Fix an info leak in xsk_getsockopt() when retrieving XDP stats via old struct
   xdp_statistics, from Peilin Ye.

9) Fix PT_REGS_RC{,_CORE}() macros in libbpf for MIPS arch, from Jerry Crunchtime.

10) Extend BPF kernel test infra with skb->family and skb->{local,remote}_ip{4,6}
    fields and allow user space to specify skb->dev via ifindex, from Dmitry Yakunin.

11) Fix a bpftool segfault due to missing program type name and make it more robust
    to prevent them in future gaps, from Quentin Monnet.

12) Consolidate cgroup helper functions across selftests and fix a v6 localhost
    resolver issue, from John Fastabend.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
15 files changed:
1  2 
drivers/net/ethernet/freescale/dpaa2/dpaa2-eth.c
drivers/net/ethernet/intel/ice/ice_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
drivers/net/ethernet/marvell/mvneta.c
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/sfc/efx.c
drivers/net/tun.c
include/linux/netdevice.h
kernel/bpf/btf.c
kernel/bpf/hashtab.c
net/core/dev.c
net/core/rtnetlink.c
net/ipv6/route.c

Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
diff --cc net/core/dev.c
@@@ -8715,54 -8712,75 +8711,100 @@@ int dev_change_proto_down_generic(struc
  }
  EXPORT_SYMBOL(dev_change_proto_down_generic);
  
- u32 __dev_xdp_query(struct net_device *dev, bpf_op_t bpf_op,
-                   enum bpf_netdev_command cmd)
 +/**
 + *    dev_change_proto_down_reason - proto down reason
 + *
 + *    @dev: device
 + *    @mask: proto down mask
 + *    @value: proto down value
 + */
 +void dev_change_proto_down_reason(struct net_device *dev, unsigned long mask,
 +                                u32 value)
 +{
 +      int b;
 +
 +      if (!mask) {
 +              dev->proto_down_reason = value;
 +      } else {
 +              for_each_set_bit(b, &mask, 32) {
 +                      if (value & (1 << b))
 +                              dev->proto_down_reason |= BIT(b);
 +                      else
 +                              dev->proto_down_reason &= ~BIT(b);
 +              }
 +      }
 +}
 +EXPORT_SYMBOL(dev_change_proto_down_reason);
 +
+ struct bpf_xdp_link {
+       struct bpf_link link;
+       struct net_device *dev; /* protected by rtnl_lock, no refcnt held */
+       int flags;
+ };
+ static enum bpf_xdp_mode dev_xdp_mode(u32 flags)
  {
-       struct netdev_bpf xdp;
+       if (flags & XDP_FLAGS_HW_MODE)
+               return XDP_MODE_HW;
+       if (flags & XDP_FLAGS_DRV_MODE)
+               return XDP_MODE_DRV;
+       return XDP_MODE_SKB;
+ }
  
-       if (!bpf_op)
-               return 0;
+ static bpf_op_t dev_xdp_bpf_op(struct net_device *dev, enum bpf_xdp_mode mode)
+ {
+       switch (mode) {
+       case XDP_MODE_SKB:
+               return generic_xdp_install;
+       case XDP_MODE_DRV:
+       case XDP_MODE_HW:
+               return dev->netdev_ops->ndo_bpf;
+       default:
+               return NULL;
+       };
+ }
  
-       memset(&xdp, 0, sizeof(xdp));
-       xdp.command = cmd;
+ static struct bpf_xdp_link *dev_xdp_link(struct net_device *dev,
+                                        enum bpf_xdp_mode mode)
+ {
+       return dev->xdp_state[mode].link;
+ }
+ static struct bpf_prog *dev_xdp_prog(struct net_device *dev,
+                                    enum bpf_xdp_mode mode)
+ {
+       struct bpf_xdp_link *link = dev_xdp_link(dev, mode);
+       if (link)
+               return link->link.prog;
+       return dev->xdp_state[mode].prog;
+ }
+ u32 dev_xdp_prog_id(struct net_device *dev, enum bpf_xdp_mode mode)
+ {
+       struct bpf_prog *prog = dev_xdp_prog(dev, mode);
  
-       /* Query must always succeed. */
-       WARN_ON(bpf_op(dev, &xdp) < 0 && cmd == XDP_QUERY_PROG);
+       return prog ? prog->aux->id : 0;
+ }
  
-       return xdp.prog_id;
+ static void dev_xdp_set_link(struct net_device *dev, enum bpf_xdp_mode mode,
+                            struct bpf_xdp_link *link)
+ {
+       dev->xdp_state[mode].link = link;
+       dev->xdp_state[mode].prog = NULL;
  }
  
- static int dev_xdp_install(struct net_device *dev, bpf_op_t bpf_op,
-                          struct netlink_ext_ack *extack, u32 flags,
-                          struct bpf_prog *prog)
+ static void dev_xdp_set_prog(struct net_device *dev, enum bpf_xdp_mode mode,
+                            struct bpf_prog *prog)
+ {
+       dev->xdp_state[mode].link = NULL;
+       dev->xdp_state[mode].prog = prog;
+ }
+ static int dev_xdp_install(struct net_device *dev, enum bpf_xdp_mode mode,
+                          bpf_op_t bpf_op, struct netlink_ext_ack *extack,
+                          u32 flags, struct bpf_prog *prog)
  {
-       bool non_hw = !(flags & XDP_FLAGS_HW_MODE);
-       struct bpf_prog *prev_prog = NULL;
        struct netdev_bpf xdp;
        int err;
  
Simple merge
Simple merge