Skip to content

Commit 75d9228

Browse files
walking-machinekuba-moo
authored andcommitted
libeth, idpf: use truesize as XDP RxQ info frag_size
The only user of frag_size field in XDP RxQ info is bpf_xdp_frags_increase_tail(). It clearly expects whole buffer size instead of DMA write size. Different assumptions in idpf driver configuration lead to negative tailroom. To make it worse, buffer sizes are not actually uniform in idpf when splitq is enabled, as there are several buffer queues, so rxq->rx_buf_size is meaningless in this case. Use truesize of the first bufq in AF_XDP ZC, as there is only one. Disable growing tail for regular splitq. Fixes: ac8a861 ("idpf: prepare structures to support XDP") Reviewed-by: Aleksandr Loktionov <[email protected]> Signed-off-by: Larysa Zaremba <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent c69d22c commit 75d9228

4 files changed

Lines changed: 10 additions & 1 deletion

File tree

drivers/net/ethernet/intel/idpf/xdp.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,16 @@ static int __idpf_xdp_rxq_info_init(struct idpf_rx_queue *rxq, void *arg)
4747
{
4848
const struct idpf_vport *vport = rxq->q_vector->vport;
4949
const struct idpf_q_vec_rsrc *rsrc;
50+
u32 frag_size = 0;
5051
bool split;
5152
int err;
5253

54+
if (idpf_queue_has(XSK, rxq))
55+
frag_size = rxq->bufq_sets[0].bufq.truesize;
56+
5357
err = __xdp_rxq_info_reg(&rxq->xdp_rxq, vport->netdev, rxq->idx,
5458
rxq->q_vector->napi.napi_id,
55-
rxq->rx_buf_size);
59+
frag_size);
5660
if (err)
5761
return err;
5862

drivers/net/ethernet/intel/idpf/xsk.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ int idpf_xskfq_init(struct idpf_buf_queue *bufq)
403403
bufq->pending = fq.pending;
404404
bufq->thresh = fq.thresh;
405405
bufq->rx_buf_size = fq.buf_len;
406+
bufq->truesize = fq.truesize;
406407

407408
if (!idpf_xskfq_refill(bufq))
408409
netdev_err(bufq->pool->netdev,

drivers/net/ethernet/intel/libeth/xsk.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ int libeth_xskfq_create(struct libeth_xskfq *fq)
167167
fq->pending = fq->count;
168168
fq->thresh = libeth_xdp_queue_threshold(fq->count);
169169
fq->buf_len = xsk_pool_get_rx_frame_size(fq->pool);
170+
fq->truesize = xsk_pool_get_rx_frag_step(fq->pool);
170171

171172
return 0;
172173
}

include/net/libeth/xsk.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,7 @@ __libeth_xsk_run_pass(struct libeth_xdp_buff *xdp,
597597
* @pending: current number of XSkFQEs to refill
598598
* @thresh: threshold below which the queue is refilled
599599
* @buf_len: HW-writeable length per each buffer
600+
* @truesize: step between consecutive buffers, 0 if none exists
600601
* @nid: ID of the closest NUMA node with memory
601602
*/
602603
struct libeth_xskfq {
@@ -614,6 +615,8 @@ struct libeth_xskfq {
614615
u32 thresh;
615616

616617
u32 buf_len;
618+
u32 truesize;
619+
617620
int nid;
618621
};
619622

0 commit comments

Comments
 (0)