{IB,net}/mlx5: Assign mkey variant in mlx5_ib only
authorSaeed Mahameed <saeedm@mellanox.com>
Tue, 10 Mar 2020 08:22:28 +0000 (10:22 +0200)
committerLeon Romanovsky <leonro@mellanox.com>
Fri, 13 Mar 2020 13:48:04 +0000 (15:48 +0200)
mkey variant is not required for mlx5_core use, move the mkey variant
counter to mlx5_ib.

Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/infiniband/hw/mlx5/mr.c
drivers/net/ethernet/mellanox/mlx5/core/main.c
drivers/net/ethernet/mellanox/mlx5/core/mr.c
include/linux/mlx5/driver.h

index e4bcfa81b70a3eedb003dceeb9634b0fbbf2bd6a..fce863621414865b3bb477d22b06d69bcc550d81 100644 (file)
@@ -6390,6 +6390,7 @@ static int mlx5_ib_stage_init_init(struct mlx5_ib_dev *dev)
        spin_lock_init(&dev->reset_flow_resource_lock);
        xa_init(&dev->odp_mkeys);
        xa_init(&dev->sig_mrs);
+       spin_lock_init(&dev->mkey_lock);
 
        spin_lock_init(&dev->dm.lock);
        dev->dm.dev = mdev;
index d9bffcc935875b00c5e1bebf51bac72a16a16845..89a050e516a84f2b8096fc1a13895478410b9c9f 100644 (file)
@@ -992,6 +992,11 @@ struct mlx5_ib_dev {
        /* sync used page count stats
         */
        struct mlx5_ib_resources        devr;
+
+       /* protect mkey key part */
+       spinlock_t                      mkey_lock;
+       u8                              mkey_key;
+
        struct mlx5_mr_cache            cache;
        struct timer_list               delay_timer;
        /* Prevents soft lock on massive reg MRs */
index 45c3282dd5e1db0b34fe2fc9e4f2e1a349d74154..1b83d00e8ecd3b8e33135f71c6c17534ac6174c7 100644 (file)
@@ -47,6 +47,46 @@ enum {
 
 #define MLX5_UMR_ALIGN 2048
 
+static void
+create_mkey_callback(int status, struct mlx5_async_work *context);
+
+static void
+assign_mkey_variant(struct mlx5_ib_dev *dev, struct mlx5_core_mkey *mkey,
+                   u32 *in)
+{
+       void *mkc;
+       u8 key;
+
+       spin_lock_irq(&dev->mkey_lock);
+       key = dev->mkey_key++;
+       spin_unlock_irq(&dev->mkey_lock);
+
+       mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
+       MLX5_SET(mkc, mkc, mkey_7_0, key);
+       mkey->key = key;
+}
+
+static int
+mlx5_ib_create_mkey(struct mlx5_ib_dev *dev, struct mlx5_core_mkey *mkey,
+                   u32 *in, int inlen)
+{
+       assign_mkey_variant(dev, mkey, in);
+       return mlx5_core_create_mkey(dev->mdev, mkey, in, inlen);
+}
+
+static int
+mlx5_ib_create_mkey_cb(struct mlx5_ib_dev *dev,
+                      struct mlx5_core_mkey *mkey,
+                      struct mlx5_async_ctx *async_ctx,
+                      u32 *in, int inlen, u32 *out, int outlen,
+                      struct mlx5_async_work *context)
+{
+       assign_mkey_variant(dev, mkey, in);
+       return mlx5_core_create_mkey_cb(dev->mdev, mkey, async_ctx,
+                                       in, inlen, out, outlen,
+                                       create_mkey_callback, context);
+}
+
 static void clean_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr);
 static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr);
 static int mr_cache_max_order(struct mlx5_ib_dev *dev);
@@ -79,7 +119,7 @@ static bool use_umr_mtt_update(struct mlx5_ib_mr *mr, u64 start, u64 length)
                length + (start & (MLX5_ADAPTER_PAGE_SIZE - 1));
 }
 
-static void reg_mr_callback(int status, struct mlx5_async_work *context)
+static void create_mkey_callback(int status, struct mlx5_async_work *context)
 {
        struct mlx5_ib_mr *mr =
                container_of(context, struct mlx5_ib_mr, cb_work);
@@ -160,10 +200,10 @@ static int add_keys(struct mlx5_ib_dev *dev, int c, int num)
                spin_lock_irq(&ent->lock);
                ent->pending++;
                spin_unlock_irq(&ent->lock);
-               err = mlx5_core_create_mkey_cb(dev->mdev, &mr->mmkey,
+               err = mlx5_ib_create_mkey_cb(dev, &mr->mmkey,
                                               &dev->async_ctx, in, inlen,
                                               mr->out, sizeof(mr->out),
-                                              reg_mr_callback, &mr->cb_work);
+                                              &mr->cb_work);
                if (err) {
                        spin_lock_irq(&ent->lock);
                        ent->pending--;
@@ -682,7 +722,6 @@ struct ib_mr *mlx5_ib_get_dma_mr(struct ib_pd *pd, int acc)
 {
        struct mlx5_ib_dev *dev = to_mdev(pd->device);
        int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
-       struct mlx5_core_dev *mdev = dev->mdev;
        struct mlx5_ib_mr *mr;
        void *mkc;
        u32 *in;
@@ -704,7 +743,7 @@ struct ib_mr *mlx5_ib_get_dma_mr(struct ib_pd *pd, int acc)
        MLX5_SET(mkc, mkc, length64, 1);
        set_mkc_access_pd_addr_fields(mkc, acc, 0, pd);
 
-       err = mlx5_core_create_mkey(mdev, &mr->mmkey, in, inlen);
+       err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen);
        if (err)
                goto err_in;
 
@@ -1094,7 +1133,7 @@ static struct mlx5_ib_mr *reg_create(struct ib_mr *ibmr, struct ib_pd *pd,
                         get_octo_len(virt_addr, length, page_shift));
        }
 
-       err = mlx5_core_create_mkey(dev->mdev, &mr->mmkey, in, inlen);
+       err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen);
        if (err) {
                mlx5_ib_warn(dev, "create mkey failed\n");
                goto err_2;
@@ -1134,7 +1173,6 @@ static struct ib_mr *mlx5_ib_get_dm_mr(struct ib_pd *pd, u64 start_addr,
 {
        struct mlx5_ib_dev *dev = to_mdev(pd->device);
        int inlen = MLX5_ST_SZ_BYTES(create_mkey_in);
-       struct mlx5_core_dev *mdev = dev->mdev;
        struct mlx5_ib_mr *mr;
        void *mkc;
        u32 *in;
@@ -1157,7 +1195,7 @@ static struct ib_mr *mlx5_ib_get_dm_mr(struct ib_pd *pd, u64 start_addr,
        MLX5_SET64(mkc, mkc, len, length);
        set_mkc_access_pd_addr_fields(mkc, acc, start_addr, pd);
 
-       err = mlx5_core_create_mkey(mdev, &mr->mmkey, in, inlen);
+       err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen);
        if (err)
                goto err_in;
 
@@ -1635,7 +1673,7 @@ static int _mlx5_alloc_mkey_descs(struct ib_pd *pd, struct mlx5_ib_mr *mr,
 
        mlx5_set_umr_free_mkey(pd, in, ndescs, access_mode, page_shift);
 
-       err = mlx5_core_create_mkey(dev->mdev, &mr->mmkey, in, inlen);
+       err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen);
        if (err)
                goto err_free_descs;
 
@@ -1902,7 +1940,7 @@ struct ib_mw *mlx5_ib_alloc_mw(struct ib_pd *pd, enum ib_mw_type type,
        MLX5_SET(mkc, mkc, en_rinval, !!((type == IB_MW_TYPE_2)));
        MLX5_SET(mkc, mkc, qpn, 0xffffff);
 
-       err = mlx5_core_create_mkey(dev->mdev, &mw->mmkey, in, inlen);
+       err = mlx5_ib_create_mkey(dev, &mw->mmkey, in, inlen);
        if (err)
                goto free;
 
index f554cfddcf4e88e59a230743e351385899542c27..6b38ec72215a0042e4aa3dbae51cc2a7fabc9cd8 100644 (file)
@@ -1282,7 +1282,6 @@ static int mlx5_mdev_init(struct mlx5_core_dev *dev, int profile_idx)
        mutex_init(&priv->alloc_mutex);
        mutex_init(&priv->pgdir_mutex);
        INIT_LIST_HEAD(&priv->pgdir_list);
-       spin_lock_init(&priv->mkey_lock);
 
        priv->dbg_root = debugfs_create_dir(dev_name(dev->device),
                                            mlx5_debugfs_root);
index 770d13bb4f20ddb0945a9439d3ad34840c713550..51814d023efbd2f19ca6e437fead46894cafae72 100644 (file)
@@ -49,14 +49,7 @@ int mlx5_core_create_mkey_cb(struct mlx5_core_dev *dev,
        int err;
        u8 key;
 
-       spin_lock_irq(&dev->priv.mkey_lock);
-       key = dev->priv.mkey_key++;
-       spin_unlock_irq(&dev->priv.mkey_lock);
-       mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
-
        MLX5_SET(create_mkey_in, in, opcode, MLX5_CMD_OP_CREATE_MKEY);
-       MLX5_SET(mkc, mkc, mkey_7_0, key);
-       mkey->key = key;
 
        if (callback)
                return mlx5_cmd_exec_cb(async_ctx, in, inlen, out, outlen,
@@ -66,6 +59,7 @@ int mlx5_core_create_mkey_cb(struct mlx5_core_dev *dev,
        if (err)
                return err;
 
+       mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry);
        mkey_index = MLX5_GET(create_mkey_out, lout, mkey_index);
        mkey->iova = MLX5_GET64(mkc, mkc, start_addr);
        mkey->size = MLX5_GET64(mkc, mkc, len);
index f2b4225ed650924a5b5de4b90531161274dbb57d..e044703c056b1f240a4738e7986f9efa92a3b46a 100644 (file)
@@ -575,10 +575,6 @@ struct mlx5_priv {
        /* end: alloc staff */
        struct dentry          *dbg_root;
 
-       /* protect mkey key part */
-       spinlock_t              mkey_lock;
-       u8                      mkey_key;
-
        struct list_head        dev_list;
        struct list_head        ctx_list;
        spinlock_t              ctx_lock;