Skip to content

Commit 34d8c91

Browse files
cpaasch-oaikuba-moo
authored andcommitted
net/mlx5e: DMA-sync earlier in mlx5e_skb_from_cqe_mpwrq_nonlinear
Doing the call to dma_sync_single_for_cpu() earlier will allow us to adjust headlen based on the actual size of the protocol headers. Doing this earlier means that we don't need to call mlx5e_copy_skb_header() anymore and rather can call skb_copy_to_linear_data() directly. Reviewed-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Saeed Mahameed <saeedm@nvidia.com> Signed-off-by: Christoph Paasch <cpaasch@openai.com> Signed-off-by: Dragos Tatulea <dtatulea@nvidia.com> Signed-off-by: Tariq Toukan <tariqt@nvidia.com> Link: https://patch.msgid.link/20260601061522.398044-2-tariqt@nvidia.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent cbadf60 commit 34d8c91

1 file changed

Lines changed: 15 additions & 7 deletions

File tree

  • drivers/net/ethernet/mellanox/mlx5/core

drivers/net/ethernet/mellanox/mlx5/core/en_rx.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1923,11 +1923,11 @@ mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *w
19231923
unsigned int truesize = 0;
19241924
u32 pg_consumed_bytes;
19251925
struct bpf_prog *prog;
1926+
void *va, *head_addr;
19261927
struct sk_buff *skb;
19271928
u32 linear_frame_sz;
19281929
u16 linear_data_len;
19291930
u16 linear_hr;
1930-
void *va;
19311931

19321932
if (unlikely(cqe_bcnt > rq->hw_mtu)) {
19331933
u8 lro_num_seg = get_cqe_lro_num_seg(cqe);
@@ -1940,9 +1940,11 @@ mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *w
19401940

19411941
prog = rcu_dereference(rq->xdp_prog);
19421942

1943+
head_addr = netmem_address(head_page->netmem) + head_offset;
1944+
19431945
if (prog) {
19441946
/* area for bpf_xdp_[store|load]_bytes */
1945-
net_prefetchw(netmem_address(frag_page->netmem) + frag_offset);
1947+
net_prefetchw(head_addr);
19461948

19471949
va = mlx5e_mpwqe_get_linear_page_frag(rq);
19481950
if (!va) {
@@ -1956,6 +1958,8 @@ mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *w
19561958
linear_frame_sz = MLX5_SKB_FRAG_SZ(linear_hr + MLX5E_RX_MAX_HEAD);
19571959
linear_page = &rq->mpwqe.linear_info->frag_page;
19581960
} else {
1961+
dma_addr_t addr;
1962+
19591963
skb = napi_alloc_skb(rq->cq.napi,
19601964
ALIGN(MLX5E_RX_MAX_HEAD, sizeof(long)));
19611965
if (unlikely(!skb)) {
@@ -1967,6 +1971,11 @@ mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *w
19671971
net_prefetchw(va); /* xdp_frame data area */
19681972
net_prefetchw(skb->data);
19691973

1974+
addr = page_pool_get_dma_addr_netmem(head_page->netmem);
1975+
dma_sync_single_for_cpu(rq->pdev, addr + head_offset,
1976+
ALIGN(headlen, sizeof(long)),
1977+
rq->buff.map_dir);
1978+
19701979
frag_offset += headlen;
19711980
byte_cnt -= headlen;
19721981
linear_hr = skb_headroom(skb);
@@ -2056,8 +2065,6 @@ mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *w
20562065
__pskb_pull_tail(skb, headlen);
20572066
}
20582067
} else {
2059-
dma_addr_t addr;
2060-
20612068
if (xdp_buff_has_frags(&mxbuf->xdp)) {
20622069
struct mlx5e_frag_page *pagep;
20632070

@@ -2071,10 +2078,11 @@ mlx5e_skb_from_cqe_mpwrq_nonlinear(struct mlx5e_rq *rq, struct mlx5e_mpw_info *w
20712078
pagep->frags++;
20722079
while (++pagep < frag_page);
20732080
}
2081+
20742082
/* copy header */
2075-
addr = page_pool_get_dma_addr_netmem(head_page->netmem);
2076-
mlx5e_copy_skb_header(rq, skb, head_page->netmem, addr,
2077-
head_offset, head_offset, headlen);
2083+
skb_copy_to_linear_data(skb, head_addr,
2084+
ALIGN(headlen, sizeof(long)));
2085+
20782086
/* skb linear part was allocated with headlen and aligned to long */
20792087
skb->tail += headlen;
20802088
skb->len += headlen;

0 commit comments

Comments
 (0)