Thread (8 messages) 8 messages, 2 authors, 2021-03-30

RE: [PATCH v2 bpf 3/3] libbpf: ignore return values of setsockopt for XDP rings.

From: Loftus, Ciara <hidden>
Date: 2021-03-30 12:05:45
Also in: bpf

quoted
quoted
On Fri, Mar 26, 2021 at 02:29:46PM +0000, Ciara Loftus wrote:
quoted
During xsk_socket__create the XDP_RX_RING and XDP_TX_RING
setsockopts
quoted
are called to create the rx and tx rings for the AF_XDP socket. If the ring
has already been set up, the setsockopt will return an error. However,
in the event of a failure during xsk_socket__create(_shared) after the
rings have been set up, the user may wish to retry the socket creation
using these pre-existing rings. In this case we can ignore the error
returned by the setsockopts. If there is a true error, the subsequent
call to mmap() will catch it.

Fixes: 1cad07884239 ("libbpf: add support for using AF_XDP sockets")

Acked-by: Magnus Karlsson <magnus.karlsson@intel.com>
Signed-off-by: Ciara Loftus <redacted>
---
 tools/lib/bpf/xsk.c | 34 ++++++++++++++++------------------
 1 file changed, 16 insertions(+), 18 deletions(-)
diff --git a/tools/lib/bpf/xsk.c b/tools/lib/bpf/xsk.c
index d4991ddff05a..cfc4abf505c3 100644
--- a/tools/lib/bpf/xsk.c
+++ b/tools/lib/bpf/xsk.c
@@ -900,24 +900,22 @@ int xsk_socket__create_shared(struct
xsk_socket
quoted
quoted
**xsk_ptr,
quoted
    }
    xsk->ctx = ctx;

-   if (rx) {
-           err = setsockopt(xsk->fd, SOL_XDP, XDP_RX_RING,
-                            &xsk->config.rx_size,
-                            sizeof(xsk->config.rx_size));
-           if (err) {
-                   err = -errno;
-                   goto out_put_ctx;
-           }
-   }
-   if (tx) {
-           err = setsockopt(xsk->fd, SOL_XDP, XDP_TX_RING,
-                            &xsk->config.tx_size,
-                            sizeof(xsk->config.tx_size));
-           if (err) {
-                   err = -errno;
-                   goto out_put_ctx;
-           }
-   }
+   /* The return values of these setsockopt calls are intentionally not
checked.
quoted
+    * If the ring has already been set up setsockopt will return an error.
However,
quoted
+    * this scenario is acceptable as the user may be retrying the socket
creation
quoted
+    * with rings which were set up in a previous but ultimately
unsuccessful call
quoted
+    * to xsk_socket__create(_shared). The call later to mmap() will fail if
there
quoted
+    * is a real issue and we handle that return value appropriately there.
+    */
+   if (rx)
+           setsockopt(xsk->fd, SOL_XDP, XDP_RX_RING,
+                      &xsk->config.rx_size,
+                      sizeof(xsk->config.rx_size));
+
+   if (tx)
+           setsockopt(xsk->fd, SOL_XDP, XDP_TX_RING,
+                      &xsk->config.tx_size,
+                      sizeof(xsk->config.tx_size));
Instead of ignoring the error can you remember that setsockopt was
done
quoted
quoted
in struct xsk_socket and don't do it the second time?
Ideally we don't have to ignore the error. However in the event of failure
struct xsk_socket is freed at the end of xsk_socket__create so we can't use it
to remember state between subsequent calls to __create().

but umem is not, right? and fd is taken from there.
Yes, got it. We can add a new field to struct xsk_umem. It's much better than ignoring the return values.
I'll add this in the v3. Thanks for your suggestion!

Ciara
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help