Commit 81470b5c authored by Tirthendu Sarkar's avatar Tirthendu Sarkar Committed by Alexei Starovoitov

xsk: introduce XSK_USE_SG bind flag for xsk socket

As of now xsk core drops any xdp_buff with data size greater than the
xsk frame_size as set by the af_xdp application. With multi-buffer
support introduced in the next patch xsk core can now split those
buffers into multiple descriptors provided the af_xdp application can
handle them. Such capability of the application needs to be independent
of the xdp_prog's frag support capability since there are cases where
even a single xdp_buffer may need to be split into multiple descriptors
owing to a smaller xsk frame size.

For e.g., with NIC rx_buffer size set to 4kB, a 3kB packet will
constitute of a single buffer and so will be sent as such to AF_XDP layer
irrespective of 'xdp.frags' capability of the XDP program. Now if the xsk
frame size is set to 2kB by the AF_XDP application, then the packet will
need to be split into 2 descriptors if AF_XDP application can handle
multi-buffer, else it needs to be dropped.

Applications can now advertise their frag handling capability to xsk core
so that xsk core can decide if it should drop or split xdp_buffs that
exceed xsk frame size. This is done using a new 'XSK_USE_SG' bind flag
for the xdp socket.
Signed-off-by: default avatarTirthendu Sarkar <tirthendu.sarkar@intel.com>
Link: https://lore.kernel.org/r/20230719132421.584801-3-maciej.fijalkowski@intel.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 63a64a56
...@@ -52,6 +52,7 @@ struct xdp_sock { ...@@ -52,6 +52,7 @@ struct xdp_sock {
struct xsk_buff_pool *pool; struct xsk_buff_pool *pool;
u16 queue_id; u16 queue_id;
bool zc; bool zc;
bool sg;
enum { enum {
XSK_READY = 0, XSK_READY = 0,
XSK_BOUND, XSK_BOUND,
......
...@@ -25,6 +25,12 @@ ...@@ -25,6 +25,12 @@
* application. * application.
*/ */
#define XDP_USE_NEED_WAKEUP (1 << 3) #define XDP_USE_NEED_WAKEUP (1 << 3)
/* By setting this option, userspace application indicates that it can
* handle multiple descriptors per packet thus enabling AF_XDP to split
* multi-buffer XDP frames into multiple Rx descriptors. Without this set
* such frames will be dropped.
*/
#define XDP_USE_SG (1 << 4)
/* Flags for xsk_umem_config flags */ /* Flags for xsk_umem_config flags */
#define XDP_UMEM_UNALIGNED_CHUNK_FLAG (1 << 0) #define XDP_UMEM_UNALIGNED_CHUNK_FLAG (1 << 0)
......
...@@ -897,7 +897,7 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len) ...@@ -897,7 +897,7 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
flags = sxdp->sxdp_flags; flags = sxdp->sxdp_flags;
if (flags & ~(XDP_SHARED_UMEM | XDP_COPY | XDP_ZEROCOPY | if (flags & ~(XDP_SHARED_UMEM | XDP_COPY | XDP_ZEROCOPY |
XDP_USE_NEED_WAKEUP)) XDP_USE_NEED_WAKEUP | XDP_USE_SG))
return -EINVAL; return -EINVAL;
bound_dev_if = READ_ONCE(sk->sk_bound_dev_if); bound_dev_if = READ_ONCE(sk->sk_bound_dev_if);
...@@ -929,7 +929,7 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len) ...@@ -929,7 +929,7 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
struct socket *sock; struct socket *sock;
if ((flags & XDP_COPY) || (flags & XDP_ZEROCOPY) || if ((flags & XDP_COPY) || (flags & XDP_ZEROCOPY) ||
(flags & XDP_USE_NEED_WAKEUP)) { (flags & XDP_USE_NEED_WAKEUP) || (flags & XDP_USE_SG)) {
/* Cannot specify flags for shared sockets. */ /* Cannot specify flags for shared sockets. */
err = -EINVAL; err = -EINVAL;
goto out_unlock; goto out_unlock;
...@@ -1028,6 +1028,7 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len) ...@@ -1028,6 +1028,7 @@ static int xsk_bind(struct socket *sock, struct sockaddr *addr, int addr_len)
xs->dev = dev; xs->dev = dev;
xs->zc = xs->umem->zc; xs->zc = xs->umem->zc;
xs->sg = !!(flags & XDP_USE_SG);
xs->queue_id = qid; xs->queue_id = qid;
xp_add_xsk(xs->pool, xs); xp_add_xsk(xs->pool, xs);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment