net: stmmac: Apply new page pool parameters when SPH is enabled
Commitdf542f6693
("net: stmmac: Switch to zero-copy in non-XDP RX path") makes DMA write received frame into buffer at offset of NET_SKB_PAD and sets page pool parameters to sync from offset of NET_SKB_PAD. But when Header Payload Split is enabled, the header is written at offset of NET_SKB_PAD, while the payload is written at offset of zero. Uncorrect offset parameter for the payload breaks dma coherence [1] since both CPU and DMA touch the page buffer from offset of zero which is not handled by the page pool sync parameter. And in case the DMA cannot split the received frame, for example, a large L2 frame, pp_params.max_len should grow to match the tail of entire frame. [1] https://lore.kernel.org/netdev/d465f277-bac7-439f-be1d-9a47dfe2d951@nvidia.com/ Reported-by: Jon Hunter <jonathanh@nvidia.com> Reported-by: Brad Griffis <bgriffis@nvidia.com> Suggested-by: Ido Schimmel <idosch@idosch.org> Fixes:df542f6693
("net: stmmac: Switch to zero-copy in non-XDP RX path") Signed-off-by: Furong Xu <0x1207@gmail.com> Tested-by: Jon Hunter <jonathanh@nvidia.com> Tested-by: Thierry Reding <treding@nvidia.com> Reviewed-by: Ido Schimmel <idosch@nvidia.com> Link: https://patch.msgid.link/20250207085639.13580-1-0x1207@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
011b033590
commit
cb6cc8ed77
1 changed files with 5 additions and 0 deletions
|
@ -2094,6 +2094,11 @@ static int __alloc_dma_rx_desc_resources(struct stmmac_priv *priv,
|
|||
pp_params.offset = stmmac_rx_offset(priv);
|
||||
pp_params.max_len = dma_conf->dma_buf_sz;
|
||||
|
||||
if (priv->sph) {
|
||||
pp_params.offset = 0;
|
||||
pp_params.max_len += stmmac_rx_offset(priv);
|
||||
}
|
||||
|
||||
rx_q->page_pool = page_pool_create(&pp_params);
|
||||
if (IS_ERR(rx_q->page_pool)) {
|
||||
ret = PTR_ERR(rx_q->page_pool);
|
||||
|
|
Loading…
Add table
Reference in a new issue