diff --git a/patches.suse/libbpf-Only-create-rx-and-tx-XDP-rings-when-necessar.patch b/patches.suse/libbpf-Only-create-rx-and-tx-XDP-rings-when-necessar.patch new file mode 100644 index 0000000..ce0c485 --- /dev/null +++ b/patches.suse/libbpf-Only-create-rx-and-tx-XDP-rings-when-necessar.patch @@ -0,0 +1,85 @@ +From: Ciara Loftus +Date: Wed, 31 Mar 2021 06:12:18 +0000 +Subject: libbpf: Only create rx and tx XDP rings when necessary +Patch-mainline: v5.12-rc7 +Git-commit: ca7a83e2487ad0bc9a3e0e7a8645354aa1782f13 +References: bsc#1155518 + +Prior to this commit xsk_socket__create(_shared) always attempted to create +the rx and tx rings for the socket. However this causes an issue when the +socket being setup is that which shares the fd with the UMEM. If a +previous call to this function failed with this socket after the rings were +set up, a subsequent call would always fail because the rings are not torn +down after the first call and when we try to set them up again we encounter +an error because they already exist. Solve this by remembering whether the +rings were set up by introducing new bools to struct xsk_umem which +represent the ring setup status and using them to determine whether or +not to set up the rings. + +Fixes: 1cad07884239 ("libbpf: add support for using AF_XDP sockets") +Signed-off-by: Ciara Loftus +Signed-off-by: Alexei Starovoitov +Link: https://lore.kernel.org/bpf/20210331061218.1647-4-ciara.loftus@intel.com +Acked-by: Gary Lin +--- + tools/lib/bpf/xsk.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +--- a/tools/lib/bpf/xsk.c ++++ b/tools/lib/bpf/xsk.c +@@ -51,6 +51,8 @@ struct xsk_umem { + struct xsk_umem_config config; + int fd; + int refcount; ++ bool rx_ring_setup_done; ++ bool tx_ring_setup_done; + }; + + struct xsk_socket { +@@ -561,6 +563,7 @@ int xsk_socket__create(struct xsk_socket + struct xdp_mmap_offsets off; + struct xsk_socket *xsk; + int err; ++ bool rx_setup_done = false, tx_setup_done = false; + + if (!umem || !xsk_ptr || !rx || !tx) + return -EFAULT; +@@ -582,6 +585,8 @@ int xsk_socket__create(struct xsk_socket + } + } else { + xsk->fd = umem->fd; ++ rx_setup_done = umem->rx_ring_setup_done; ++ tx_setup_done = umem->tx_ring_setup_done; + } + + xsk->outstanding_tx = 0; +@@ -599,7 +604,7 @@ int xsk_socket__create(struct xsk_socket + if (err) + goto out_socket; + +- if (rx) { ++ if (rx && !rx_setup_done) { + err = setsockopt(xsk->fd, SOL_XDP, XDP_RX_RING, + &xsk->config.rx_size, + sizeof(xsk->config.rx_size)); +@@ -607,8 +612,10 @@ int xsk_socket__create(struct xsk_socket + err = -errno; + goto out_socket; + } ++ if (xsk->fd == umem->fd) ++ umem->rx_ring_setup_done = true; + } +- if (tx) { ++ if (tx && !tx_setup_done) { + err = setsockopt(xsk->fd, SOL_XDP, XDP_TX_RING, + &xsk->config.tx_size, + sizeof(xsk->config.tx_size)); +@@ -616,6 +623,8 @@ int xsk_socket__create(struct xsk_socket + err = -errno; + goto out_socket; + } ++ if (xsk->fd == umem->fd) ++ umem->rx_ring_setup_done = true; + } + + err = xsk_get_mmap_offsets(xsk->fd, &off); diff --git a/series.conf b/series.conf index b1f7982..903d6d3 100644 --- a/series.conf +++ b/series.conf @@ -18574,6 +18574,7 @@ patches.suse/gianfar-Handle-error-code-at-MAC-address-change.patch patches.suse/ice-remove-DCBNL_DEVRESET-bit-from-PF-state.patch patches.suse/net-phy-broadcom-Only-advertise-EEE-for-supported-mo.patch + patches.suse/libbpf-Only-create-rx-and-tx-XDP-rings-when-necessar.patch patches.suse/net-hns3-Remove-the-left-over-redundant-check-assign.patch patches.suse/batman-adv-initialize-struct-batadv_tvlv_tt_vlan_dat.patch patches.suse/net-mlx5-Fix-PPLM-register-mapping.patch