mirror of
https://gitee.com/bianbu-linux/linux-6.6
synced 2025-04-26 14:17:26 -04:00
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: Tirthendu Sarkar <tirthendu.sarkar@intel.com> Link: https://lore.kernel.org/r/20230719132421.584801-3-maciej.fijalkowski@intel.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
parent
63a64a56bc
commit
81470b5c3c
3 changed files with 10 additions and 2 deletions
|
@ -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 @@
|
||||||
* 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)
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue