Merge tag 'for-netdev' of https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf...
authorJakub Kicinski <kuba@kernel.org>
Fri, 1 Dec 2023 00:56:09 +0000 (16:56 -0800)
committerJakub Kicinski <kuba@kernel.org>
Fri, 1 Dec 2023 00:58:42 +0000 (16:58 -0800)
Daniel Borkmann says:

====================
pull-request: bpf-next 2023-11-30

We've added 30 non-merge commits during the last 7 day(s) which contain
a total of 58 files changed, 1598 insertions(+), 154 deletions(-).

The main changes are:

1) Add initial TX metadata implementation for AF_XDP with support in mlx5
   and stmmac drivers. Two types of offloads are supported right now, that
   is, TX timestamp and TX checksum offload, from Stanislav Fomichev with
   stmmac implementation from Song Yoong Siang.

2) Change BPF verifier logic to validate global subprograms lazily instead
   of unconditionally before the main program, so they can be guarded using
   BPF CO-RE techniques, from Andrii Nakryiko.

3) Add BPF link_info support for uprobe multi link along with bpftool
   integration for the latter, from Jiri Olsa.

4) Use pkg-config in BPF selftests to determine ld flags which is
   in particular needed for linking statically, from Akihiko Odaki.

5) Fix a few BPF selftest failures to adapt to the upcoming LLVM18,
   from Yonghong Song.

* tag 'for-netdev' of https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next: (30 commits)
  bpf/tests: Remove duplicate JSGT tests
  selftests/bpf: Add TX side to xdp_hw_metadata
  selftests/bpf: Convert xdp_hw_metadata to XDP_USE_NEED_WAKEUP
  selftests/bpf: Add TX side to xdp_metadata
  selftests/bpf: Add csum helpers
  selftests/xsk: Support tx_metadata_len
  xsk: Add option to calculate TX checksum in SW
  xsk: Validate xsk_tx_metadata flags
  xsk: Document tx_metadata_len layout
  net: stmmac: Add Tx HWTS support to XDP ZC
  net/mlx5e: Implement AF_XDP TX timestamp and checksum offload
  tools: ynl: Print xsk-features from the sample
  xsk: Add TX timestamp and TX checksum offload support
  xsk: Support tx_metadata_len
  selftests/bpf: Use pkg-config for libelf
  selftests/bpf: Override PKG_CONFIG for static builds
  selftests/bpf: Choose pkg-config for the target
  bpftool: Add support to display uprobe_multi links
  selftests/bpf: Add link_info test for uprobe_multi link
  selftests/bpf: Use bpf_link__destroy in fill_link_info tests
  ...
====================

Conflicts:

Documentation/netlink/specs/netdev.yaml:
  839ff60df3ab ("net: page_pool: add nlspec for basic access to page pools")
  48eb03dd2630 ("xsk: Add TX timestamp and TX checksum offload support")
https://lore.kernel.org/all/20231201094705.1ee3cab8@canb.auug.org.au/

While at it also regen, tree is dirty after:
  48eb03dd2630 ("xsk: Add TX timestamp and TX checksum offload support")
looks like code wasn't re-rendered after "render-max" was removed.

Link: https://lore.kernel.org/r/20231130145708.32573-1-daniel@iogearbox.net
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1  2 
Documentation/netlink/specs/netdev.yaml
Documentation/networking/index.rst
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
include/linux/netdevice.h
include/uapi/linux/netdev.h
tools/include/uapi/linux/netdev.h
tools/net/ynl/generated/netdev-user.c
tools/net/ynl/generated/netdev-user.h

index 20f75b7d3240c6c35a2f6b415a13fcedda14eb88,00439bcbd2e311bb78b471e9d97e3842101c3689..eef6358ec587da04f3195e550e853fc712f29b5a
@@@ -86,112 -97,11 +97,117 @@@ attribute-sets
               See Documentation/networking/xdp-rx-metadata.rst for more details.
          type: u64
          enum: xdp-rx-metadata
+       -
+         name: xsk-features
+         doc: Bitmask of enabled AF_XDP features.
+         type: u64
+         enum: xsk-flags
 +  -
 +    name: page-pool
 +    attributes:
 +      -
 +        name: id
 +        doc: Unique ID of a Page Pool instance.
 +        type: uint
 +        checks:
 +          min: 1
 +          max: u32-max
 +      -
 +        name: ifindex
 +        doc: |
 +          ifindex of the netdev to which the pool belongs.
 +          May be reported as 0 if the page pool was allocated for a netdev
 +          which got destroyed already (page pools may outlast their netdevs
 +          because they wait for all memory to be returned).
 +        type: u32
 +        checks:
 +          min: 1
 +          max: s32-max
 +      -
 +        name: napi-id
 +        doc: Id of NAPI using this Page Pool instance.
 +        type: uint
 +        checks:
 +          min: 1
 +          max: u32-max
 +      -
 +        name: inflight
 +        type: uint
 +        doc: |
 +          Number of outstanding references to this page pool (allocated
 +          but yet to be freed pages). Allocated pages may be held in
 +          socket receive queues, driver receive ring, page pool recycling
 +          ring, the page pool cache, etc.
 +      -
 +        name: inflight-mem
 +        type: uint
 +        doc: |
 +          Amount of memory held by inflight pages.
 +      -
 +        name: detach-time
 +        type: uint
 +        doc: |
 +          Seconds in CLOCK_BOOTTIME of when Page Pool was detached by
 +          the driver. Once detached Page Pool can no longer be used to
 +          allocate memory.
 +          Page Pools wait for all the memory allocated from them to be freed
 +          before truly disappearing. "Detached" Page Pools cannot be
 +          "re-attached", they are just waiting to disappear.
 +          Attribute is absent if Page Pool has not been detached, and
 +          can still be used to allocate new memory.
 +  -
 +    name: page-pool-info
 +    subset-of: page-pool
 +    attributes:
 +      -
 +        name: id
 +      -
 +        name: ifindex
 +  -
 +    name: page-pool-stats
 +    doc: |
 +      Page pool statistics, see docs for struct page_pool_stats
 +      for information about individual statistics.
 +    attributes:
 +      -
 +        name: info
 +        doc: Page pool identifying information.
 +        type: nest
 +        nested-attributes: page-pool-info
 +      -
 +        name: alloc-fast
 +        type: uint
 +        value: 8 # reserve some attr ids in case we need more metadata later
 +      -
 +        name: alloc-slow
 +        type: uint
 +      -
 +        name: alloc-slow-high-order
 +        type: uint
 +      -
 +        name: alloc-empty
 +        type: uint
 +      -
 +        name: alloc-refill
 +        type: uint
 +      -
 +        name: alloc-waive
 +        type: uint
 +      -
 +        name: recycle-cached
 +        type: uint
 +      -
 +        name: recycle-cache-full
 +        type: uint
 +      -
 +        name: recycle-ring
 +        type: uint
 +      -
 +        name: recycle-ring-full
 +        type: uint
 +      -
 +        name: recycle-released-refcnt
 +        type: uint
  
  operations:
    list:
Simple merge
Simple merge
index 2b37233e00c0e251143e0e263b0fc10c4200e8de,48d5477a668c2e145d7e44e77dd7fc69d5817bb8..6244c0164976a28f7e31577a54d97aebaaf45c30
@@@ -48,9 -48,24 +48,18 @@@ enum netdev_xdp_act 
  enum netdev_xdp_rx_metadata {
        NETDEV_XDP_RX_METADATA_TIMESTAMP = 1,
        NETDEV_XDP_RX_METADATA_HASH = 2,
 -
 -      /* private: */
 -      NETDEV_XDP_RX_METADATA_MASK = 3,
+ };
  
-       /* private: */
-       NETDEV_XDP_RX_METADATA_MASK = 3,
+ /**
+  * enum netdev_xsk_flags
+  * @NETDEV_XSK_FLAGS_TX_TIMESTAMP: HW timestamping egress packets is supported
+  *   by the driver.
+  * @NETDEV_XSK_FLAGS_TX_CHECKSUM: L3 checksum HW offload is supported by the
+  *   driver.
+  */
+ enum netdev_xsk_flags {
+       NETDEV_XSK_FLAGS_TX_TIMESTAMP = 1,
+       NETDEV_XSK_FLAGS_TX_CHECKSUM = 2,
 -
 -      /* private: */
 -      NETDEV_XSK_FLAGS_MASK = 3,
  };
  
  enum {
index 2b37233e00c0e251143e0e263b0fc10c4200e8de,48d5477a668c2e145d7e44e77dd7fc69d5817bb8..6244c0164976a28f7e31577a54d97aebaaf45c30
@@@ -48,9 -48,24 +48,18 @@@ enum netdev_xdp_act 
  enum netdev_xdp_rx_metadata {
        NETDEV_XDP_RX_METADATA_TIMESTAMP = 1,
        NETDEV_XDP_RX_METADATA_HASH = 2,
 -
 -      /* private: */
 -      NETDEV_XDP_RX_METADATA_MASK = 3,
+ };
  
-       /* private: */
-       NETDEV_XDP_RX_METADATA_MASK = 3,
+ /**
+  * enum netdev_xsk_flags
+  * @NETDEV_XSK_FLAGS_TX_TIMESTAMP: HW timestamping egress packets is supported
+  *   by the driver.
+  * @NETDEV_XSK_FLAGS_TX_CHECKSUM: L3 checksum HW offload is supported by the
+  *   driver.
+  */
+ enum netdev_xsk_flags {
+       NETDEV_XSK_FLAGS_TX_TIMESTAMP = 1,
+       NETDEV_XSK_FLAGS_TX_CHECKSUM = 2,
 -
 -      /* private: */
 -      NETDEV_XSK_FLAGS_MASK = 3,
  };
  
  enum {
index a7b7019d00f1feb1037321a02e715b9ee88c8a79,6283d87dad372c7df490f1a4fad1bf3b46712337..3b9dee94d4ce48d4d76d70d9f94e2cdab9a6d092
@@@ -63,17 -58,20 +63,30 @@@ const char *netdev_xdp_rx_metadata_str(
        return netdev_xdp_rx_metadata_strmap[value];
  }
  
+ static const char * const netdev_xsk_flags_strmap[] = {
+       [0] = "tx-timestamp",
+       [1] = "tx-checksum",
+ };
+ const char *netdev_xsk_flags_str(enum netdev_xsk_flags value)
+ {
+       value = ffs(value) - 1;
+       if (value < 0 || value >= (int)MNL_ARRAY_SIZE(netdev_xsk_flags_strmap))
+               return NULL;
+       return netdev_xsk_flags_strmap[value];
+ }
  /* Policies */
 +struct ynl_policy_attr netdev_page_pool_info_policy[NETDEV_A_PAGE_POOL_MAX + 1] = {
 +      [NETDEV_A_PAGE_POOL_ID] = { .name = "id", .type = YNL_PT_UINT, },
 +      [NETDEV_A_PAGE_POOL_IFINDEX] = { .name = "ifindex", .type = YNL_PT_U32, },
 +};
 +
 +struct ynl_policy_nest netdev_page_pool_info_nest = {
 +      .max_attr = NETDEV_A_PAGE_POOL_MAX,
 +      .table = netdev_page_pool_info_policy,
 +};
 +
  struct ynl_policy_attr netdev_dev_policy[NETDEV_A_DEV_MAX + 1] = {
        [NETDEV_A_DEV_IFINDEX] = { .name = "ifindex", .type = YNL_PT_U32, },
        [NETDEV_A_DEV_PAD] = { .name = "pad", .type = YNL_PT_IGNORE, },
index 4093602c9b6cb09b08edd20c7ee193ea5eb49d97,39af1908444ba5797a1950b93044b35c0330906e..cc3d80d1cf8cce210d573f8f82bed9156528f2c2
@@@ -19,18 -19,9 +19,19 @@@ extern const struct ynl_family ynl_netd
  const char *netdev_op_str(int op);
  const char *netdev_xdp_act_str(enum netdev_xdp_act value);
  const char *netdev_xdp_rx_metadata_str(enum netdev_xdp_rx_metadata value);
+ const char *netdev_xsk_flags_str(enum netdev_xsk_flags value);
  
  /* Common nested types */
 +struct netdev_page_pool_info {
 +      struct {
 +              __u32 id:1;
 +              __u32 ifindex:1;
 +      } _present;
 +
 +      __u64 id;
 +      __u32 ifindex;
 +};
 +
  /* ============== NETDEV_CMD_DEV_GET ============== */
  /* NETDEV_CMD_DEV_GET - do */
  struct netdev_dev_get_req {