Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+62 -55
+1
drivers/infiniband/hw/mlx5/main.c
··· 6392 6392 spin_lock_init(&dev->reset_flow_resource_lock); 6393 6393 xa_init(&dev->odp_mkeys); 6394 6394 xa_init(&dev->sig_mrs); 6395 + spin_lock_init(&dev->mkey_lock); 6395 6396 6396 6397 spin_lock_init(&dev->dm.lock); 6397 6398 dev->dm.dev = mdev;
+5
drivers/infiniband/hw/mlx5/mlx5_ib.h
··· 994 994 /* sync used page count stats 995 995 */ 996 996 struct mlx5_ib_resources devr; 997 + 998 + /* protect mkey key part */ 999 + spinlock_t mkey_lock; 1000 + u8 mkey_key; 1001 + 997 1002 struct mlx5_mr_cache cache; 998 1003 struct timer_list delay_timer; 999 1004 /* Prevents soft lock on massive reg MRs */
+50 -15
drivers/infiniband/hw/mlx5/mr.c
··· 47 47 48 48 #define MLX5_UMR_ALIGN 2048 49 49 50 + static void 51 + create_mkey_callback(int status, struct mlx5_async_work *context); 52 + 53 + static void 54 + assign_mkey_variant(struct mlx5_ib_dev *dev, struct mlx5_core_mkey *mkey, 55 + u32 *in) 56 + { 57 + void *mkc; 58 + u8 key; 59 + 60 + spin_lock_irq(&dev->mkey_lock); 61 + key = dev->mkey_key++; 62 + spin_unlock_irq(&dev->mkey_lock); 63 + 64 + mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry); 65 + MLX5_SET(mkc, mkc, mkey_7_0, key); 66 + mkey->key = key; 67 + } 68 + 69 + static int 70 + mlx5_ib_create_mkey(struct mlx5_ib_dev *dev, struct mlx5_core_mkey *mkey, 71 + u32 *in, int inlen) 72 + { 73 + assign_mkey_variant(dev, mkey, in); 74 + return mlx5_core_create_mkey(dev->mdev, mkey, in, inlen); 75 + } 76 + 77 + static int 78 + mlx5_ib_create_mkey_cb(struct mlx5_ib_dev *dev, 79 + struct mlx5_core_mkey *mkey, 80 + struct mlx5_async_ctx *async_ctx, 81 + u32 *in, int inlen, u32 *out, int outlen, 82 + struct mlx5_async_work *context) 83 + { 84 + MLX5_SET(create_mkey_in, in, opcode, MLX5_CMD_OP_CREATE_MKEY); 85 + assign_mkey_variant(dev, mkey, in); 86 + return mlx5_cmd_exec_cb(async_ctx, in, inlen, out, outlen, 87 + create_mkey_callback, context); 88 + } 89 + 50 90 static void clean_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr); 51 91 static void dereg_mr(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr); 52 92 static int mr_cache_max_order(struct mlx5_ib_dev *dev); ··· 119 79 length + (start & (MLX5_ADAPTER_PAGE_SIZE - 1)); 120 80 } 121 81 122 - static void reg_mr_callback(int status, struct mlx5_async_work *context) 82 + static void create_mkey_callback(int status, struct mlx5_async_work *context) 123 83 { 124 84 struct mlx5_ib_mr *mr = 125 85 container_of(context, struct mlx5_ib_mr, cb_work); ··· 127 87 struct mlx5_mr_cache *cache = &dev->cache; 128 88 int c = order2idx(dev, mr->order); 129 89 struct mlx5_cache_ent *ent = &cache->ent[c]; 130 - u8 key; 131 90 unsigned long flags; 132 91 133 92 spin_lock_irqsave(&ent->lock, flags); ··· 141 102 } 142 103 143 104 mr->mmkey.type = MLX5_MKEY_MR; 144 - spin_lock_irqsave(&dev->mdev->priv.mkey_lock, flags); 145 - key = dev->mdev->priv.mkey_key++; 146 - spin_unlock_irqrestore(&dev->mdev->priv.mkey_lock, flags); 147 - mr->mmkey.key = mlx5_idx_to_mkey(MLX5_GET(create_mkey_out, mr->out, mkey_index)) | key; 105 + mr->mmkey.key |= mlx5_idx_to_mkey( 106 + MLX5_GET(create_mkey_out, mr->out, mkey_index)); 148 107 149 108 cache->last_add = jiffies; 150 109 ··· 200 163 spin_lock_irq(&ent->lock); 201 164 ent->pending++; 202 165 spin_unlock_irq(&ent->lock); 203 - err = mlx5_core_create_mkey_cb(dev->mdev, &mr->mmkey, 166 + err = mlx5_ib_create_mkey_cb(dev, &mr->mmkey, 204 167 &dev->async_ctx, in, inlen, 205 168 mr->out, sizeof(mr->out), 206 - reg_mr_callback, &mr->cb_work); 169 + &mr->cb_work); 207 170 if (err) { 208 171 spin_lock_irq(&ent->lock); 209 172 ent->pending--; ··· 722 685 { 723 686 struct mlx5_ib_dev *dev = to_mdev(pd->device); 724 687 int inlen = MLX5_ST_SZ_BYTES(create_mkey_in); 725 - struct mlx5_core_dev *mdev = dev->mdev; 726 688 struct mlx5_ib_mr *mr; 727 689 void *mkc; 728 690 u32 *in; ··· 743 707 MLX5_SET(mkc, mkc, length64, 1); 744 708 set_mkc_access_pd_addr_fields(mkc, acc, 0, pd); 745 709 746 - err = mlx5_core_create_mkey(mdev, &mr->mmkey, in, inlen); 710 + err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen); 747 711 if (err) 748 712 goto err_in; 749 713 ··· 1133 1097 get_octo_len(virt_addr, length, page_shift)); 1134 1098 } 1135 1099 1136 - err = mlx5_core_create_mkey(dev->mdev, &mr->mmkey, in, inlen); 1100 + err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen); 1137 1101 if (err) { 1138 1102 mlx5_ib_warn(dev, "create mkey failed\n"); 1139 1103 goto err_2; ··· 1173 1137 { 1174 1138 struct mlx5_ib_dev *dev = to_mdev(pd->device); 1175 1139 int inlen = MLX5_ST_SZ_BYTES(create_mkey_in); 1176 - struct mlx5_core_dev *mdev = dev->mdev; 1177 1140 struct mlx5_ib_mr *mr; 1178 1141 void *mkc; 1179 1142 u32 *in; ··· 1195 1160 MLX5_SET64(mkc, mkc, len, length); 1196 1161 set_mkc_access_pd_addr_fields(mkc, acc, start_addr, pd); 1197 1162 1198 - err = mlx5_core_create_mkey(mdev, &mr->mmkey, in, inlen); 1163 + err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen); 1199 1164 if (err) 1200 1165 goto err_in; 1201 1166 ··· 1673 1638 1674 1639 mlx5_set_umr_free_mkey(pd, in, ndescs, access_mode, page_shift); 1675 1640 1676 - err = mlx5_core_create_mkey(dev->mdev, &mr->mmkey, in, inlen); 1641 + err = mlx5_ib_create_mkey(dev, &mr->mmkey, in, inlen); 1677 1642 if (err) 1678 1643 goto err_free_descs; 1679 1644 ··· 1940 1905 MLX5_SET(mkc, mkc, en_rinval, !!((type == IB_MW_TYPE_2))); 1941 1906 MLX5_SET(mkc, mkc, qpn, 0xffffff); 1942 1907 1943 - err = mlx5_core_create_mkey(dev->mdev, &mw->mmkey, in, inlen); 1908 + err = mlx5_ib_create_mkey(dev, &mw->mmkey, in, inlen); 1944 1909 if (err) 1945 1910 goto free; 1946 1911
-1
drivers/net/ethernet/mellanox/mlx5/core/main.c
··· 1285 1285 mutex_init(&priv->alloc_mutex); 1286 1286 mutex_init(&priv->pgdir_mutex); 1287 1287 INIT_LIST_HEAD(&priv->pgdir_list); 1288 - spin_lock_init(&priv->mkey_lock); 1289 1288 1290 1289 priv->dbg_root = debugfs_create_dir(dev_name(dev->device), 1291 1290 mlx5_debugfs_root);
+6 -29
drivers/net/ethernet/mellanox/mlx5/core/mr.c
··· 36 36 #include <linux/mlx5/cmd.h> 37 37 #include "mlx5_core.h" 38 38 39 - int mlx5_core_create_mkey_cb(struct mlx5_core_dev *dev, 40 - struct mlx5_core_mkey *mkey, 41 - struct mlx5_async_ctx *async_ctx, u32 *in, 42 - int inlen, u32 *out, int outlen, 43 - mlx5_async_cbk_t callback, 44 - struct mlx5_async_work *context) 39 + int mlx5_core_create_mkey(struct mlx5_core_dev *dev, 40 + struct mlx5_core_mkey *mkey, 41 + u32 *in, int inlen) 45 42 { 46 43 u32 lout[MLX5_ST_SZ_DW(create_mkey_out)] = {0}; 47 44 u32 mkey_index; 48 45 void *mkc; 49 46 int err; 50 - u8 key; 51 - 52 - spin_lock_irq(&dev->priv.mkey_lock); 53 - key = dev->priv.mkey_key++; 54 - spin_unlock_irq(&dev->priv.mkey_lock); 55 - mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry); 56 47 57 48 MLX5_SET(create_mkey_in, in, opcode, MLX5_CMD_OP_CREATE_MKEY); 58 - MLX5_SET(mkc, mkc, mkey_7_0, key); 59 - 60 - if (callback) 61 - return mlx5_cmd_exec_cb(async_ctx, in, inlen, out, outlen, 62 - callback, context); 63 49 64 50 err = mlx5_cmd_exec(dev, in, inlen, lout, sizeof(lout)); 65 51 if (err) 66 52 return err; 67 53 54 + mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry); 68 55 mkey_index = MLX5_GET(create_mkey_out, lout, mkey_index); 69 56 mkey->iova = MLX5_GET64(mkc, mkc, start_addr); 70 57 mkey->size = MLX5_GET64(mkc, mkc, len); 71 - mkey->key = mlx5_idx_to_mkey(mkey_index) | key; 58 + mkey->key |= mlx5_idx_to_mkey(mkey_index); 72 59 mkey->pd = MLX5_GET(mkc, mkc, pd); 73 60 74 - mlx5_core_dbg(dev, "out 0x%x, key 0x%x, mkey 0x%x\n", 75 - mkey_index, key, mkey->key); 61 + mlx5_core_dbg(dev, "out 0x%x, mkey 0x%x\n", mkey_index, mkey->key); 76 62 return 0; 77 - } 78 - EXPORT_SYMBOL(mlx5_core_create_mkey_cb); 79 - 80 - int mlx5_core_create_mkey(struct mlx5_core_dev *dev, 81 - struct mlx5_core_mkey *mkey, 82 - u32 *in, int inlen) 83 - { 84 - return mlx5_core_create_mkey_cb(dev, mkey, NULL, in, inlen, 85 - NULL, 0, NULL, NULL); 86 63 } 87 64 EXPORT_SYMBOL(mlx5_core_create_mkey); 88 65
-10
include/linux/mlx5/driver.h
··· 575 575 /* end: alloc staff */ 576 576 struct dentry *dbg_root; 577 577 578 - /* protect mkey key part */ 579 - spinlock_t mkey_lock; 580 - u8 mkey_key; 581 - 582 578 struct list_head dev_list; 583 579 struct list_head ctx_list; 584 580 spinlock_t ctx_lock; ··· 944 948 gfp_t flags, int npages); 945 949 void mlx5_free_cmd_mailbox_chain(struct mlx5_core_dev *dev, 946 950 struct mlx5_cmd_mailbox *head); 947 - int mlx5_core_create_mkey_cb(struct mlx5_core_dev *dev, 948 - struct mlx5_core_mkey *mkey, 949 - struct mlx5_async_ctx *async_ctx, u32 *in, 950 - int inlen, u32 *out, int outlen, 951 - mlx5_async_cbk_t callback, 952 - struct mlx5_async_work *context); 953 951 int mlx5_core_create_mkey(struct mlx5_core_dev *dev, 954 952 struct mlx5_core_mkey *mkey, 955 953 u32 *in, int inlen);