lkml.org 
[lkml]   [2018]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 090/410] net/mlx4_core: Cleanup FMR unmapping flow
    3.16.57-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Tariq Toukan <tariqt@mellanox.com>

    commit fd4a3e2828b4ca35aef40e5bdc1ed7d87b3cb50a upstream.

    Remove redundant and not essential operations in fmr unmap/free.
    According to device spec, in FMR unmap it is sufficient to set
    ownership bit to SW. This allows remapping afterwards.

    Fixes: 8ad11fb6b073 ("IB/mlx4: Implement FMRs")
    Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
    Signed-off-by: Moshe Shemesh <moshe@mellanox.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/net/ethernet/mellanox/mlx4/mr.c | 40 +++++++++++++------------
    1 file changed, 21 insertions(+), 19 deletions(-)

    --- a/drivers/net/ethernet/mellanox/mlx4/mr.c
    +++ b/drivers/net/ethernet/mellanox/mlx4/mr.c
    @@ -944,30 +944,16 @@ EXPORT_SYMBOL_GPL(mlx4_fmr_enable);
    void mlx4_fmr_unmap(struct mlx4_dev *dev, struct mlx4_fmr *fmr,
    u32 *lkey, u32 *rkey)
    {
    - struct mlx4_cmd_mailbox *mailbox;
    - int err;
    -
    if (!fmr->maps)
    return;

    - fmr->maps = 0;
    + /* To unmap: it is sufficient to take back ownership from HW */
    + *(u8 *)fmr->mpt = MLX4_MPT_STATUS_SW;

    - mailbox = mlx4_alloc_cmd_mailbox(dev);
    - if (IS_ERR(mailbox)) {
    - err = PTR_ERR(mailbox);
    - pr_warn("mlx4_ib: mlx4_alloc_cmd_mailbox failed (%d)\n", err);
    - return;
    - }
    + /* Make sure MPT status is visible */
    + wmb();

    - err = mlx4_HW2SW_MPT(dev, NULL,
    - key_to_hw_index(fmr->mr.key) &
    - (dev->caps.num_mpts - 1));
    - mlx4_free_cmd_mailbox(dev, mailbox);
    - if (err) {
    - pr_warn("mlx4_ib: mlx4_HW2SW_MPT failed (%d)\n", err);
    - return;
    - }
    - fmr->mr.enabled = MLX4_MPT_EN_SW;
    + fmr->maps = 0;
    }
    EXPORT_SYMBOL_GPL(mlx4_fmr_unmap);

    @@ -977,6 +963,22 @@ int mlx4_fmr_free(struct mlx4_dev *dev,

    if (fmr->maps)
    return -EBUSY;
    + if (fmr->mr.enabled == MLX4_MPT_EN_HW) {
    + /* In case of FMR was enabled and unmapped
    + * make sure to give ownership of MPT back to HW
    + * so HW2SW_MPT command will success.
    + */
    + *(u8 *)fmr->mpt = MLX4_MPT_STATUS_SW;
    + /* Make sure MPT status is visible before changing MPT fields */
    + wmb();
    + fmr->mpt->length = 0;
    + fmr->mpt->start = 0;
    + /* Make sure MPT data is visible after changing MPT status */
    + wmb();
    + *(u8 *)fmr->mpt = MLX4_MPT_STATUS_HW;
    + /* make sure MPT status is visible */
    + wmb();
    + }

    ret = mlx4_mr_free(dev, &fmr->mr);
    if (ret)
    \
     
     \ /
      Last update: 2018-06-07 16:16    [W:3.754 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site