lkml.org 
[lkml]   [2020]   [May]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 072/312] net/mlx5: Avoid passing dma address 0 to firmware
    Date
    From: Noa Osherovich <noaos@mellanox.com>

    commit 6b276190c50a12511d889d9079ffb901ff94a822 upstream.

    Currently the firmware can't work with a page with dma address 0.
    Passing such an address to the firmware will cause the give_pages
    command to fail.

    To avoid this, in case we get a 0 dma address of a page from the
    dma engine, we avoid passing it to FW by remapping to get an address
    other than 0.

    Fixes: bf0bf77f6519 ('mlx5: Support communicating arbitrary host...')
    Signed-off-by: Noa Osherovich <noaos@mellanox.com>
    Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c | 26 +++++++++++++-------
    1 file changed, 18 insertions(+), 8 deletions(-)

    --- a/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
    +++ b/drivers/net/ethernet/mellanox/mlx5/core/pagealloc.c
    @@ -243,6 +243,7 @@ static void free_4k(struct mlx5_core_dev
    static int alloc_system_page(struct mlx5_core_dev *dev, u16 func_id)
    {
    struct page *page;
    + u64 zero_addr = 1;
    u64 addr;
    int err;
    int nid = dev_to_node(&dev->pdev->dev);
    @@ -252,26 +253,35 @@ static int alloc_system_page(struct mlx5
    mlx5_core_warn(dev, "failed to allocate page\n");
    return -ENOMEM;
    }
    +map:
    addr = dma_map_page(&dev->pdev->dev, page, 0,
    PAGE_SIZE, DMA_BIDIRECTIONAL);
    if (dma_mapping_error(&dev->pdev->dev, addr)) {
    mlx5_core_warn(dev, "failed dma mapping page\n");
    err = -ENOMEM;
    - goto out_alloc;
    + goto err_mapping;
    }
    +
    + /* Firmware doesn't support page with physical address 0 */
    + if (addr == 0) {
    + zero_addr = addr;
    + goto map;
    + }
    +
    err = insert_page(dev, addr, page, func_id);
    if (err) {
    mlx5_core_err(dev, "failed to track allocated page\n");
    - goto out_mapping;
    + dma_unmap_page(&dev->pdev->dev, addr, PAGE_SIZE,
    + DMA_BIDIRECTIONAL);
    }

    - return 0;
    -
    -out_mapping:
    - dma_unmap_page(&dev->pdev->dev, addr, PAGE_SIZE, DMA_BIDIRECTIONAL);
    +err_mapping:
    + if (err)
    + __free_page(page);

    -out_alloc:
    - __free_page(page);
    + if (zero_addr == 0)
    + dma_unmap_page(&dev->pdev->dev, zero_addr, PAGE_SIZE,
    + DMA_BIDIRECTIONAL);

    return err;
    }

    \
     
     \ /
      Last update: 2020-05-08 15:10    [W:5.407 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site