APPLIED: [PATCH][focal/linux] net/mlx5e: Fix page DMA map/unmap attributes

Zachary Tahenakos zachary.tahenakos at canonical.com
Wed Apr 13 13:40:46 UTC 2022


Applied to focal:linux/master-next. Thanks.

-Zack

On 3/31/22 9:25 AM, Tim Gardner wrote:
> From: Aya Levin <ayal at nvidia.com>
>
> BugLink: https://bugs.launchpad.net/bugs/1967292
>
> Driver initiates DMA sync, hence it may skip CPU sync. Add
> DMA_ATTR_SKIP_CPU_SYNC as input attribute both to dma_map_page and
> dma_unmap_page to avoid redundant sync with the CPU.
> When forcing the device to work with SWIOTLB, the extra sync might cause
> data corruption. The driver unmaps the whole page while the hardware
> used just a part of the bounce buffer. So syncing overrides the entire
> page with bounce buffer that only partially contains real data.
>
> Fixes: bc77b240b3c5 ("net/mlx5e: Add fragmented memory support for RX multi packet WQE")
> Fixes: db05815b36cb ("net/mlx5e: Add XSK zero-copy support")
> Signed-off-by: Aya Levin <ayal at nvidia.com>
> Reviewed-by: Gal Pressman <gal at nvidia.com>
> Signed-off-by: Saeed Mahameed <saeedm at nvidia.com>
> (backported from commit 0b7cfa4082fbf550595bc0e40f05614bd83bf0cd)
> [rtg - drivers/net/ethernet/mellanox/mlx5/core/en/xsk/pool.c does not exist]
> Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
> ---
>
> commit 0b7cfa4082fbf550595bc0e40f05614bd83bf0cd has already been included in 5.13.0-40.45 and 5.15.0-19.19
>
> ---
>   drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 7 ++++---
>   1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> index 386f49949a23d..3ae7a3973c745 100644
> --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
> @@ -248,8 +248,8 @@ static inline int mlx5e_page_alloc_pool(struct mlx5e_rq *rq,
>   	if (unlikely(!dma_info->page))
>   		return -ENOMEM;
>   
> -	dma_info->addr = dma_map_page(rq->pdev, dma_info->page, 0,
> -				      PAGE_SIZE, rq->buff.map_dir);
> +	dma_info->addr = dma_map_page_attrs(rq->pdev, dma_info->page, 0, PAGE_SIZE,
> +					    rq->buff.map_dir, DMA_ATTR_SKIP_CPU_SYNC);
>   	if (unlikely(dma_mapping_error(rq->pdev, dma_info->addr))) {
>   		page_pool_recycle_direct(rq->page_pool, dma_info->page);
>   		dma_info->page = NULL;
> @@ -270,7 +270,8 @@ static inline int mlx5e_page_alloc(struct mlx5e_rq *rq,
>   
>   void mlx5e_page_dma_unmap(struct mlx5e_rq *rq, struct mlx5e_dma_info *dma_info)
>   {
> -	dma_unmap_page(rq->pdev, dma_info->addr, PAGE_SIZE, rq->buff.map_dir);
> +	dma_unmap_page_attrs(rq->pdev, dma_info->addr, PAGE_SIZE, rq->buff.map_dir,
> +			     DMA_ATTR_SKIP_CPU_SYNC);
>   }
>   
>   void mlx5e_page_release_dynamic(struct mlx5e_rq *rq,



More information about the kernel-team mailing list