mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 03:23:53 -04:00
xsk: support mbuf on ZC RX
Given that skb_shared_info relies on skb_frag_t, in order to support xskb chaining, introduce xdp_buff_xsk::xskb_list_node and xsk_buff_pool::xskb_list. This is needed so ZC drivers can add frags as xskb nodes which will make it possible to handle it both when producing AF_XDP Rx descriptors as well as freeing/recycling all the frags that a single frame carries. Speaking of latter, update xsk_buff_free() to take care of list nodes. For the former (adding as frags), introduce xsk_buff_add_frag() for ZC drivers usage that is going to be used to add a frag to xskb list from pool. xsk_buff_get_frag() will be utilized by XDP_TX and, on contrary, will return xdp_buff. One of the previous patches added a wrapper for ZC Rx so implement xskb list walk and production of Rx descriptors there. On bind() path, bail out if socket wants to use ZC multi-buffer but underlying netdev does not support it. Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> Link: https://lore.kernel.org/r/20230719132421.584801-12-maciej.fijalkowski@intel.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
committed by
Alexei Starovoitov
parent
13ce2daa25
commit
24ea50127e
@@ -86,6 +86,7 @@ struct xsk_buff_pool *xp_create_and_assign_umem(struct xdp_sock *xs,
|
||||
pool->umem = umem;
|
||||
pool->addrs = umem->addrs;
|
||||
INIT_LIST_HEAD(&pool->free_list);
|
||||
INIT_LIST_HEAD(&pool->xskb_list);
|
||||
INIT_LIST_HEAD(&pool->xsk_tx_list);
|
||||
spin_lock_init(&pool->xsk_tx_list_lock);
|
||||
spin_lock_init(&pool->cq_lock);
|
||||
@@ -99,6 +100,7 @@ struct xsk_buff_pool *xp_create_and_assign_umem(struct xdp_sock *xs,
|
||||
xskb->pool = pool;
|
||||
xskb->xdp.frame_sz = umem->chunk_size - umem->headroom;
|
||||
INIT_LIST_HEAD(&xskb->free_list_node);
|
||||
INIT_LIST_HEAD(&xskb->xskb_list_node);
|
||||
if (pool->unaligned)
|
||||
pool->free_heads[i] = xskb;
|
||||
else
|
||||
@@ -187,6 +189,11 @@ int xp_assign_dev(struct xsk_buff_pool *pool,
|
||||
goto err_unreg_pool;
|
||||
}
|
||||
|
||||
if (netdev->xdp_zc_max_segs == 1 && (flags & XDP_USE_SG)) {
|
||||
err = -EOPNOTSUPP;
|
||||
goto err_unreg_pool;
|
||||
}
|
||||
|
||||
bpf.command = XDP_SETUP_XSK_POOL;
|
||||
bpf.xsk.pool = pool;
|
||||
bpf.xsk.queue_id = queue_id;
|
||||
|
||||
Reference in New Issue
Block a user