Merge branch 'mlx5-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux
* 'mlx5-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux: mlx5: Remove uninitialized use of key in mlx5_core_create_mkey {IB,net}/mlx5: Move asynchronous mkey creation to mlx5_ib {IB,net}/mlx5: Assign mkey variant in mlx5_ib only {IB,net}/mlx5: Setup mkey variant before mr create command invocation Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
commit
e999a7343d
|
@ -6392,6 +6392,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;
|
||||
|
|
|
@ -994,6 +994,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 */
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
MLX5_SET(create_mkey_in, in, opcode, MLX5_CMD_OP_CREATE_MKEY);
|
||||
assign_mkey_variant(dev, mkey, in);
|
||||
return mlx5_cmd_exec_cb(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);
|
||||
|
@ -87,7 +127,6 @@ static void reg_mr_callback(int status, struct mlx5_async_work *context)
|
|||
struct mlx5_mr_cache *cache = &dev->cache;
|
||||
int c = order2idx(dev, mr->order);
|
||||
struct mlx5_cache_ent *ent = &cache->ent[c];
|
||||
u8 key;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ent->lock, flags);
|
||||
|
@ -102,10 +141,8 @@ static void reg_mr_callback(int status, struct mlx5_async_work *context)
|
|||
}
|
||||
|
||||
mr->mmkey.type = MLX5_MKEY_MR;
|
||||
spin_lock_irqsave(&dev->mdev->priv.mkey_lock, flags);
|
||||
key = dev->mdev->priv.mkey_key++;
|
||||
spin_unlock_irqrestore(&dev->mdev->priv.mkey_lock, flags);
|
||||
mr->mmkey.key = mlx5_idx_to_mkey(MLX5_GET(create_mkey_out, mr->out, mkey_index)) | key;
|
||||
mr->mmkey.key |= mlx5_idx_to_mkey(
|
||||
MLX5_GET(create_mkey_out, mr->out, mkey_index));
|
||||
|
||||
cache->last_add = jiffies;
|
||||
|
||||
|
@ -163,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--;
|
||||
|
@ -685,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;
|
||||
|
@ -707,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;
|
||||
|
||||
|
@ -1097,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;
|
||||
|
@ -1137,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;
|
||||
|
@ -1160,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;
|
||||
|
||||
|
@ -1638,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;
|
||||
|
||||
|
@ -1905,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;
|
||||
|
||||
|
|
|
@ -1285,7 +1285,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);
|
||||
|
|
|
@ -36,54 +36,31 @@
|
|||
#include <linux/mlx5/cmd.h>
|
||||
#include "mlx5_core.h"
|
||||
|
||||
int mlx5_core_create_mkey_cb(struct mlx5_core_dev *dev,
|
||||
struct mlx5_core_mkey *mkey,
|
||||
struct mlx5_async_ctx *async_ctx, u32 *in,
|
||||
int inlen, u32 *out, int outlen,
|
||||
mlx5_async_cbk_t callback,
|
||||
struct mlx5_async_work *context)
|
||||
int mlx5_core_create_mkey(struct mlx5_core_dev *dev,
|
||||
struct mlx5_core_mkey *mkey,
|
||||
u32 *in, int inlen)
|
||||
{
|
||||
u32 lout[MLX5_ST_SZ_DW(create_mkey_out)] = {0};
|
||||
u32 mkey_index;
|
||||
void *mkc;
|
||||
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);
|
||||
|
||||
if (callback)
|
||||
return mlx5_cmd_exec_cb(async_ctx, in, inlen, out, outlen,
|
||||
callback, context);
|
||||
|
||||
err = mlx5_cmd_exec(dev, in, inlen, lout, sizeof(lout));
|
||||
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);
|
||||
mkey->key = mlx5_idx_to_mkey(mkey_index) | key;
|
||||
mkey->key |= mlx5_idx_to_mkey(mkey_index);
|
||||
mkey->pd = MLX5_GET(mkc, mkc, pd);
|
||||
|
||||
mlx5_core_dbg(dev, "out 0x%x, key 0x%x, mkey 0x%x\n",
|
||||
mkey_index, key, mkey->key);
|
||||
mlx5_core_dbg(dev, "out 0x%x, mkey 0x%x\n", mkey_index, mkey->key);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_core_create_mkey_cb);
|
||||
|
||||
int mlx5_core_create_mkey(struct mlx5_core_dev *dev,
|
||||
struct mlx5_core_mkey *mkey,
|
||||
u32 *in, int inlen)
|
||||
{
|
||||
return mlx5_core_create_mkey_cb(dev, mkey, NULL, in, inlen,
|
||||
NULL, 0, NULL, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_core_create_mkey);
|
||||
|
||||
int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev,
|
||||
|
|
|
@ -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;
|
||||
|
@ -948,12 +944,6 @@ struct mlx5_cmd_mailbox *mlx5_alloc_cmd_mailbox_chain(struct mlx5_core_dev *dev,
|
|||
gfp_t flags, int npages);
|
||||
void mlx5_free_cmd_mailbox_chain(struct mlx5_core_dev *dev,
|
||||
struct mlx5_cmd_mailbox *head);
|
||||
int mlx5_core_create_mkey_cb(struct mlx5_core_dev *dev,
|
||||
struct mlx5_core_mkey *mkey,
|
||||
struct mlx5_async_ctx *async_ctx, u32 *in,
|
||||
int inlen, u32 *out, int outlen,
|
||||
mlx5_async_cbk_t callback,
|
||||
struct mlx5_async_work *context);
|
||||
int mlx5_core_create_mkey(struct mlx5_core_dev *dev,
|
||||
struct mlx5_core_mkey *mkey,
|
||||
u32 *in, int inlen);
|
||||
|
|
Loading…
Reference in New Issue