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

Merge tag 'mlx5-net-next-5.15-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux

Saeed Mahameed says:

====================
Merge mlx5-next into net-next
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+293 -249
+26
drivers/infiniband/hw/mlx5/cmd.c
··· 206 206 kfree(in); 207 207 return err; 208 208 } 209 + 210 + int mlx5_cmd_uar_alloc(struct mlx5_core_dev *dev, u32 *uarn, u16 uid) 211 + { 212 + u32 out[MLX5_ST_SZ_DW(alloc_uar_out)] = {}; 213 + u32 in[MLX5_ST_SZ_DW(alloc_uar_in)] = {}; 214 + int err; 215 + 216 + MLX5_SET(alloc_uar_in, in, opcode, MLX5_CMD_OP_ALLOC_UAR); 217 + MLX5_SET(alloc_uar_in, in, uid, uid); 218 + err = mlx5_cmd_exec_inout(dev, alloc_uar, in, out); 219 + if (err) 220 + return err; 221 + 222 + *uarn = MLX5_GET(alloc_uar_out, out, uar); 223 + return 0; 224 + } 225 + 226 + int mlx5_cmd_uar_dealloc(struct mlx5_core_dev *dev, u32 uarn, u16 uid) 227 + { 228 + u32 in[MLX5_ST_SZ_DW(dealloc_uar_in)] = {}; 229 + 230 + MLX5_SET(dealloc_uar_in, in, opcode, MLX5_CMD_OP_DEALLOC_UAR); 231 + MLX5_SET(dealloc_uar_in, in, uar, uarn); 232 + MLX5_SET(dealloc_uar_in, in, uid, uid); 233 + return mlx5_cmd_exec_in(dev, dealloc_uar, in); 234 + }
+2
drivers/infiniband/hw/mlx5/cmd.h
··· 57 57 int mlx5_cmd_xrcd_dealloc(struct mlx5_core_dev *dev, u32 xrcdn, u16 uid); 58 58 int mlx5_cmd_mad_ifc(struct mlx5_core_dev *dev, const void *inb, void *outb, 59 59 u16 opmod, u8 port); 60 + int mlx5_cmd_uar_alloc(struct mlx5_core_dev *dev, u32 *uarn, u16 uid); 61 + int mlx5_cmd_uar_dealloc(struct mlx5_core_dev *dev, u32 uarn, u16 uid); 60 62 #endif /* MLX5_IB_CMD_H */
+4 -9
drivers/infiniband/hw/mlx5/devx.c
··· 1292 1292 struct mlx5_ib_dev *dev, 1293 1293 void *in, void *out) 1294 1294 { 1295 - struct mlx5_ib_devx_mr *devx_mr = &obj->devx_mr; 1296 - struct mlx5_core_mkey *mkey; 1295 + struct mlx5_ib_mkey *mkey = &obj->mkey; 1297 1296 void *mkc; 1298 1297 u8 key; 1299 1298 1300 - mkey = &devx_mr->mmkey; 1301 1299 mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry); 1302 1300 key = MLX5_GET(mkc, mkc, mkey_7_0); 1303 1301 mkey->key = mlx5_idx_to_mkey( 1304 1302 MLX5_GET(create_mkey_out, out, mkey_index)) | key; 1305 1303 mkey->type = MLX5_MKEY_INDIRECT_DEVX; 1306 - mkey->iova = MLX5_GET64(mkc, mkc, start_addr); 1307 - mkey->size = MLX5_GET64(mkc, mkc, len); 1308 - mkey->pd = MLX5_GET(mkc, mkc, pd); 1309 - devx_mr->ndescs = MLX5_GET(mkc, mkc, translations_octword_size); 1304 + mkey->ndescs = MLX5_GET(mkc, mkc, translations_octword_size); 1310 1305 init_waitqueue_head(&mkey->wait); 1311 1306 1312 1307 return mlx5r_store_odp_mkey(dev, mkey); ··· 1379 1384 dev = mlx5_udata_to_mdev(&attrs->driver_udata); 1380 1385 if (obj->flags & DEVX_OBJ_FLAGS_INDIRECT_MKEY && 1381 1386 xa_erase(&obj->ib_dev->odp_mkeys, 1382 - mlx5_base_mkey(obj->devx_mr.mmkey.key))) 1387 + mlx5_base_mkey(obj->mkey.key))) 1383 1388 /* 1384 1389 * The pagefault_single_data_segment() does commands against 1385 1390 * the mmkey, we must wait for that to stop before freeing the 1386 1391 * mkey, as another allocation could get the same mkey #. 1387 1392 */ 1388 - mlx5r_deref_wait_odp_mkey(&obj->devx_mr.mmkey); 1393 + mlx5r_deref_wait_odp_mkey(&obj->mkey); 1389 1394 1390 1395 if (obj->flags & DEVX_OBJ_FLAGS_DCT) 1391 1396 ret = mlx5_core_destroy_dct(obj->ib_dev, &obj->core_dct);
+1 -1
drivers/infiniband/hw/mlx5/devx.h
··· 16 16 u32 dinbox[MLX5_MAX_DESTROY_INBOX_SIZE_DW]; 17 17 u32 flags; 18 18 union { 19 - struct mlx5_ib_devx_mr devx_mr; 19 + struct mlx5_ib_mkey mkey; 20 20 struct mlx5_core_dct core_dct; 21 21 struct mlx5_core_cq core_cq; 22 22 u32 flow_counter_bulk_size;
+31 -24
drivers/infiniband/hw/mlx5/main.c
··· 1643 1643 1644 1644 bfregi = &context->bfregi; 1645 1645 for (i = 0; i < bfregi->num_static_sys_pages; i++) { 1646 - err = mlx5_cmd_alloc_uar(dev->mdev, &bfregi->sys_pages[i]); 1646 + err = mlx5_cmd_uar_alloc(dev->mdev, &bfregi->sys_pages[i], 1647 + context->devx_uid); 1647 1648 if (err) 1648 1649 goto error; 1649 1650 ··· 1658 1657 1659 1658 error: 1660 1659 for (--i; i >= 0; i--) 1661 - if (mlx5_cmd_free_uar(dev->mdev, bfregi->sys_pages[i])) 1660 + if (mlx5_cmd_uar_dealloc(dev->mdev, bfregi->sys_pages[i], 1661 + context->devx_uid)) 1662 1662 mlx5_ib_warn(dev, "failed to free uar %d\n", i); 1663 1663 1664 1664 return err; ··· 1675 1673 for (i = 0; i < bfregi->num_sys_pages; i++) 1676 1674 if (i < bfregi->num_static_sys_pages || 1677 1675 bfregi->sys_pages[i] != MLX5_IB_INVALID_UAR_INDEX) 1678 - mlx5_cmd_free_uar(dev->mdev, bfregi->sys_pages[i]); 1676 + mlx5_cmd_uar_dealloc(dev->mdev, bfregi->sys_pages[i], 1677 + context->devx_uid); 1679 1678 } 1680 1679 1681 1680 int mlx5_ib_enable_lb(struct mlx5_ib_dev *dev, bool td, bool qp) ··· 1894 1891 if (req.num_low_latency_bfregs > req.total_num_bfregs - 1) 1895 1892 return -EINVAL; 1896 1893 1894 + if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) { 1895 + err = mlx5_ib_devx_create(dev, true); 1896 + if (err < 0) 1897 + goto out_ctx; 1898 + context->devx_uid = err; 1899 + } 1900 + 1897 1901 lib_uar_4k = req.lib_caps & MLX5_LIB_CAP_4K_UAR; 1898 1902 lib_uar_dyn = req.lib_caps & MLX5_LIB_CAP_DYN_UAR; 1899 1903 bfregi = &context->bfregi; ··· 1913 1903 /* updates req->total_num_bfregs */ 1914 1904 err = calc_total_bfregs(dev, lib_uar_4k, &req, bfregi); 1915 1905 if (err) 1916 - goto out_ctx; 1906 + goto out_devx; 1917 1907 1918 1908 mutex_init(&bfregi->lock); 1919 1909 bfregi->lib_uar_4k = lib_uar_4k; ··· 1921 1911 GFP_KERNEL); 1922 1912 if (!bfregi->count) { 1923 1913 err = -ENOMEM; 1924 - goto out_ctx; 1914 + goto out_devx; 1925 1915 } 1926 1916 1927 1917 bfregi->sys_pages = kcalloc(bfregi->num_sys_pages, ··· 1937 1927 goto out_sys_pages; 1938 1928 1939 1929 uar_done: 1940 - if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) { 1941 - err = mlx5_ib_devx_create(dev, true); 1942 - if (err < 0) 1943 - goto out_uars; 1944 - context->devx_uid = err; 1945 - } 1946 - 1947 1930 err = mlx5_ib_alloc_transport_domain(dev, &context->tdn, 1948 1931 context->devx_uid); 1949 1932 if (err) 1950 - goto out_devx; 1933 + goto out_uars; 1951 1934 1952 1935 INIT_LIST_HEAD(&context->db_page_list); 1953 1936 mutex_init(&context->db_page_mutex); ··· 1975 1972 1976 1973 out_mdev: 1977 1974 mlx5_ib_dealloc_transport_domain(dev, context->tdn, context->devx_uid); 1978 - out_devx: 1979 - if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) 1980 - mlx5_ib_devx_destroy(dev, context->devx_uid); 1981 1975 1982 1976 out_uars: 1983 1977 deallocate_uars(dev, context); ··· 1984 1984 1985 1985 out_count: 1986 1986 kfree(bfregi->count); 1987 + 1988 + out_devx: 1989 + if (req.flags & MLX5_IB_ALLOC_UCTX_DEVX) 1990 + mlx5_ib_devx_destroy(dev, context->devx_uid); 1987 1991 1988 1992 out_ctx: 1989 1993 return err; ··· 2025 2021 bfregi = &context->bfregi; 2026 2022 mlx5_ib_dealloc_transport_domain(dev, context->tdn, context->devx_uid); 2027 2023 2028 - if (context->devx_uid) 2029 - mlx5_ib_devx_destroy(dev, context->devx_uid); 2030 - 2031 2024 deallocate_uars(dev, context); 2032 2025 kfree(bfregi->sys_pages); 2033 2026 kfree(bfregi->count); 2027 + 2028 + if (context->devx_uid) 2029 + mlx5_ib_devx_destroy(dev, context->devx_uid); 2034 2030 } 2035 2031 2036 2032 static phys_addr_t uar_index2pfn(struct mlx5_ib_dev *dev, ··· 2123 2119 struct mlx5_user_mmap_entry *mentry = to_mmmap(entry); 2124 2120 struct mlx5_ib_dev *dev = to_mdev(entry->ucontext->device); 2125 2121 struct mlx5_var_table *var_table = &dev->var_table; 2122 + struct mlx5_ib_ucontext *context = to_mucontext(entry->ucontext); 2126 2123 2127 2124 switch (mentry->mmap_flag) { 2128 2125 case MLX5_IB_MMAP_TYPE_MEMIC: ··· 2138 2133 break; 2139 2134 case MLX5_IB_MMAP_TYPE_UAR_WC: 2140 2135 case MLX5_IB_MMAP_TYPE_UAR_NC: 2141 - mlx5_cmd_free_uar(dev->mdev, mentry->page_idx); 2136 + mlx5_cmd_uar_dealloc(dev->mdev, mentry->page_idx, 2137 + context->devx_uid); 2142 2138 kfree(mentry); 2143 2139 break; 2144 2140 default: ··· 2217 2211 bfregi->count[bfreg_dyn_idx]++; 2218 2212 mutex_unlock(&bfregi->lock); 2219 2213 2220 - err = mlx5_cmd_alloc_uar(dev->mdev, &uar_index); 2214 + err = mlx5_cmd_uar_alloc(dev->mdev, &uar_index, 2215 + context->devx_uid); 2221 2216 if (err) { 2222 2217 mlx5_ib_warn(dev, "UAR alloc failed\n"); 2223 2218 goto free_bfreg; ··· 2247 2240 if (!dyn_uar) 2248 2241 return err; 2249 2242 2250 - mlx5_cmd_free_uar(dev->mdev, idx); 2243 + mlx5_cmd_uar_dealloc(dev->mdev, idx, context->devx_uid); 2251 2244 2252 2245 free_bfreg: 2253 2246 mlx5_ib_free_bfreg(dev, bfregi, bfreg_dyn_idx); ··· 3496 3489 return ERR_PTR(-ENOMEM); 3497 3490 3498 3491 dev = to_mdev(c->ibucontext.device); 3499 - err = mlx5_cmd_alloc_uar(dev->mdev, &uar_index); 3492 + err = mlx5_cmd_uar_alloc(dev->mdev, &uar_index, c->devx_uid); 3500 3493 if (err) 3501 3494 goto end; 3502 3495 ··· 3514 3507 return entry; 3515 3508 3516 3509 err_insert: 3517 - mlx5_cmd_free_uar(dev->mdev, uar_index); 3510 + mlx5_cmd_uar_dealloc(dev->mdev, uar_index, c->devx_uid); 3518 3511 end: 3519 3512 kfree(entry); 3520 3513 return ERR_PTR(err);
+19 -12
drivers/infiniband/hw/mlx5/mlx5_ib.h
··· 619 619 u32 page_idx; 620 620 }; 621 621 622 + enum mlx5_mkey_type { 623 + MLX5_MKEY_MR = 1, 624 + MLX5_MKEY_MW, 625 + MLX5_MKEY_INDIRECT_DEVX, 626 + }; 627 + 628 + struct mlx5_ib_mkey { 629 + u32 key; 630 + enum mlx5_mkey_type type; 631 + unsigned int ndescs; 632 + struct wait_queue_head wait; 633 + refcount_t usecount; 634 + }; 635 + 622 636 #define MLX5_IB_MTT_PRESENT (MLX5_IB_MTT_READ | MLX5_IB_MTT_WRITE) 623 637 624 638 #define MLX5_IB_DM_MEMIC_ALLOWED_ACCESS (IB_ACCESS_LOCAL_WRITE |\ ··· 651 637 652 638 struct mlx5_ib_mr { 653 639 struct ib_mr ibmr; 654 - struct mlx5_core_mkey mmkey; 640 + struct mlx5_ib_mkey mmkey; 655 641 656 642 /* User MR data */ 657 643 struct mlx5_cache_ent *cache_ent; ··· 673 659 void *descs_alloc; 674 660 dma_addr_t desc_map; 675 661 int max_descs; 676 - int ndescs; 677 662 int desc_size; 678 663 int access_mode; 679 664 ··· 726 713 727 714 struct mlx5_ib_mw { 728 715 struct ib_mw ibmw; 729 - struct mlx5_core_mkey mmkey; 730 - int ndescs; 731 - }; 732 - 733 - struct mlx5_ib_devx_mr { 734 - struct mlx5_core_mkey mmkey; 735 - int ndescs; 716 + struct mlx5_ib_mkey mmkey; 736 717 }; 737 718 738 719 struct mlx5_ib_umr_context { ··· 1586 1579 } 1587 1580 1588 1581 static inline int mlx5r_store_odp_mkey(struct mlx5_ib_dev *dev, 1589 - struct mlx5_core_mkey *mmkey) 1582 + struct mlx5_ib_mkey *mmkey) 1590 1583 { 1591 1584 refcount_set(&mmkey->usecount, 1); 1592 1585 ··· 1595 1588 } 1596 1589 1597 1590 /* deref an mkey that can participate in ODP flow */ 1598 - static inline void mlx5r_deref_odp_mkey(struct mlx5_core_mkey *mmkey) 1591 + static inline void mlx5r_deref_odp_mkey(struct mlx5_ib_mkey *mmkey) 1599 1592 { 1600 1593 if (refcount_dec_and_test(&mmkey->usecount)) 1601 1594 wake_up(&mmkey->wait); 1602 1595 } 1603 1596 1604 1597 /* deref an mkey that can participate in ODP flow and wait for relese */ 1605 - static inline void mlx5r_deref_wait_odp_mkey(struct mlx5_core_mkey *mmkey) 1598 + static inline void mlx5r_deref_wait_odp_mkey(struct mlx5_ib_mkey *mmkey) 1606 1599 { 1607 1600 mlx5r_deref_odp_mkey(mmkey); 1608 1601 wait_event(mmkey->wait, refcount_read(&mmkey->usecount) == 0);
+42 -41
drivers/infiniband/hw/mlx5/mr.c
··· 88 88 MLX5_SET64(mkc, mkc, start_addr, start_addr); 89 89 } 90 90 91 - static void 92 - assign_mkey_variant(struct mlx5_ib_dev *dev, struct mlx5_core_mkey *mkey, 93 - u32 *in) 91 + static void assign_mkey_variant(struct mlx5_ib_dev *dev, 92 + struct mlx5_ib_mkey *mkey, u32 *in) 94 93 { 95 94 u8 key = atomic_inc_return(&dev->mkey_var); 96 95 void *mkc; ··· 99 100 mkey->key = key; 100 101 } 101 102 102 - static int 103 - mlx5_ib_create_mkey(struct mlx5_ib_dev *dev, struct mlx5_core_mkey *mkey, 104 - u32 *in, int inlen) 103 + static int mlx5_ib_create_mkey(struct mlx5_ib_dev *dev, 104 + struct mlx5_ib_mkey *mkey, u32 *in, int inlen) 105 105 { 106 + int ret; 107 + 106 108 assign_mkey_variant(dev, mkey, in); 107 - return mlx5_core_create_mkey(dev->mdev, mkey, in, inlen); 109 + ret = mlx5_core_create_mkey(dev->mdev, &mkey->key, in, inlen); 110 + if (!ret) 111 + init_waitqueue_head(&mkey->wait); 112 + 113 + return ret; 108 114 } 109 115 110 116 static int 111 117 mlx5_ib_create_mkey_cb(struct mlx5_ib_dev *dev, 112 - struct mlx5_core_mkey *mkey, 118 + struct mlx5_ib_mkey *mkey, 113 119 struct mlx5_async_ctx *async_ctx, 114 120 u32 *in, int inlen, u32 *out, int outlen, 115 121 struct mlx5_async_work *context) ··· 137 133 { 138 134 WARN_ON(xa_load(&dev->odp_mkeys, mlx5_base_mkey(mr->mmkey.key))); 139 135 140 - return mlx5_core_destroy_mkey(dev->mdev, &mr->mmkey); 136 + return mlx5_core_destroy_mkey(dev->mdev, mr->mmkey.key); 141 137 } 142 138 143 139 static void create_mkey_callback(int status, struct mlx5_async_work *context) ··· 264 260 goto free_in; 265 261 } 266 262 267 - err = mlx5_core_create_mkey(ent->dev->mdev, &mr->mmkey, in, inlen); 263 + err = mlx5_core_create_mkey(ent->dev->mdev, &mr->mmkey.key, in, inlen); 268 264 if (err) 269 265 goto free_mr; 270 266 267 + init_waitqueue_head(&mr->mmkey.wait); 271 268 mr->mmkey.type = MLX5_MKEY_MR; 272 269 WRITE_ONCE(ent->dev->cache.last_add, jiffies); 273 270 spin_lock_irq(&ent->lock); ··· 295 290 ent->available_mrs--; 296 291 ent->total_mrs--; 297 292 spin_unlock_irq(&ent->lock); 298 - mlx5_core_destroy_mkey(ent->dev->mdev, &mr->mmkey); 293 + mlx5_core_destroy_mkey(ent->dev->mdev, mr->mmkey.key); 299 294 kfree(mr); 300 295 spin_lock_irq(&ent->lock); 301 296 } ··· 663 658 ent->available_mrs--; 664 659 ent->total_mrs--; 665 660 spin_unlock_irq(&ent->lock); 666 - mlx5_core_destroy_mkey(dev->mdev, &mr->mmkey); 661 + mlx5_core_destroy_mkey(dev->mdev, mr->mmkey.key); 667 662 } 668 663 669 664 list_for_each_entry_safe(mr, tmp_mr, &del_list, list) { ··· 916 911 } 917 912 918 913 static void set_mr_fields(struct mlx5_ib_dev *dev, struct mlx5_ib_mr *mr, 919 - u64 length, int access_flags) 914 + u64 length, int access_flags, u64 iova) 920 915 { 921 916 mr->ibmr.lkey = mr->mmkey.key; 922 917 mr->ibmr.rkey = mr->mmkey.key; 923 918 mr->ibmr.length = length; 924 919 mr->ibmr.device = &dev->ib_dev; 920 + mr->ibmr.iova = iova; 925 921 mr->access_flags = access_flags; 926 922 } 927 923 ··· 980 974 981 975 mr->ibmr.pd = pd; 982 976 mr->umem = umem; 983 - mr->mmkey.iova = iova; 984 - mr->mmkey.size = umem->length; 985 - mr->mmkey.pd = to_mpd(pd)->pdn; 986 977 mr->page_shift = order_base_2(page_size); 987 - set_mr_fields(dev, mr, umem->length, access_flags); 978 + set_mr_fields(dev, mr, umem->length, access_flags, iova); 988 979 989 980 return mr; 990 981 } ··· 1090 1087 wr->wr.opcode = MLX5_IB_WR_UMR; 1091 1088 wr->pd = mr->ibmr.pd; 1092 1089 wr->mkey = mr->mmkey.key; 1093 - wr->length = mr->mmkey.size; 1094 - wr->virt_addr = mr->mmkey.iova; 1090 + wr->length = mr->ibmr.length; 1091 + wr->virt_addr = mr->ibmr.iova; 1095 1092 wr->access_flags = mr->access_flags; 1096 1093 wr->page_shift = mr->page_shift; 1097 1094 wr->xlt_size = sg->length; ··· 1344 1341 mr->mmkey.type = MLX5_MKEY_MR; 1345 1342 mr->desc_size = sizeof(struct mlx5_mtt); 1346 1343 mr->umem = umem; 1347 - set_mr_fields(dev, mr, umem->length, access_flags); 1344 + set_mr_fields(dev, mr, umem->length, access_flags, iova); 1348 1345 kvfree(in); 1349 1346 1350 1347 mlx5_ib_dbg(dev, "mkey = 0x%x\n", mr->mmkey.key); ··· 1391 1388 1392 1389 kfree(in); 1393 1390 1394 - set_mr_fields(dev, mr, length, acc); 1391 + set_mr_fields(dev, mr, length, acc, start_addr); 1395 1392 1396 1393 return &mr->ibmr; 1397 1394 ··· 1712 1709 return err; 1713 1710 1714 1711 mr->access_flags = access_flags; 1715 - mr->mmkey.pd = to_mpd(pd)->pdn; 1716 1712 return 0; 1717 1713 } 1718 1714 ··· 1756 1754 1757 1755 if (flags & IB_MR_REREG_PD) { 1758 1756 mr->ibmr.pd = pd; 1759 - mr->mmkey.pd = to_mpd(pd)->pdn; 1760 1757 upd_flags |= MLX5_IB_UPD_XLT_PD; 1761 1758 } 1762 1759 if (flags & IB_MR_REREG_ACCESS) { ··· 1764 1763 } 1765 1764 1766 1765 mr->ibmr.length = new_umem->length; 1767 - mr->mmkey.iova = iova; 1768 - mr->mmkey.size = new_umem->length; 1766 + mr->ibmr.iova = iova; 1767 + mr->ibmr.length = new_umem->length; 1769 1768 mr->page_shift = order_base_2(page_size); 1770 1769 mr->umem = new_umem; 1771 1770 err = mlx5_ib_update_mr_pas(mr, upd_flags); ··· 1835 1834 mr->umem = NULL; 1836 1835 atomic_sub(ib_umem_num_pages(umem), &dev->mdev->priv.reg_pages); 1837 1836 1838 - return create_real_mr(new_pd, umem, mr->mmkey.iova, 1837 + return create_real_mr(new_pd, umem, mr->ibmr.iova, 1839 1838 new_access_flags); 1840 1839 } 1841 1840 ··· 2264 2263 struct mlx5_ib_dev *dev = to_mdev(ibmw->device); 2265 2264 int inlen = MLX5_ST_SZ_BYTES(create_mkey_in); 2266 2265 struct mlx5_ib_mw *mw = to_mmw(ibmw); 2266 + unsigned int ndescs; 2267 2267 u32 *in = NULL; 2268 2268 void *mkc; 2269 - int ndescs; 2270 2269 int err; 2271 2270 struct mlx5_ib_alloc_mw req = {}; 2272 2271 struct { ··· 2311 2310 2312 2311 mw->mmkey.type = MLX5_MKEY_MW; 2313 2312 ibmw->rkey = mw->mmkey.key; 2314 - mw->ndescs = ndescs; 2313 + mw->mmkey.ndescs = ndescs; 2315 2314 2316 2315 resp.response_length = 2317 2316 min(offsetofend(typeof(resp), response_length), udata->outlen); ··· 2331 2330 return 0; 2332 2331 2333 2332 free_mkey: 2334 - mlx5_core_destroy_mkey(dev->mdev, &mw->mmkey); 2333 + mlx5_core_destroy_mkey(dev->mdev, mw->mmkey.key); 2335 2334 free: 2336 2335 kfree(in); 2337 2336 return err; ··· 2350 2349 */ 2351 2350 mlx5r_deref_wait_odp_mkey(&mmw->mmkey); 2352 2351 2353 - return mlx5_core_destroy_mkey(dev->mdev, &mmw->mmkey); 2352 + return mlx5_core_destroy_mkey(dev->mdev, mmw->mmkey.key); 2354 2353 } 2355 2354 2356 2355 int mlx5_ib_check_mr_status(struct ib_mr *ibmr, u32 check_mask, ··· 2407 2406 mr->meta_length = 0; 2408 2407 if (data_sg_nents == 1) { 2409 2408 n++; 2410 - mr->ndescs = 1; 2409 + mr->mmkey.ndescs = 1; 2411 2410 if (data_sg_offset) 2412 2411 sg_offset = *data_sg_offset; 2413 2412 mr->data_length = sg_dma_len(data_sg) - sg_offset; ··· 2460 2459 if (sg_offset_p) 2461 2460 *sg_offset_p = sg_offset; 2462 2461 2463 - mr->ndescs = i; 2462 + mr->mmkey.ndescs = i; 2464 2463 mr->data_length = mr->ibmr.length; 2465 2464 2466 2465 if (meta_sg_nents) { ··· 2493 2492 struct mlx5_ib_mr *mr = to_mmr(ibmr); 2494 2493 __be64 *descs; 2495 2494 2496 - if (unlikely(mr->ndescs == mr->max_descs)) 2495 + if (unlikely(mr->mmkey.ndescs == mr->max_descs)) 2497 2496 return -ENOMEM; 2498 2497 2499 2498 descs = mr->descs; 2500 - descs[mr->ndescs++] = cpu_to_be64(addr | MLX5_EN_RD | MLX5_EN_WR); 2499 + descs[mr->mmkey.ndescs++] = cpu_to_be64(addr | MLX5_EN_RD | MLX5_EN_WR); 2501 2500 2502 2501 return 0; 2503 2502 } ··· 2507 2506 struct mlx5_ib_mr *mr = to_mmr(ibmr); 2508 2507 __be64 *descs; 2509 2508 2510 - if (unlikely(mr->ndescs + mr->meta_ndescs == mr->max_descs)) 2509 + if (unlikely(mr->mmkey.ndescs + mr->meta_ndescs == mr->max_descs)) 2511 2510 return -ENOMEM; 2512 2511 2513 2512 descs = mr->descs; 2514 - descs[mr->ndescs + mr->meta_ndescs++] = 2513 + descs[mr->mmkey.ndescs + mr->meta_ndescs++] = 2515 2514 cpu_to_be64(addr | MLX5_EN_RD | MLX5_EN_WR); 2516 2515 2517 2516 return 0; ··· 2527 2526 struct mlx5_ib_mr *pi_mr = mr->mtt_mr; 2528 2527 int n; 2529 2528 2530 - pi_mr->ndescs = 0; 2529 + pi_mr->mmkey.ndescs = 0; 2531 2530 pi_mr->meta_ndescs = 0; 2532 2531 pi_mr->meta_length = 0; 2533 2532 ··· 2561 2560 * metadata offset at the first metadata page 2562 2561 */ 2563 2562 pi_mr->pi_iova = (iova & page_mask) + 2564 - pi_mr->ndescs * ibmr->page_size + 2563 + pi_mr->mmkey.ndescs * ibmr->page_size + 2565 2564 (pi_mr->ibmr.iova & ~page_mask); 2566 2565 /* 2567 2566 * In order to use one MTT MR for data and metadata, we register ··· 2592 2591 struct mlx5_ib_mr *pi_mr = mr->klm_mr; 2593 2592 int n; 2594 2593 2595 - pi_mr->ndescs = 0; 2594 + pi_mr->mmkey.ndescs = 0; 2596 2595 pi_mr->meta_ndescs = 0; 2597 2596 pi_mr->meta_length = 0; 2598 2597 ··· 2627 2626 2628 2627 WARN_ON(ibmr->type != IB_MR_TYPE_INTEGRITY); 2629 2628 2630 - mr->ndescs = 0; 2629 + mr->mmkey.ndescs = 0; 2631 2630 mr->data_length = 0; 2632 2631 mr->data_iova = 0; 2633 2632 mr->meta_ndescs = 0; ··· 2683 2682 struct mlx5_ib_mr *mr = to_mmr(ibmr); 2684 2683 int n; 2685 2684 2686 - mr->ndescs = 0; 2685 + mr->mmkey.ndescs = 0; 2687 2686 2688 2687 ib_dma_sync_single_for_cpu(ibmr->device, mr->desc_map, 2689 2688 mr->desc_size * mr->max_descs,
+10 -28
drivers/infiniband/hw/mlx5/odp.c
··· 430 430 mr->umem = &odp->umem; 431 431 mr->ibmr.lkey = mr->mmkey.key; 432 432 mr->ibmr.rkey = mr->mmkey.key; 433 - mr->mmkey.iova = idx * MLX5_IMR_MTT_SIZE; 433 + mr->ibmr.iova = idx * MLX5_IMR_MTT_SIZE; 434 434 mr->parent = imr; 435 435 odp->private = mr; 436 436 ··· 500 500 } 501 501 502 502 imr->ibmr.pd = &pd->ibpd; 503 - imr->mmkey.iova = 0; 503 + imr->ibmr.iova = 0; 504 504 imr->umem = &umem_odp->umem; 505 505 imr->ibmr.lkey = imr->mmkey.key; 506 506 imr->ibmr.rkey = imr->mmkey.key; ··· 738 738 { 739 739 struct ib_umem_odp *odp = to_ib_umem_odp(mr->umem); 740 740 741 - if (unlikely(io_virt < mr->mmkey.iova)) 741 + if (unlikely(io_virt < mr->ibmr.iova)) 742 742 return -EFAULT; 743 743 744 744 if (mr->umem->is_dmabuf) ··· 747 747 if (!odp->is_implicit_odp) { 748 748 u64 user_va; 749 749 750 - if (check_add_overflow(io_virt - mr->mmkey.iova, 750 + if (check_add_overflow(io_virt - mr->ibmr.iova, 751 751 (u64)odp->umem.address, &user_va)) 752 752 return -EFAULT; 753 753 if (unlikely(user_va >= ib_umem_end(odp) || ··· 788 788 int depth; 789 789 }; 790 790 791 - static bool mkey_is_eq(struct mlx5_core_mkey *mmkey, u32 key) 791 + static bool mkey_is_eq(struct mlx5_ib_mkey *mmkey, u32 key) 792 792 { 793 793 if (!mmkey) 794 794 return false; 795 795 if (mmkey->type == MLX5_MKEY_MW) 796 796 return mlx5_base_mkey(mmkey->key) == mlx5_base_mkey(key); 797 797 return mmkey->key == key; 798 - } 799 - 800 - static int get_indirect_num_descs(struct mlx5_core_mkey *mmkey) 801 - { 802 - struct mlx5_ib_mw *mw; 803 - struct mlx5_ib_devx_mr *devx_mr; 804 - 805 - if (mmkey->type == MLX5_MKEY_MW) { 806 - mw = container_of(mmkey, struct mlx5_ib_mw, mmkey); 807 - return mw->ndescs; 808 - } 809 - 810 - devx_mr = container_of(mmkey, struct mlx5_ib_devx_mr, 811 - mmkey); 812 - return devx_mr->ndescs; 813 798 } 814 799 815 800 /* ··· 816 831 { 817 832 int npages = 0, ret, i, outlen, cur_outlen = 0, depth = 0; 818 833 struct pf_frame *head = NULL, *frame; 819 - struct mlx5_core_mkey *mmkey; 834 + struct mlx5_ib_mkey *mmkey; 820 835 struct mlx5_ib_mr *mr; 821 836 struct mlx5_klm *pklm; 822 837 u32 *out = NULL; 823 838 size_t offset; 824 - int ndescs; 825 839 826 840 io_virt += *bytes_committed; 827 841 bcnt -= *bytes_committed; ··· 869 885 870 886 case MLX5_MKEY_MW: 871 887 case MLX5_MKEY_INDIRECT_DEVX: 872 - ndescs = get_indirect_num_descs(mmkey); 873 - 874 888 if (depth >= MLX5_CAP_GEN(dev->mdev, max_indirection)) { 875 889 mlx5_ib_dbg(dev, "indirection level exceeded\n"); 876 890 ret = -EFAULT; ··· 876 894 } 877 895 878 896 outlen = MLX5_ST_SZ_BYTES(query_mkey_out) + 879 - sizeof(*pklm) * (ndescs - 2); 897 + sizeof(*pklm) * (mmkey->ndescs - 2); 880 898 881 899 if (outlen > cur_outlen) { 882 900 kfree(out); ··· 891 909 pklm = (struct mlx5_klm *)MLX5_ADDR_OF(query_mkey_out, out, 892 910 bsf0_klm0_pas_mtt0_1); 893 911 894 - ret = mlx5_core_query_mkey(dev->mdev, mmkey, out, outlen); 912 + ret = mlx5_core_query_mkey(dev->mdev, mmkey->key, out, outlen); 895 913 if (ret) 896 914 goto end; 897 915 898 916 offset = io_virt - MLX5_GET64(query_mkey_out, out, 899 917 memory_key_mkey_entry.start_addr); 900 918 901 - for (i = 0; bcnt && i < ndescs; i++, pklm++) { 919 + for (i = 0; bcnt && i < mmkey->ndescs; i++, pklm++) { 902 920 if (offset >= be32_to_cpu(pklm->bcount)) { 903 921 offset -= be32_to_cpu(pklm->bcount); 904 922 continue; ··· 1686 1704 u32 lkey) 1687 1705 { 1688 1706 struct mlx5_ib_dev *dev = to_mdev(pd->device); 1689 - struct mlx5_core_mkey *mmkey; 1690 1707 struct mlx5_ib_mr *mr = NULL; 1708 + struct mlx5_ib_mkey *mmkey; 1691 1709 1692 1710 xa_lock(&dev->odp_mkeys); 1693 1711 mmkey = xa_load(&dev->odp_mkeys, mlx5_base_mkey(lkey));
+5 -5
drivers/infiniband/hw/mlx5/wr.c
··· 217 217 static void set_reg_umr_seg(struct mlx5_wqe_umr_ctrl_seg *umr, 218 218 struct mlx5_ib_mr *mr, u8 flags, bool atomic) 219 219 { 220 - int size = (mr->ndescs + mr->meta_ndescs) * mr->desc_size; 220 + int size = (mr->mmkey.ndescs + mr->meta_ndescs) * mr->desc_size; 221 221 222 222 memset(umr, 0, sizeof(*umr)); 223 223 ··· 374 374 struct mlx5_ib_mr *mr, 375 375 u32 key, int access) 376 376 { 377 - int ndescs = ALIGN(mr->ndescs + mr->meta_ndescs, 8) >> 1; 377 + int ndescs = ALIGN(mr->mmkey.ndescs + mr->meta_ndescs, 8) >> 1; 378 378 379 379 memset(seg, 0, sizeof(*seg)); 380 380 ··· 439 439 struct mlx5_ib_mr *mr, 440 440 struct mlx5_ib_pd *pd) 441 441 { 442 - int bcount = mr->desc_size * (mr->ndescs + mr->meta_ndescs); 442 + int bcount = mr->desc_size * (mr->mmkey.ndescs + mr->meta_ndescs); 443 443 444 444 dseg->addr = cpu_to_be64(mr->desc_map); 445 445 dseg->byte_count = cpu_to_be32(ALIGN(bcount, 64)); ··· 861 861 struct mlx5_ib_mr *mr = to_mmr(wr->mr); 862 862 struct mlx5_ib_pd *pd = to_mpd(qp->ibqp.pd); 863 863 struct mlx5_ib_dev *dev = to_mdev(pd->ibpd.device); 864 - int mr_list_size = (mr->ndescs + mr->meta_ndescs) * mr->desc_size; 864 + int mr_list_size = (mr->mmkey.ndescs + mr->meta_ndescs) * mr->desc_size; 865 865 bool umr_inline = mr_list_size <= MLX5_IB_SQ_UMR_INLINE_THRESHOLD; 866 866 bool atomic = wr->access & IB_ACCESS_REMOTE_ATOMIC; 867 867 u8 flags = 0; ··· 1111 1111 memset(&pa_pi_mr, 0, sizeof(struct mlx5_ib_mr)); 1112 1112 /* No UMR, use local_dma_lkey */ 1113 1113 pa_pi_mr.ibmr.lkey = mr->ibmr.pd->local_dma_lkey; 1114 - pa_pi_mr.ndescs = mr->ndescs; 1114 + pa_pi_mr.mmkey.ndescs = mr->mmkey.ndescs; 1115 1115 pa_pi_mr.data_length = mr->data_length; 1116 1116 pa_pi_mr.data_iova = mr->data_iova; 1117 1117 if (mr->meta_ndescs) {
+3 -3
drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c
··· 745 745 MLX5_SET(mtrc_conf, in, trace_mode, TRACE_TO_MEMORY); 746 746 MLX5_SET(mtrc_conf, in, log_trace_buffer_size, 747 747 ilog2(TRACER_BUFFER_PAGE_NUM)); 748 - MLX5_SET(mtrc_conf, in, trace_mkey, tracer->buff.mkey.key); 748 + MLX5_SET(mtrc_conf, in, trace_mkey, tracer->buff.mkey); 749 749 750 750 err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), 751 751 MLX5_REG_MTRC_CONF, 0, 1); ··· 1028 1028 1029 1029 err_notifier_unregister: 1030 1030 mlx5_eq_notifier_unregister(dev, &tracer->nb); 1031 - mlx5_core_destroy_mkey(dev, &tracer->buff.mkey); 1031 + mlx5_core_destroy_mkey(dev, tracer->buff.mkey); 1032 1032 err_dealloc_pd: 1033 1033 mlx5_core_dealloc_pd(dev, tracer->buff.pdn); 1034 1034 err_cancel_work: ··· 1051 1051 if (tracer->owner) 1052 1052 mlx5_fw_tracer_ownership_release(tracer); 1053 1053 1054 - mlx5_core_destroy_mkey(tracer->dev, &tracer->buff.mkey); 1054 + mlx5_core_destroy_mkey(tracer->dev, tracer->buff.mkey); 1055 1055 mlx5_core_dealloc_pd(tracer->dev, tracer->buff.pdn); 1056 1056 } 1057 1057
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.h
··· 89 89 void *log_buf; 90 90 dma_addr_t dma; 91 91 u32 size; 92 - struct mlx5_core_mkey mkey; 92 + u32 mkey; 93 93 u32 consumer_index; 94 94 } buff; 95 95
+5 -5
drivers/net/ethernet/mellanox/mlx5/core/diag/rsc_dump.c
··· 30 30 31 31 struct mlx5_rsc_dump { 32 32 u32 pdn; 33 - struct mlx5_core_mkey mkey; 33 + u32 mkey; 34 34 u16 fw_segment_type[MLX5_SGMT_TYPE_NUM]; 35 35 }; 36 36 ··· 89 89 return -ENOMEM; 90 90 91 91 in_seq_num = MLX5_GET(resource_dump, cmd->cmd, seq_num); 92 - MLX5_SET(resource_dump, cmd->cmd, mkey, rsc_dump->mkey.key); 92 + MLX5_SET(resource_dump, cmd->cmd, mkey, rsc_dump->mkey); 93 93 MLX5_SET64(resource_dump, cmd->cmd, address, dma); 94 94 95 95 err = mlx5_core_access_reg(dev, cmd->cmd, sizeof(cmd->cmd), cmd->cmd, ··· 202 202 } 203 203 204 204 static int mlx5_rsc_dump_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, 205 - struct mlx5_core_mkey *mkey) 205 + u32 *mkey) 206 206 { 207 207 int inlen = MLX5_ST_SZ_BYTES(create_mkey_in); 208 208 void *mkc; ··· 276 276 return err; 277 277 278 278 destroy_mkey: 279 - mlx5_core_destroy_mkey(dev, &rsc_dump->mkey); 279 + mlx5_core_destroy_mkey(dev, rsc_dump->mkey); 280 280 free_pd: 281 281 mlx5_core_dealloc_pd(dev, rsc_dump->pdn); 282 282 return err; ··· 287 287 if (IS_ERR_OR_NULL(dev->rsc_dump)) 288 288 return; 289 289 290 - mlx5_core_destroy_mkey(dev, &dev->rsc_dump->mkey); 290 + mlx5_core_destroy_mkey(dev, dev->rsc_dump->mkey); 291 291 mlx5_core_dealloc_pd(dev, dev->rsc_dump->pdn); 292 292 }
+2 -2
drivers/net/ethernet/mellanox/mlx5/core/en.h
··· 643 643 }; 644 644 645 645 struct mlx5e_shampo_hd { 646 - struct mlx5_core_mkey mkey; 646 + u32 mkey; 647 647 struct mlx5e_dma_info *info; 648 648 struct page *last_page; 649 649 u16 hd_per_wq; ··· 731 731 u8 wq_type; 732 732 u32 rqn; 733 733 struct mlx5_core_dev *mdev; 734 - struct mlx5_core_mkey umr_mkey; 734 + u32 umr_mkey; 735 735 struct mlx5e_dma_info wqe_overflow; 736 736 737 737 /* XDP read-mostly */
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/en/ptp.c
··· 682 682 c->tstamp = &priv->tstamp; 683 683 c->pdev = mlx5_core_dma_dev(priv->mdev); 684 684 c->netdev = priv->netdev; 685 - c->mkey_be = cpu_to_be32(priv->mdev->mlx5e_res.hw_objs.mkey.key); 685 + c->mkey_be = cpu_to_be32(priv->mdev->mlx5e_res.hw_objs.mkey); 686 686 c->num_tc = mlx5e_get_dcb_num_tc(params); 687 687 c->stats = &priv->ptp_stats.ch; 688 688 c->lag_port = lag_port;
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/en/trap.c
··· 137 137 t->tstamp = &priv->tstamp; 138 138 t->pdev = mlx5_core_dma_dev(priv->mdev); 139 139 t->netdev = priv->netdev; 140 - t->mkey_be = cpu_to_be32(priv->mdev->mlx5e_res.hw_objs.mkey.key); 140 + t->mkey_be = cpu_to_be32(priv->mdev->mlx5e_res.hw_objs.mkey); 141 141 t->stats = &priv->trap_stats.ch; 142 142 143 143 netif_napi_add(netdev, &t->napi, mlx5e_trap_napi_poll, 64);
+3 -3
drivers/net/ethernet/mellanox/mlx5/core/en_common.c
··· 47 47 } 48 48 49 49 static int mlx5e_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, 50 - struct mlx5_core_mkey *mkey) 50 + u32 *mkey) 51 51 { 52 52 int inlen = MLX5_ST_SZ_BYTES(create_mkey_in); 53 53 void *mkc; ··· 108 108 return 0; 109 109 110 110 err_destroy_mkey: 111 - mlx5_core_destroy_mkey(mdev, &res->mkey); 111 + mlx5_core_destroy_mkey(mdev, res->mkey); 112 112 err_dealloc_transport_domain: 113 113 mlx5_core_dealloc_transport_domain(mdev, res->td.tdn); 114 114 err_dealloc_pd: ··· 121 121 struct mlx5e_hw_objs *res = &mdev->mlx5e_res.hw_objs; 122 122 123 123 mlx5_free_bfreg(mdev, &res->bfreg); 124 - mlx5_core_destroy_mkey(mdev, &res->mkey); 124 + mlx5_core_destroy_mkey(mdev, res->mkey); 125 125 mlx5_core_dealloc_transport_domain(mdev, res->td.tdn); 126 126 mlx5_core_dealloc_pd(mdev, res->pdn); 127 127 memset(res, 0, sizeof(*res));
+11 -12
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
··· 273 273 } 274 274 275 275 static int mlx5e_create_umr_mtt_mkey(struct mlx5_core_dev *mdev, 276 - u64 npages, u8 page_shift, 277 - struct mlx5_core_mkey *umr_mkey, 276 + u64 npages, u8 page_shift, u32 *umr_mkey, 278 277 dma_addr_t filler_addr) 279 278 { 280 279 struct mlx5_mtt *mtt; ··· 324 325 325 326 static int mlx5e_create_umr_klm_mkey(struct mlx5_core_dev *mdev, 326 327 u64 nentries, 327 - struct mlx5_core_mkey *umr_mkey) 328 + u32 *umr_mkey) 328 329 { 329 330 int inlen; 330 331 void *mkc; ··· 518 519 goto err_hw_gro_data; 519 520 } 520 521 rq->mpwqe.shampo->key = 521 - cpu_to_be32(rq->mpwqe.shampo->mkey.key); 522 + cpu_to_be32(rq->mpwqe.shampo->mkey); 522 523 rq->mpwqe.shampo->hd_per_wqe = 523 524 mlx5e_shampo_hd_per_wqe(mdev, params, rqp); 524 525 wq_size = BIT(MLX5_GET(wq, wqc, log_wq_sz)); ··· 529 530 err_hw_gro_data: 530 531 mlx5e_rq_shampo_hd_info_free(rq); 531 532 err_shampo_info: 532 - mlx5_core_destroy_mkey(mdev, &rq->mpwqe.shampo->mkey); 533 + mlx5_core_destroy_mkey(mdev, rq->mpwqe.shampo->mkey); 533 534 err_shampo_hd: 534 535 mlx5e_rq_shampo_hd_free(rq); 535 536 out: ··· 543 544 544 545 kvfree(rq->hw_gro_data); 545 546 mlx5e_rq_shampo_hd_info_free(rq); 546 - mlx5_core_destroy_mkey(rq->mdev, &rq->mpwqe.shampo->mkey); 547 + mlx5_core_destroy_mkey(rq->mdev, rq->mpwqe.shampo->mkey); 547 548 mlx5e_rq_shampo_hd_free(rq); 548 549 } 549 550 ··· 599 600 err = mlx5e_create_rq_umr_mkey(mdev, rq); 600 601 if (err) 601 602 goto err_rq_drop_page; 602 - rq->mkey_be = cpu_to_be32(rq->umr_mkey.key); 603 + rq->mkey_be = cpu_to_be32(rq->umr_mkey); 603 604 604 605 err = mlx5e_rq_alloc_mpwqe_info(rq, node); 605 606 if (err) ··· 636 637 if (err) 637 638 goto err_rq_frags; 638 639 639 - rq->mkey_be = cpu_to_be32(mdev->mlx5e_res.hw_objs.mkey.key); 640 + rq->mkey_be = cpu_to_be32(mdev->mlx5e_res.hw_objs.mkey); 640 641 } 641 642 642 643 if (xsk) { ··· 727 728 case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ: 728 729 kvfree(rq->mpwqe.info); 729 730 err_rq_mkey: 730 - mlx5_core_destroy_mkey(mdev, &rq->umr_mkey); 731 + mlx5_core_destroy_mkey(mdev, rq->umr_mkey); 731 732 err_rq_drop_page: 732 733 mlx5e_free_mpwqe_rq_drop_page(rq); 733 734 break; ··· 760 761 switch (rq->wq_type) { 761 762 case MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ: 762 763 kvfree(rq->mpwqe.info); 763 - mlx5_core_destroy_mkey(rq->mdev, &rq->umr_mkey); 764 + mlx5_core_destroy_mkey(rq->mdev, rq->umr_mkey); 764 765 mlx5e_free_mpwqe_rq_drop_page(rq); 765 766 mlx5e_rq_free_shampo(rq); 766 767 break; ··· 819 820 if (test_bit(MLX5E_RQ_STATE_SHAMPO, &rq->state)) { 820 821 MLX5_SET(wq, wq, log_headers_buffer_entry_num, 821 822 order_base_2(rq->mpwqe.shampo->hd_per_wq)); 822 - MLX5_SET(wq, wq, headers_mkey, rq->mpwqe.shampo->mkey.key); 823 + MLX5_SET(wq, wq, headers_mkey, rq->mpwqe.shampo->mkey); 823 824 } 824 825 825 826 mlx5_fill_page_frag_array(&rq->wq_ctrl.buf, ··· 2204 2205 c->cpu = cpu; 2205 2206 c->pdev = mlx5_core_dma_dev(priv->mdev); 2206 2207 c->netdev = priv->netdev; 2207 - c->mkey_be = cpu_to_be32(priv->mdev->mlx5e_res.hw_objs.mkey.key); 2208 + c->mkey_be = cpu_to_be32(priv->mdev->mlx5e_res.hw_objs.mkey); 2208 2209 c->num_tc = mlx5e_get_dcb_num_tc(params); 2209 2210 c->xdp = !!params->xdp_prog; 2210 2211 c->stats = &priv->channel_stats[ix].ch;
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
··· 544 544 { 545 545 struct mlx5e_shampo_hd *shampo = rq->mpwqe.shampo; 546 546 u16 entries, pi, i, header_offset, err, wqe_bbs, new_entries; 547 - u32 lkey = rq->mdev->mlx5e_res.hw_objs.mkey.key; 547 + u32 lkey = rq->mdev->mlx5e_res.hw_objs.mkey; 548 548 struct page *page = shampo->last_page; 549 549 u64 addr = shampo->last_addr; 550 550 struct mlx5e_dma_info *dma_info;
+5 -5
drivers/net/ethernet/mellanox/mlx5/core/fpga/conn.c
··· 115 115 ix = conn->qp.rq.pc & (conn->qp.rq.size - 1); 116 116 data = mlx5_wq_cyc_get_wqe(&conn->qp.wq.rq, ix); 117 117 data->byte_count = cpu_to_be32(buf->sg[0].size); 118 - data->lkey = cpu_to_be32(conn->fdev->conn_res.mkey.key); 118 + data->lkey = cpu_to_be32(conn->fdev->conn_res.mkey); 119 119 data->addr = cpu_to_be64(buf->sg[0].dma_addr); 120 120 121 121 conn->qp.rq.pc++; ··· 155 155 if (!buf->sg[sgi].data) 156 156 break; 157 157 data->byte_count = cpu_to_be32(buf->sg[sgi].size); 158 - data->lkey = cpu_to_be32(conn->fdev->conn_res.mkey.key); 158 + data->lkey = cpu_to_be32(conn->fdev->conn_res.mkey); 159 159 data->addr = cpu_to_be64(buf->sg[sgi].dma_addr); 160 160 data++; 161 161 size++; ··· 221 221 } 222 222 223 223 static int mlx5_fpga_conn_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, 224 - struct mlx5_core_mkey *mkey) 224 + u32 *mkey) 225 225 { 226 226 int inlen = MLX5_ST_SZ_BYTES(create_mkey_in); 227 227 void *mkc; ··· 978 978 mlx5_fpga_err(fdev, "create mkey failed, %d\n", err); 979 979 goto err_dealloc_pd; 980 980 } 981 - mlx5_fpga_dbg(fdev, "Created mkey 0x%x\n", fdev->conn_res.mkey.key); 981 + mlx5_fpga_dbg(fdev, "Created mkey 0x%x\n", fdev->conn_res.mkey); 982 982 983 983 return 0; 984 984 ··· 994 994 995 995 void mlx5_fpga_conn_device_cleanup(struct mlx5_fpga_device *fdev) 996 996 { 997 - mlx5_core_destroy_mkey(fdev->mdev, &fdev->conn_res.mkey); 997 + mlx5_core_destroy_mkey(fdev->mdev, fdev->conn_res.mkey); 998 998 mlx5_core_dealloc_pd(fdev->mdev, fdev->conn_res.pdn); 999 999 mlx5_put_uars_page(fdev->mdev, fdev->conn_res.uar); 1000 1000 mlx5_nic_vport_disable_roce(fdev->mdev);
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/fpga/core.h
··· 54 54 /* QP Connection resources */ 55 55 struct { 56 56 u32 pdn; 57 - struct mlx5_core_mkey mkey; 57 + u32 mkey; 58 58 struct mlx5_uars_page *uar; 59 59 } conn_res; 60 60
+46 -8
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
··· 99 99 #define LEFTOVERS_NUM_LEVELS 1 100 100 #define LEFTOVERS_NUM_PRIOS 1 101 101 102 + #define RDMA_RX_COUNTERS_PRIO_NUM_LEVELS 1 103 + #define RDMA_TX_COUNTERS_PRIO_NUM_LEVELS 1 104 + 102 105 #define BY_PASS_PRIO_NUM_LEVELS 1 103 106 #define BY_PASS_MIN_LEVEL (ETHTOOL_MIN_LEVEL + MLX5_BY_PASS_NUM_PRIOS +\ 104 107 LEFTOVERS_NUM_PRIOS) ··· 209 206 } 210 207 }; 211 208 212 - #define RDMA_RX_BYPASS_PRIO 0 213 - #define RDMA_RX_KERNEL_PRIO 1 209 + enum { 210 + RDMA_RX_COUNTERS_PRIO, 211 + RDMA_RX_BYPASS_PRIO, 212 + RDMA_RX_KERNEL_PRIO, 213 + }; 214 + 215 + #define RDMA_RX_BYPASS_MIN_LEVEL MLX5_BY_PASS_NUM_REGULAR_PRIOS 216 + #define RDMA_RX_KERNEL_MIN_LEVEL (RDMA_RX_BYPASS_MIN_LEVEL + 1) 217 + #define RDMA_RX_COUNTERS_MIN_LEVEL (RDMA_RX_KERNEL_MIN_LEVEL + 2) 218 + 214 219 static struct init_tree_node rdma_rx_root_fs = { 215 220 .type = FS_TYPE_NAMESPACE, 216 - .ar_size = 2, 221 + .ar_size = 3, 217 222 .children = (struct init_tree_node[]) { 223 + [RDMA_RX_COUNTERS_PRIO] = 224 + ADD_PRIO(0, RDMA_RX_COUNTERS_MIN_LEVEL, 0, 225 + FS_CHAINING_CAPS, 226 + ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF, 227 + ADD_MULTIPLE_PRIO(MLX5_RDMA_RX_NUM_COUNTERS_PRIOS, 228 + RDMA_RX_COUNTERS_PRIO_NUM_LEVELS))), 218 229 [RDMA_RX_BYPASS_PRIO] = 219 - ADD_PRIO(0, MLX5_BY_PASS_NUM_REGULAR_PRIOS, 0, 230 + ADD_PRIO(0, RDMA_RX_BYPASS_MIN_LEVEL, 0, 220 231 FS_CHAINING_CAPS, 221 232 ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF, 222 233 ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_REGULAR_PRIOS, 223 234 BY_PASS_PRIO_NUM_LEVELS))), 224 235 [RDMA_RX_KERNEL_PRIO] = 225 - ADD_PRIO(0, MLX5_BY_PASS_NUM_REGULAR_PRIOS + 1, 0, 236 + ADD_PRIO(0, RDMA_RX_KERNEL_MIN_LEVEL, 0, 226 237 FS_CHAINING_CAPS, 227 238 ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN, 228 239 ADD_MULTIPLE_PRIO(1, 1))), 229 240 } 230 241 }; 231 242 243 + enum { 244 + RDMA_TX_COUNTERS_PRIO, 245 + RDMA_TX_BYPASS_PRIO, 246 + }; 247 + 248 + #define RDMA_TX_BYPASS_MIN_LEVEL MLX5_BY_PASS_NUM_PRIOS 249 + #define RDMA_TX_COUNTERS_MIN_LEVEL (RDMA_TX_BYPASS_MIN_LEVEL + 1) 250 + 232 251 static struct init_tree_node rdma_tx_root_fs = { 233 252 .type = FS_TYPE_NAMESPACE, 234 - .ar_size = 1, 253 + .ar_size = 2, 235 254 .children = (struct init_tree_node[]) { 236 - ADD_PRIO(0, MLX5_BY_PASS_NUM_PRIOS, 0, 255 + [RDMA_TX_COUNTERS_PRIO] = 256 + ADD_PRIO(0, RDMA_TX_COUNTERS_MIN_LEVEL, 0, 257 + FS_CHAINING_CAPS, 258 + ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF, 259 + ADD_MULTIPLE_PRIO(MLX5_RDMA_TX_NUM_COUNTERS_PRIOS, 260 + RDMA_TX_COUNTERS_PRIO_NUM_LEVELS))), 261 + [RDMA_TX_BYPASS_PRIO] = 262 + ADD_PRIO(0, RDMA_TX_BYPASS_MIN_LEVEL, 0, 237 263 FS_CHAINING_CAPS_RDMA_TX, 238 264 ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF, 239 - ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_PRIOS, 265 + ADD_MULTIPLE_PRIO(RDMA_TX_BYPASS_MIN_LEVEL, 240 266 BY_PASS_PRIO_NUM_LEVELS))), 241 267 } 242 268 }; ··· 2251 2219 prio = RDMA_RX_KERNEL_PRIO; 2252 2220 } else if (type == MLX5_FLOW_NAMESPACE_RDMA_TX) { 2253 2221 root_ns = steering->rdma_tx_root_ns; 2222 + } else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS) { 2223 + root_ns = steering->rdma_rx_root_ns; 2224 + prio = RDMA_RX_COUNTERS_PRIO; 2225 + } else if (type == MLX5_FLOW_NAMESPACE_RDMA_TX_COUNTERS) { 2226 + root_ns = steering->rdma_tx_root_ns; 2227 + prio = RDMA_TX_COUNTERS_PRIO; 2254 2228 } else { /* Must be NIC RX */ 2255 2229 root_ns = steering->root_ns; 2256 2230 prio = type;
+10 -17
drivers/net/ethernet/mellanox/mlx5/core/mr.c
··· 35 35 #include <linux/mlx5/driver.h> 36 36 #include "mlx5_core.h" 37 37 38 - int mlx5_core_create_mkey(struct mlx5_core_dev *dev, 39 - struct mlx5_core_mkey *mkey, 40 - u32 *in, int inlen) 38 + int mlx5_core_create_mkey(struct mlx5_core_dev *dev, u32 *mkey, u32 *in, 39 + int inlen) 41 40 { 42 41 u32 lout[MLX5_ST_SZ_DW(create_mkey_out)] = {}; 43 42 u32 mkey_index; 44 - void *mkc; 45 43 int err; 46 44 47 45 MLX5_SET(create_mkey_in, in, opcode, MLX5_CMD_OP_CREATE_MKEY); ··· 48 50 if (err) 49 51 return err; 50 52 51 - mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry); 52 53 mkey_index = MLX5_GET(create_mkey_out, lout, mkey_index); 53 - mkey->iova = MLX5_GET64(mkc, mkc, start_addr); 54 - mkey->size = MLX5_GET64(mkc, mkc, len); 55 - mkey->key = (u32)mlx5_mkey_variant(mkey->key) | mlx5_idx_to_mkey(mkey_index); 56 - mkey->pd = MLX5_GET(mkc, mkc, pd); 57 - init_waitqueue_head(&mkey->wait); 54 + *mkey = MLX5_GET(create_mkey_in, in, memory_key_mkey_entry.mkey_7_0) | 55 + mlx5_idx_to_mkey(mkey_index); 58 56 59 - mlx5_core_dbg(dev, "out 0x%x, mkey 0x%x\n", mkey_index, mkey->key); 57 + mlx5_core_dbg(dev, "out 0x%x, mkey 0x%x\n", mkey_index, *mkey); 60 58 return 0; 61 59 } 62 60 EXPORT_SYMBOL(mlx5_core_create_mkey); 63 61 64 - int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, 65 - struct mlx5_core_mkey *mkey) 62 + int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, u32 mkey) 66 63 { 67 64 u32 in[MLX5_ST_SZ_DW(destroy_mkey_in)] = {}; 68 65 69 66 MLX5_SET(destroy_mkey_in, in, opcode, MLX5_CMD_OP_DESTROY_MKEY); 70 - MLX5_SET(destroy_mkey_in, in, mkey_index, mlx5_mkey_to_idx(mkey->key)); 67 + MLX5_SET(destroy_mkey_in, in, mkey_index, mlx5_mkey_to_idx(mkey)); 71 68 return mlx5_cmd_exec_in(dev, destroy_mkey, in); 72 69 } 73 70 EXPORT_SYMBOL(mlx5_core_destroy_mkey); 74 71 75 - int mlx5_core_query_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mkey *mkey, 76 - u32 *out, int outlen) 72 + int mlx5_core_query_mkey(struct mlx5_core_dev *dev, u32 mkey, u32 *out, 73 + int outlen) 77 74 { 78 75 u32 in[MLX5_ST_SZ_DW(query_mkey_in)] = {}; 79 76 80 77 memset(out, 0, outlen); 81 78 MLX5_SET(query_mkey_in, in, opcode, MLX5_CMD_OP_QUERY_MKEY); 82 - MLX5_SET(query_mkey_in, in, mkey_index, mlx5_mkey_to_idx(mkey->key)); 79 + MLX5_SET(query_mkey_in, in, mkey_index, mlx5_mkey_to_idx(mkey)); 83 80 return mlx5_cmd_exec(dev, in, sizeof(in), out, outlen); 84 81 } 85 82 EXPORT_SYMBOL(mlx5_core_query_mkey);
+5 -5
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_icm_pool.c
··· 24 24 }; 25 25 26 26 struct mlx5dr_icm_mr { 27 - struct mlx5_core_mkey mkey; 27 + u32 mkey; 28 28 struct mlx5dr_icm_dm dm; 29 29 struct mlx5dr_domain *dmn; 30 30 size_t length; ··· 33 33 34 34 static int dr_icm_create_dm_mkey(struct mlx5_core_dev *mdev, 35 35 u32 pd, u64 length, u64 start_addr, int mode, 36 - struct mlx5_core_mkey *mkey) 36 + u32 *mkey) 37 37 { 38 38 u32 inlen = MLX5_ST_SZ_BYTES(create_mkey_in); 39 39 u32 in[MLX5_ST_SZ_DW(create_mkey_in)] = {}; ··· 116 116 return icm_mr; 117 117 118 118 free_mkey: 119 - mlx5_core_destroy_mkey(mdev, &icm_mr->mkey); 119 + mlx5_core_destroy_mkey(mdev, icm_mr->mkey); 120 120 free_dm: 121 121 mlx5_dm_sw_icm_dealloc(mdev, icm_mr->dm.type, icm_mr->dm.length, 0, 122 122 icm_mr->dm.addr, icm_mr->dm.obj_id); ··· 130 130 struct mlx5_core_dev *mdev = icm_mr->dmn->mdev; 131 131 struct mlx5dr_icm_dm *dm = &icm_mr->dm; 132 132 133 - mlx5_core_destroy_mkey(mdev, &icm_mr->mkey); 133 + mlx5_core_destroy_mkey(mdev, icm_mr->mkey); 134 134 mlx5_dm_sw_icm_dealloc(mdev, dm->type, dm->length, 0, 135 135 dm->addr, dm->obj_id); 136 136 kvfree(icm_mr); ··· 252 252 253 253 offset = mlx5dr_icm_pool_dm_type_to_entry_size(pool->icm_type) * seg; 254 254 255 - chunk->rkey = buddy_mem_pool->icm_mr->mkey.key; 255 + chunk->rkey = buddy_mem_pool->icm_mr->mkey; 256 256 chunk->mr_addr = offset; 257 257 chunk->icm_addr = 258 258 (uintptr_t)buddy_mem_pool->icm_mr->icm_start_addr + offset;
+5 -6
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_send.c
··· 350 350 send_info->read.length = send_info->write.length; 351 351 /* Read into the same write area */ 352 352 send_info->read.addr = (uintptr_t)send_info->write.addr; 353 - send_info->read.lkey = send_ring->mr->mkey.key; 353 + send_info->read.lkey = send_ring->mr->mkey; 354 354 355 355 if (send_ring->pending_wqe % send_ring->signal_th == 0) 356 356 send_info->read.send_flags = IB_SEND_SIGNALED; ··· 388 388 (void *)(uintptr_t)send_info->write.addr, 389 389 send_info->write.length); 390 390 send_info->write.addr = (uintptr_t)send_ring->mr->dma_addr + buff_offset; 391 - send_info->write.lkey = send_ring->mr->mkey.key; 391 + send_info->write.lkey = send_ring->mr->mkey; 392 392 } 393 393 394 394 send_ring->tx_head++; ··· 848 848 kfree(cq); 849 849 } 850 850 851 - static int 852 - dr_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, struct mlx5_core_mkey *mkey) 851 + static int dr_create_mkey(struct mlx5_core_dev *mdev, u32 pdn, u32 *mkey) 853 852 { 854 853 u32 in[MLX5_ST_SZ_DW(create_mkey_in)] = {}; 855 854 void *mkc; ··· 907 908 908 909 static void dr_dereg_mr(struct mlx5_core_dev *mdev, struct mlx5dr_mr *mr) 909 910 { 910 - mlx5_core_destroy_mkey(mdev, &mr->mkey); 911 + mlx5_core_destroy_mkey(mdev, mr->mkey); 911 912 dma_unmap_single(mlx5_core_dma_dev(mdev), mr->dma_addr, mr->size, 912 913 DMA_BIDIRECTIONAL); 913 914 kfree(mr); ··· 1038 1039 send_info.write.lkey = 0; 1039 1040 /* Using the sync_mr in order to write/read */ 1040 1041 send_info.remote_addr = (uintptr_t)send_ring->sync_mr->addr; 1041 - send_info.rkey = send_ring->sync_mr->mkey.key; 1042 + send_info.rkey = send_ring->sync_mr->mkey; 1042 1043 1043 1044 for (i = 0; i < num_of_sends_req; i++) { 1044 1045 ret = dr_postsend_icm_data(dmn, &send_info);
+1 -1
drivers/net/ethernet/mellanox/mlx5/core/steering/dr_types.h
··· 1264 1264 1265 1265 struct mlx5dr_mr { 1266 1266 struct mlx5_core_dev *mdev; 1267 - struct mlx5_core_mkey mkey; 1267 + u32 mkey; 1268 1268 dma_addr_t dma_addr; 1269 1269 void *addr; 1270 1270 size_t size;
+8 -8
drivers/net/ethernet/mellanox/mlx5/core/uar.c
··· 36 36 #include <linux/mlx5/driver.h> 37 37 #include "mlx5_core.h" 38 38 39 - int mlx5_cmd_alloc_uar(struct mlx5_core_dev *dev, u32 *uarn) 39 + static int mlx5_cmd_alloc_uar(struct mlx5_core_dev *dev, u32 *uarn) 40 40 { 41 41 u32 out[MLX5_ST_SZ_DW(alloc_uar_out)] = {}; 42 42 u32 in[MLX5_ST_SZ_DW(alloc_uar_in)] = {}; ··· 44 44 45 45 MLX5_SET(alloc_uar_in, in, opcode, MLX5_CMD_OP_ALLOC_UAR); 46 46 err = mlx5_cmd_exec_inout(dev, alloc_uar, in, out); 47 - if (!err) 48 - *uarn = MLX5_GET(alloc_uar_out, out, uar); 49 - return err; 50 - } 51 - EXPORT_SYMBOL(mlx5_cmd_alloc_uar); 47 + if (err) 48 + return err; 52 49 53 - int mlx5_cmd_free_uar(struct mlx5_core_dev *dev, u32 uarn) 50 + *uarn = MLX5_GET(alloc_uar_out, out, uar); 51 + return 0; 52 + } 53 + 54 + static int mlx5_cmd_free_uar(struct mlx5_core_dev *dev, u32 uarn) 54 55 { 55 56 u32 in[MLX5_ST_SZ_DW(dealloc_uar_in)] = {}; 56 57 ··· 59 58 MLX5_SET(dealloc_uar_in, in, uar, uarn); 60 59 return mlx5_cmd_exec_in(dev, dealloc_uar, in); 61 60 } 62 - EXPORT_SYMBOL(mlx5_cmd_free_uar); 63 61 64 62 static int uars_per_sys_page(struct mlx5_core_dev *mdev) 65 63 {
+4 -4
drivers/vdpa/mlx5/core/mlx5_vdpa.h
··· 15 15 u64 start; 16 16 u64 end; 17 17 u32 perm; 18 - struct mlx5_core_mkey mr; 18 + u32 mr; 19 19 struct sg_table sg_head; 20 20 int log_size; 21 21 int nsg; ··· 25 25 }; 26 26 27 27 struct mlx5_vdpa_mr { 28 - struct mlx5_core_mkey mkey; 28 + u32 mkey; 29 29 30 30 /* list of direct MRs descendants of this indirect mr */ 31 31 struct list_head head; ··· 99 99 void mlx5_vdpa_dealloc_transport_domain(struct mlx5_vdpa_dev *mvdev, u32 tdn); 100 100 int mlx5_vdpa_alloc_resources(struct mlx5_vdpa_dev *mvdev); 101 101 void mlx5_vdpa_free_resources(struct mlx5_vdpa_dev *mvdev); 102 - int mlx5_vdpa_create_mkey(struct mlx5_vdpa_dev *mvdev, struct mlx5_core_mkey *mkey, u32 *in, 102 + int mlx5_vdpa_create_mkey(struct mlx5_vdpa_dev *mvdev, u32 *mkey, u32 *in, 103 103 int inlen); 104 - int mlx5_vdpa_destroy_mkey(struct mlx5_vdpa_dev *mvdev, struct mlx5_core_mkey *mkey); 104 + int mlx5_vdpa_destroy_mkey(struct mlx5_vdpa_dev *mvdev, u32 mkey); 105 105 int mlx5_vdpa_handle_set_map(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb, 106 106 bool *change_map); 107 107 int mlx5_vdpa_create_mr(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *iotlb);
+4 -4
drivers/vdpa/mlx5/core/mr.c
··· 88 88 89 89 static void destroy_direct_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_direct_mr *mr) 90 90 { 91 - mlx5_vdpa_destroy_mkey(mvdev, &mr->mr); 91 + mlx5_vdpa_destroy_mkey(mvdev, mr->mr); 92 92 } 93 93 94 94 static u64 map_start(struct vhost_iotlb_map *map, struct mlx5_vdpa_direct_mr *mr) ··· 162 162 } 163 163 164 164 if (preve == dmr->start) { 165 - klm->key = cpu_to_be32(dmr->mr.key); 165 + klm->key = cpu_to_be32(dmr->mr); 166 166 klm->bcount = cpu_to_be32(klm_bcount(dmr->end - dmr->start)); 167 167 preve = dmr->end; 168 168 } else { ··· 217 217 218 218 static void destroy_indirect_key(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mkey) 219 219 { 220 - mlx5_vdpa_destroy_mkey(mvdev, &mkey->mkey); 220 + mlx5_vdpa_destroy_mkey(mvdev, mkey->mkey); 221 221 } 222 222 223 223 static int map_direct_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_direct_mr *mr, ··· 449 449 450 450 static void destroy_dma_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_mr *mr) 451 451 { 452 - mlx5_vdpa_destroy_mkey(mvdev, &mr->mkey); 452 + mlx5_vdpa_destroy_mkey(mvdev, mr->mkey); 453 453 } 454 454 455 455 static int dup_iotlb(struct mlx5_vdpa_dev *mvdev, struct vhost_iotlb *src)
+4 -9
drivers/vdpa/mlx5/core/resources.c
··· 198 198 mlx5_cmd_exec_in(mvdev->mdev, dealloc_transport_domain, in); 199 199 } 200 200 201 - int mlx5_vdpa_create_mkey(struct mlx5_vdpa_dev *mvdev, struct mlx5_core_mkey *mkey, u32 *in, 201 + int mlx5_vdpa_create_mkey(struct mlx5_vdpa_dev *mvdev, u32 *mkey, u32 *in, 202 202 int inlen) 203 203 { 204 204 u32 lout[MLX5_ST_SZ_DW(create_mkey_out)] = {}; 205 205 u32 mkey_index; 206 - void *mkc; 207 206 int err; 208 207 209 208 MLX5_SET(create_mkey_in, in, opcode, MLX5_CMD_OP_CREATE_MKEY); ··· 212 213 if (err) 213 214 return err; 214 215 215 - mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry); 216 216 mkey_index = MLX5_GET(create_mkey_out, lout, mkey_index); 217 - mkey->iova = MLX5_GET64(mkc, mkc, start_addr); 218 - mkey->size = MLX5_GET64(mkc, mkc, len); 219 - mkey->key |= mlx5_idx_to_mkey(mkey_index); 220 - mkey->pd = MLX5_GET(mkc, mkc, pd); 217 + *mkey |= mlx5_idx_to_mkey(mkey_index); 221 218 return 0; 222 219 } 223 220 224 - int mlx5_vdpa_destroy_mkey(struct mlx5_vdpa_dev *mvdev, struct mlx5_core_mkey *mkey) 221 + int mlx5_vdpa_destroy_mkey(struct mlx5_vdpa_dev *mvdev, u32 mkey) 225 222 { 226 223 u32 in[MLX5_ST_SZ_DW(destroy_mkey_in)] = {}; 227 224 228 225 MLX5_SET(destroy_mkey_in, in, uid, mvdev->res.uid); 229 226 MLX5_SET(destroy_mkey_in, in, opcode, MLX5_CMD_OP_DESTROY_MKEY); 230 - MLX5_SET(destroy_mkey_in, in, mkey_index, mlx5_mkey_to_idx(mkey->key)); 227 + MLX5_SET(destroy_mkey_in, in, mkey_index, mlx5_mkey_to_idx(mkey)); 231 228 return mlx5_cmd_exec_in(mvdev->mdev, destroy_mkey, in); 232 229 } 233 230
+1 -1
drivers/vdpa/mlx5/net/mlx5_vnet.c
··· 865 865 MLX5_SET64(virtio_q, vq_ctx, desc_addr, mvq->desc_addr); 866 866 MLX5_SET64(virtio_q, vq_ctx, used_addr, mvq->device_addr); 867 867 MLX5_SET64(virtio_q, vq_ctx, available_addr, mvq->driver_addr); 868 - MLX5_SET(virtio_q, vq_ctx, virtio_q_mkey, ndev->mvdev.mr.mkey.key); 868 + MLX5_SET(virtio_q, vq_ctx, virtio_q_mkey, ndev->mvdev.mr.mkey); 869 869 MLX5_SET(virtio_q, vq_ctx, umem_1_id, mvq->umem1.id); 870 870 MLX5_SET(virtio_q, vq_ctx, umem_1_size, mvq->umem1.size); 871 871 MLX5_SET(virtio_q, vq_ctx, umem_2_id, mvq->umem2.id);
+2
include/linux/mlx5/device.h
··· 1493 1493 return MLX5_MIN_PKEY_TABLE_SIZE << pkey_sz; 1494 1494 } 1495 1495 1496 + #define MLX5_RDMA_RX_NUM_COUNTERS_PRIOS 2 1497 + #define MLX5_RDMA_TX_NUM_COUNTERS_PRIOS 1 1496 1498 #define MLX5_BY_PASS_NUM_REGULAR_PRIOS 16 1497 1499 #define MLX5_BY_PASS_NUM_DONT_TRAP_PRIOS 16 1498 1500 #define MLX5_BY_PASS_NUM_MULTICAST_PRIOS 1
+6 -26
include/linux/mlx5/driver.h
··· 357 357 u32 sigerr_count; 358 358 }; 359 359 360 - enum { 361 - MLX5_MKEY_MR = 1, 362 - MLX5_MKEY_MW, 363 - MLX5_MKEY_INDIRECT_DEVX, 364 - }; 365 - 366 - struct mlx5_core_mkey { 367 - u64 iova; 368 - u64 size; 369 - u32 key; 370 - u32 pd; 371 - u32 type; 372 - struct wait_queue_head wait; 373 - refcount_t usecount; 374 - }; 375 - 376 360 #define MLX5_24BIT_MASK ((1 << 24) - 1) 377 361 378 362 enum mlx5_res_type { ··· 638 654 struct mlx5e_hw_objs { 639 655 u32 pdn; 640 656 struct mlx5_td td; 641 - struct mlx5_core_mkey mkey; 657 + u32 mkey; 642 658 struct mlx5_sq_bfreg bfreg; 643 659 } hw_objs; 644 660 struct devlink_port dl_port; ··· 991 1007 bool mlx5_cmd_is_down(struct mlx5_core_dev *dev); 992 1008 993 1009 int mlx5_core_get_caps(struct mlx5_core_dev *dev, enum mlx5_cap_type cap_type); 994 - int mlx5_cmd_alloc_uar(struct mlx5_core_dev *dev, u32 *uarn); 995 - int mlx5_cmd_free_uar(struct mlx5_core_dev *dev, u32 uarn); 996 1010 void mlx5_health_flush(struct mlx5_core_dev *dev); 997 1011 void mlx5_health_cleanup(struct mlx5_core_dev *dev); 998 1012 int mlx5_health_init(struct mlx5_core_dev *dev); ··· 1008 1026 gfp_t flags, int npages); 1009 1027 void mlx5_free_cmd_mailbox_chain(struct mlx5_core_dev *dev, 1010 1028 struct mlx5_cmd_mailbox *head); 1011 - int mlx5_core_create_mkey(struct mlx5_core_dev *dev, 1012 - struct mlx5_core_mkey *mkey, 1013 - u32 *in, int inlen); 1014 - int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, 1015 - struct mlx5_core_mkey *mkey); 1016 - int mlx5_core_query_mkey(struct mlx5_core_dev *dev, struct mlx5_core_mkey *mkey, 1017 - u32 *out, int outlen); 1029 + int mlx5_core_create_mkey(struct mlx5_core_dev *dev, u32 *mkey, u32 *in, 1030 + int inlen); 1031 + int mlx5_core_destroy_mkey(struct mlx5_core_dev *dev, u32 mkey); 1032 + int mlx5_core_query_mkey(struct mlx5_core_dev *dev, u32 mkey, u32 *out, 1033 + int outlen); 1018 1034 int mlx5_core_alloc_pd(struct mlx5_core_dev *dev, u32 *pdn); 1019 1035 int mlx5_core_dealloc_pd(struct mlx5_core_dev *dev, u32 pdn); 1020 1036 int mlx5_pagealloc_init(struct mlx5_core_dev *dev);
+2
include/linux/mlx5/fs.h
··· 84 84 MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL, 85 85 MLX5_FLOW_NAMESPACE_RDMA_TX, 86 86 MLX5_FLOW_NAMESPACE_PORT_SEL, 87 + MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS, 88 + MLX5_FLOW_NAMESPACE_RDMA_TX_COUNTERS, 87 89 }; 88 90 89 91 enum {
+21 -5
include/linux/mlx5/mlx5_ifc.h
··· 343 343 u8 outer_geneve_oam[0x1]; 344 344 u8 outer_geneve_protocol_type[0x1]; 345 345 u8 outer_geneve_opt_len[0x1]; 346 - u8 reserved_at_1e[0x1]; 346 + u8 source_vhca_port[0x1]; 347 347 u8 source_eswitch_port[0x1]; 348 348 349 349 u8 inner_dmac[0x1]; ··· 392 392 u8 metadata_reg_c_2[0x1]; 393 393 u8 metadata_reg_c_1[0x1]; 394 394 u8 metadata_reg_c_0[0x1]; 395 + }; 396 + 397 + struct mlx5_ifc_flow_table_fields_supported_2_bits { 398 + u8 reserved_at_0[0xe]; 399 + u8 bth_opcode[0x1]; 400 + u8 reserved_at_f[0x11]; 401 + 402 + u8 reserved_at_20[0x60]; 395 403 }; 396 404 397 405 struct mlx5_ifc_flow_table_prop_layout_bits { ··· 548 540 union mlx5_ifc_gre_key_bits gre_key; 549 541 550 542 u8 vxlan_vni[0x18]; 551 - u8 reserved_at_b8[0x8]; 543 + u8 bth_opcode[0x8]; 552 544 553 545 u8 geneve_vni[0x18]; 554 546 u8 reserved_at_d8[0x7]; ··· 765 757 766 758 struct mlx5_ifc_flow_table_prop_layout_bits flow_table_properties_nic_transmit_sniffer; 767 759 768 - u8 reserved_at_e00[0x1200]; 760 + u8 reserved_at_e00[0x700]; 761 + 762 + struct mlx5_ifc_flow_table_fields_supported_2_bits ft_field_support_2_nic_receive_rdma; 763 + 764 + u8 reserved_at_1580[0x280]; 765 + 766 + struct mlx5_ifc_flow_table_fields_supported_2_bits ft_field_support_2_nic_transmit_rdma; 767 + 768 + u8 reserved_at_1880[0x780]; 769 769 770 770 u8 sw_steering_nic_rx_action_drop_icm_address[0x40]; 771 771 ··· 7923 7907 7924 7908 struct mlx5_ifc_dealloc_uar_in_bits { 7925 7909 u8 opcode[0x10]; 7926 - u8 reserved_at_10[0x10]; 7910 + u8 uid[0x10]; 7927 7911 7928 7912 u8 reserved_at_20[0x10]; 7929 7913 u8 op_mod[0x10]; ··· 8780 8764 8781 8765 struct mlx5_ifc_alloc_uar_in_bits { 8782 8766 u8 opcode[0x10]; 8783 - u8 reserved_at_10[0x10]; 8767 + u8 uid[0x10]; 8784 8768 8785 8769 u8 reserved_at_20[0x10]; 8786 8770 u8 op_mod[0x10];