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

Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma

Pull rdma updates from Jason Gunthorpe:
"Many small changes across the subystem, some highlights:

- Usual driver cleanups in qedr, siw, erdma, hfi1, mlx4/5, irdma,
mthca, hns, and bnxt_re

- siw now works over tunnel and other netdevs with a MAC address by
removing assumptions about a MAC/GID from the connection manager

- "Doorbell Pacing" for bnxt_re - this is a best effort scheme to
allow userspace to slow down the doorbell rings if the HW gets full

- irdma egress VLAN priority, better QP/WQ sizing

- rxe bug fixes in queue draining and srq resizing

- Support more ethernet speed options in the core layer

- DMABUF support for bnxt_re

- Multi-stage MTT support for erdma to allow much bigger MR
registrations

- A irdma fix with a CVE that came in too late to go to -rc, missing
bounds checking for 0 length MRs"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (87 commits)
IB/hfi1: Reduce printing of errors during driver shut down
RDMA/hfi1: Move user SDMA system memory pinning code to its own file
RDMA/hfi1: Use list_for_each_entry() helper
RDMA/mlx5: Fix trailing */ formatting in block comment
RDMA/rxe: Fix redundant break statement in switch-case.
RDMA/efa: Fix wrong resources deallocation order
RDMA/siw: Call llist_reverse_order in siw_run_sq
RDMA/siw: Correct wrong debug message
RDMA/siw: Balance the reference of cep->kref in the error path
Revert "IB/isert: Fix incorrect release of isert connection"
RDMA/bnxt_re: Fix kernel doc errors
RDMA/irdma: Prevent zero-length STAG registration
RDMA/erdma: Implement hierarchical MTT
RDMA/erdma: Refactor the storage structure of MTT entries
RDMA/erdma: Renaming variable names and field names of struct erdma_mem
RDMA/hns: Support hns HW stats
RDMA/hns: Dump whole QP/CQ/MR resource in raw
RDMA/irdma: Add missing kernel-doc in irdma_setup_umode_qp()
RDMA/mlx4: Copy union directly
RDMA/irdma: Drop unused kernel push code
...

+2899 -1677
+11
drivers/infiniband/core/cache.c
··· 1457 1457 i); 1458 1458 goto err; 1459 1459 } 1460 + 1461 + if (rdma_protocol_iwarp(device, port)) { 1462 + struct net_device *ndev; 1463 + 1464 + ndev = ib_device_get_netdev(device, port); 1465 + if (!ndev) 1466 + continue; 1467 + RCU_INIT_POINTER(gid_attr.ndev, ndev); 1468 + dev_put(ndev); 1469 + } 1470 + 1460 1471 gid_attr.index = i; 1461 1472 tprops->subnet_prefix = 1462 1473 be64_to_cpu(gid_attr.gid.global.subnet_prefix);
+27 -5
drivers/infiniband/core/cma.c
··· 686 686 struct rdma_id_private *id_priv) 687 687 { 688 688 struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; 689 + const struct ib_gid_attr *sgid_attr = ERR_PTR(-ENODEV); 689 690 int bound_if_index = dev_addr->bound_dev_if; 690 - const struct ib_gid_attr *sgid_attr; 691 691 int dev_type = dev_addr->dev_type; 692 692 struct net_device *ndev = NULL; 693 693 694 694 if (!rdma_dev_access_netns(device, id_priv->id.route.addr.dev_addr.net)) 695 - return ERR_PTR(-ENODEV); 695 + goto out; 696 696 697 697 if ((dev_type == ARPHRD_INFINIBAND) && !rdma_protocol_ib(device, port)) 698 - return ERR_PTR(-ENODEV); 698 + goto out; 699 699 700 700 if ((dev_type != ARPHRD_INFINIBAND) && rdma_protocol_ib(device, port)) 701 - return ERR_PTR(-ENODEV); 701 + goto out; 702 + 703 + /* 704 + * For drivers that do not associate more than one net device with 705 + * their gid tables, such as iWARP drivers, it is sufficient to 706 + * return the first table entry. 707 + * 708 + * Other driver classes might be included in the future. 709 + */ 710 + if (rdma_protocol_iwarp(device, port)) { 711 + sgid_attr = rdma_get_gid_attr(device, port, 0); 712 + if (IS_ERR(sgid_attr)) 713 + goto out; 714 + 715 + rcu_read_lock(); 716 + ndev = rcu_dereference(sgid_attr->ndev); 717 + if (!net_eq(dev_net(ndev), dev_addr->net) || 718 + ndev->ifindex != bound_if_index) 719 + sgid_attr = ERR_PTR(-ENODEV); 720 + rcu_read_unlock(); 721 + goto out; 722 + } 702 723 703 724 if (dev_type == ARPHRD_ETHER && rdma_protocol_roce(device, port)) { 704 725 ndev = dev_get_by_index(dev_addr->net, bound_if_index); 705 726 if (!ndev) 706 - return ERR_PTR(-ENODEV); 727 + goto out; 707 728 } else { 708 729 gid_type = IB_GID_TYPE_IB; 709 730 } 710 731 711 732 sgid_attr = rdma_find_gid_by_port(device, gid, gid_type, port, ndev); 712 733 dev_put(ndev); 734 + out: 713 735 return sgid_attr; 714 736 } 715 737
+1 -1
drivers/infiniband/core/iwpm_util.c
··· 307 307 struct iwpm_nlmsg_request *iwpm_get_nlmsg_request(__u32 nlmsg_seq, 308 308 u8 nl_client, gfp_t gfp) 309 309 { 310 - struct iwpm_nlmsg_request *nlmsg_request = NULL; 310 + struct iwpm_nlmsg_request *nlmsg_request; 311 311 unsigned long flags; 312 312 313 313 nlmsg_request = kzalloc(sizeof(struct iwpm_nlmsg_request), gfp);
+1 -1
drivers/infiniband/core/netlink.c
··· 75 75 if (type >= RDMA_NL_NUM_CLIENTS) 76 76 return false; 77 77 78 - return (op < max_num_ops[type]) ? true : false; 78 + return op < max_num_ops[type]; 79 79 } 80 80 81 81 static const struct rdma_nl_cbs *
+18 -17
drivers/infiniband/core/uverbs_main.c
··· 72 72 #define IB_UVERBS_BASE_DEV MKDEV(IB_UVERBS_MAJOR, IB_UVERBS_BASE_MINOR) 73 73 74 74 static dev_t dynamic_uverbs_dev; 75 - static struct class *uverbs_class; 76 75 77 76 static DEFINE_IDA(uverbs_ida); 78 77 static int ib_uverbs_add_one(struct ib_device *device); 79 78 static void ib_uverbs_remove_one(struct ib_device *device, void *client_data); 79 + 80 + static char *uverbs_devnode(const struct device *dev, umode_t *mode) 81 + { 82 + if (mode) 83 + *mode = 0666; 84 + return kasprintf(GFP_KERNEL, "infiniband/%s", dev_name(dev)); 85 + } 86 + 87 + static const struct class uverbs_class = { 88 + .name = "infiniband_verbs", 89 + .devnode = uverbs_devnode, 90 + }; 80 91 81 92 /* 82 93 * Must be called with the ufile->device->disassociate_srcu held, and the lock ··· 1128 1117 } 1129 1118 1130 1119 device_initialize(&uverbs_dev->dev); 1131 - uverbs_dev->dev.class = uverbs_class; 1120 + uverbs_dev->dev.class = &uverbs_class; 1132 1121 uverbs_dev->dev.parent = device->dev.parent; 1133 1122 uverbs_dev->dev.release = ib_uverbs_release_dev; 1134 1123 uverbs_dev->groups[0] = &dev_attr_group; ··· 1246 1235 put_device(&uverbs_dev->dev); 1247 1236 } 1248 1237 1249 - static char *uverbs_devnode(const struct device *dev, umode_t *mode) 1250 - { 1251 - if (mode) 1252 - *mode = 0666; 1253 - return kasprintf(GFP_KERNEL, "infiniband/%s", dev_name(dev)); 1254 - } 1255 - 1256 1238 static int __init ib_uverbs_init(void) 1257 1239 { 1258 1240 int ret; ··· 1266 1262 goto out_alloc; 1267 1263 } 1268 1264 1269 - uverbs_class = class_create("infiniband_verbs"); 1270 - if (IS_ERR(uverbs_class)) { 1271 - ret = PTR_ERR(uverbs_class); 1265 + ret = class_register(&uverbs_class); 1266 + if (ret) { 1272 1267 pr_err("user_verbs: couldn't create class infiniband_verbs\n"); 1273 1268 goto out_chrdev; 1274 1269 } 1275 1270 1276 - uverbs_class->devnode = uverbs_devnode; 1277 - 1278 - ret = class_create_file(uverbs_class, &class_attr_abi_version.attr); 1271 + ret = class_create_file(&uverbs_class, &class_attr_abi_version.attr); 1279 1272 if (ret) { 1280 1273 pr_err("user_verbs: couldn't create abi_version attribute\n"); 1281 1274 goto out_class; ··· 1287 1286 return 0; 1288 1287 1289 1288 out_class: 1290 - class_destroy(uverbs_class); 1289 + class_unregister(&uverbs_class); 1291 1290 1292 1291 out_chrdev: 1293 1292 unregister_chrdev_region(dynamic_uverbs_dev, ··· 1304 1303 static void __exit ib_uverbs_cleanup(void) 1305 1304 { 1306 1305 ib_unregister_client(&uverbs_client); 1307 - class_destroy(uverbs_class); 1306 + class_unregister(&uverbs_class); 1308 1307 unregister_chrdev_region(IB_UVERBS_BASE_DEV, 1309 1308 IB_UVERBS_NUM_FIXED_MINOR); 1310 1309 unregister_chrdev_region(dynamic_uverbs_dev,
+2
drivers/infiniband/core/uverbs_std_types_counters.c
··· 107 107 return ret; 108 108 109 109 uattr = uverbs_attr_get(attrs, UVERBS_ATTR_READ_COUNTERS_BUFF); 110 + if (IS_ERR(uattr)) 111 + return PTR_ERR(uattr); 110 112 read_attr.ncounters = uattr->ptr_attr.len / sizeof(u64); 111 113 read_attr.counters_buff = uverbs_zalloc( 112 114 attrs, array_size(read_attr.ncounters, sizeof(u64)));
+88 -21
drivers/infiniband/core/verbs.c
··· 1880 1880 } 1881 1881 EXPORT_SYMBOL(ib_modify_qp_with_udata); 1882 1882 1883 + static void ib_get_width_and_speed(u32 netdev_speed, u32 lanes, 1884 + u16 *speed, u8 *width) 1885 + { 1886 + if (!lanes) { 1887 + if (netdev_speed <= SPEED_1000) { 1888 + *width = IB_WIDTH_1X; 1889 + *speed = IB_SPEED_SDR; 1890 + } else if (netdev_speed <= SPEED_10000) { 1891 + *width = IB_WIDTH_1X; 1892 + *speed = IB_SPEED_FDR10; 1893 + } else if (netdev_speed <= SPEED_20000) { 1894 + *width = IB_WIDTH_4X; 1895 + *speed = IB_SPEED_DDR; 1896 + } else if (netdev_speed <= SPEED_25000) { 1897 + *width = IB_WIDTH_1X; 1898 + *speed = IB_SPEED_EDR; 1899 + } else if (netdev_speed <= SPEED_40000) { 1900 + *width = IB_WIDTH_4X; 1901 + *speed = IB_SPEED_FDR10; 1902 + } else if (netdev_speed <= SPEED_50000) { 1903 + *width = IB_WIDTH_2X; 1904 + *speed = IB_SPEED_EDR; 1905 + } else if (netdev_speed <= SPEED_100000) { 1906 + *width = IB_WIDTH_4X; 1907 + *speed = IB_SPEED_EDR; 1908 + } else if (netdev_speed <= SPEED_200000) { 1909 + *width = IB_WIDTH_4X; 1910 + *speed = IB_SPEED_HDR; 1911 + } else { 1912 + *width = IB_WIDTH_4X; 1913 + *speed = IB_SPEED_NDR; 1914 + } 1915 + 1916 + return; 1917 + } 1918 + 1919 + switch (lanes) { 1920 + case 1: 1921 + *width = IB_WIDTH_1X; 1922 + break; 1923 + case 2: 1924 + *width = IB_WIDTH_2X; 1925 + break; 1926 + case 4: 1927 + *width = IB_WIDTH_4X; 1928 + break; 1929 + case 8: 1930 + *width = IB_WIDTH_8X; 1931 + break; 1932 + case 12: 1933 + *width = IB_WIDTH_12X; 1934 + break; 1935 + default: 1936 + *width = IB_WIDTH_1X; 1937 + } 1938 + 1939 + switch (netdev_speed / lanes) { 1940 + case SPEED_2500: 1941 + *speed = IB_SPEED_SDR; 1942 + break; 1943 + case SPEED_5000: 1944 + *speed = IB_SPEED_DDR; 1945 + break; 1946 + case SPEED_10000: 1947 + *speed = IB_SPEED_FDR10; 1948 + break; 1949 + case SPEED_14000: 1950 + *speed = IB_SPEED_FDR; 1951 + break; 1952 + case SPEED_25000: 1953 + *speed = IB_SPEED_EDR; 1954 + break; 1955 + case SPEED_50000: 1956 + *speed = IB_SPEED_HDR; 1957 + break; 1958 + case SPEED_100000: 1959 + *speed = IB_SPEED_NDR; 1960 + break; 1961 + default: 1962 + *speed = IB_SPEED_SDR; 1963 + } 1964 + } 1965 + 1883 1966 int ib_get_eth_speed(struct ib_device *dev, u32 port_num, u16 *speed, u8 *width) 1884 1967 { 1885 1968 int rc; ··· 1987 1904 netdev_speed = lksettings.base.speed; 1988 1905 } else { 1989 1906 netdev_speed = SPEED_1000; 1990 - pr_warn("%s speed is unknown, defaulting to %u\n", netdev->name, 1991 - netdev_speed); 1907 + if (rc) 1908 + pr_warn("%s speed is unknown, defaulting to %u\n", 1909 + netdev->name, netdev_speed); 1992 1910 } 1993 1911 1994 - if (netdev_speed <= SPEED_1000) { 1995 - *width = IB_WIDTH_1X; 1996 - *speed = IB_SPEED_SDR; 1997 - } else if (netdev_speed <= SPEED_10000) { 1998 - *width = IB_WIDTH_1X; 1999 - *speed = IB_SPEED_FDR10; 2000 - } else if (netdev_speed <= SPEED_20000) { 2001 - *width = IB_WIDTH_4X; 2002 - *speed = IB_SPEED_DDR; 2003 - } else if (netdev_speed <= SPEED_25000) { 2004 - *width = IB_WIDTH_1X; 2005 - *speed = IB_SPEED_EDR; 2006 - } else if (netdev_speed <= SPEED_40000) { 2007 - *width = IB_WIDTH_4X; 2008 - *speed = IB_SPEED_FDR10; 2009 - } else { 2010 - *width = IB_WIDTH_4X; 2011 - *speed = IB_SPEED_EDR; 2012 - } 1912 + ib_get_width_and_speed(netdev_speed, lksettings.lanes, 1913 + speed, width); 2013 1914 2014 1915 return 0; 2015 1916 }
+27 -8
drivers/infiniband/hw/bnxt_re/bnxt_re.h
··· 112 112 #define BNXT_RE_NQ_IDX 1 113 113 #define BNXT_RE_GEN_P5_MAX_VF 64 114 114 115 + struct bnxt_re_pacing { 116 + u64 dbr_db_fifo_reg_off; 117 + void *dbr_page; 118 + u64 dbr_bar_addr; 119 + u32 pacing_algo_th; 120 + u32 do_pacing_save; 121 + u32 dbq_pacing_time; /* ms */ 122 + u32 dbr_def_do_pacing; 123 + bool dbr_pacing; 124 + struct mutex dbq_lock; /* synchronize db pacing algo */ 125 + }; 126 + 127 + #define BNXT_RE_MAX_DBR_DO_PACING 0xFFFF 128 + #define BNXT_RE_DBR_PACING_TIME 5 /* ms */ 129 + #define BNXT_RE_PACING_ALGO_THRESHOLD 250 /* Entries in DB FIFO */ 130 + #define BNXT_RE_PACING_ALARM_TH_MULTIPLE 2 /* Multiple of pacing algo threshold */ 131 + /* Default do_pacing value when there is no congestion */ 132 + #define BNXT_RE_DBR_DO_PACING_NO_CONGESTION 0x7F /* 1 in 512 probability */ 133 + #define BNXT_RE_DB_FIFO_ROOM_MASK 0x1FFF8000 134 + #define BNXT_RE_MAX_FIFO_DEPTH 0x2c00 135 + #define BNXT_RE_DB_FIFO_ROOM_SHIFT 15 136 + #define BNXT_RE_GRC_FIFO_REG_BASE 0x2000 137 + 115 138 struct bnxt_re_dev { 116 139 struct ib_device ibdev; 117 140 struct list_head list; 118 141 unsigned long flags; 119 142 #define BNXT_RE_FLAG_NETDEV_REGISTERED 0 120 - #define BNXT_RE_FLAG_GOT_MSIX 2 121 143 #define BNXT_RE_FLAG_HAVE_L2_REF 3 122 144 #define BNXT_RE_FLAG_RCFW_CHANNEL_EN 4 123 145 #define BNXT_RE_FLAG_QOS_WORK_REG 5 ··· 174 152 struct bnxt_qplib_res qplib_res; 175 153 struct bnxt_qplib_dpi dpi_privileged; 176 154 177 - atomic_t qp_count; 178 155 struct mutex qp_lock; /* protect qp list */ 179 156 struct list_head qp_list; 180 157 181 - atomic_t cq_count; 182 - atomic_t srq_count; 183 - atomic_t mr_count; 184 - atomic_t mw_count; 185 - atomic_t ah_count; 186 - atomic_t pd_count; 187 158 /* Max of 2 lossless traffic class supported per port */ 188 159 u16 cosq[2]; 189 160 ··· 186 171 atomic_t nq_alloc_cnt; 187 172 u32 is_virtfn; 188 173 u32 num_vfs; 174 + struct bnxt_re_pacing pacing; 175 + struct work_struct dbq_fifo_check_work; 176 + struct delayed_work dbq_pacing_work; 189 177 }; 190 178 191 179 #define to_bnxt_re_dev(ptr, member) \ ··· 199 181 #define BNXT_RE_ROCEV2_IPV6_PACKET 3 200 182 201 183 #define BNXT_RE_CHECK_RC(x) ((x) && ((x) != -ETIMEDOUT)) 184 + void bnxt_re_pacing_alert(struct bnxt_re_dev *rdev); 202 185 203 186 static inline struct device *rdev_to_dev(struct bnxt_re_dev *rdev) 204 187 {
+74 -10
drivers/infiniband/hw/bnxt_re/hw_counters.c
··· 61 61 [BNXT_RE_ACTIVE_PD].name = "active_pds", 62 62 [BNXT_RE_ACTIVE_AH].name = "active_ahs", 63 63 [BNXT_RE_ACTIVE_QP].name = "active_qps", 64 + [BNXT_RE_ACTIVE_RC_QP].name = "active_rc_qps", 65 + [BNXT_RE_ACTIVE_UD_QP].name = "active_ud_qps", 64 66 [BNXT_RE_ACTIVE_SRQ].name = "active_srqs", 65 67 [BNXT_RE_ACTIVE_CQ].name = "active_cqs", 66 68 [BNXT_RE_ACTIVE_MR].name = "active_mrs", 67 69 [BNXT_RE_ACTIVE_MW].name = "active_mws", 70 + [BNXT_RE_WATERMARK_PD].name = "watermark_pds", 71 + [BNXT_RE_WATERMARK_AH].name = "watermark_ahs", 72 + [BNXT_RE_WATERMARK_QP].name = "watermark_qps", 73 + [BNXT_RE_WATERMARK_RC_QP].name = "watermark_rc_qps", 74 + [BNXT_RE_WATERMARK_UD_QP].name = "watermark_ud_qps", 75 + [BNXT_RE_WATERMARK_SRQ].name = "watermark_srqs", 76 + [BNXT_RE_WATERMARK_CQ].name = "watermark_cqs", 77 + [BNXT_RE_WATERMARK_MR].name = "watermark_mrs", 78 + [BNXT_RE_WATERMARK_MW].name = "watermark_mws", 79 + [BNXT_RE_RESIZE_CQ_CNT].name = "resize_cq_cnt", 68 80 [BNXT_RE_RX_PKTS].name = "rx_pkts", 69 81 [BNXT_RE_RX_BYTES].name = "rx_bytes", 70 82 [BNXT_RE_TX_PKTS].name = "tx_pkts", 71 83 [BNXT_RE_TX_BYTES].name = "tx_bytes", 72 84 [BNXT_RE_RECOVERABLE_ERRORS].name = "recoverable_errors", 85 + [BNXT_RE_TX_ERRORS].name = "tx_roce_errors", 86 + [BNXT_RE_TX_DISCARDS].name = "tx_roce_discards", 73 87 [BNXT_RE_RX_ERRORS].name = "rx_roce_errors", 74 88 [BNXT_RE_RX_DISCARDS].name = "rx_roce_discards", 75 89 [BNXT_RE_TO_RETRANSMITS].name = "to_retransmits", ··· 131 117 [BNXT_RE_TX_READ_RES].name = "tx_read_resp", 132 118 [BNXT_RE_TX_WRITE_REQ].name = "tx_write_req", 133 119 [BNXT_RE_TX_SEND_REQ].name = "tx_send_req", 120 + [BNXT_RE_TX_ROCE_PKTS].name = "tx_roce_only_pkts", 121 + [BNXT_RE_TX_ROCE_BYTES].name = "tx_roce_only_bytes", 134 122 [BNXT_RE_RX_ATOMIC_REQ].name = "rx_atomic_req", 135 123 [BNXT_RE_RX_READ_REQ].name = "rx_read_req", 136 124 [BNXT_RE_RX_READ_RESP].name = "rx_read_resp", 137 125 [BNXT_RE_RX_WRITE_REQ].name = "rx_write_req", 138 126 [BNXT_RE_RX_SEND_REQ].name = "rx_send_req", 127 + [BNXT_RE_RX_ROCE_PKTS].name = "rx_roce_only_pkts", 128 + [BNXT_RE_RX_ROCE_BYTES].name = "rx_roce_only_bytes", 139 129 [BNXT_RE_RX_ROCE_GOOD_PKTS].name = "rx_roce_good_pkts", 140 130 [BNXT_RE_RX_ROCE_GOOD_BYTES].name = "rx_roce_good_bytes", 141 - [BNXT_RE_OOB].name = "rx_out_of_buffer" 131 + [BNXT_RE_OOB].name = "rx_out_of_buffer", 132 + [BNXT_RE_TX_CNP].name = "tx_cnp_pkts", 133 + [BNXT_RE_RX_CNP].name = "rx_cnp_pkts", 134 + [BNXT_RE_RX_ECN].name = "rx_ecn_marked_pkts", 135 + [BNXT_RE_PACING_RESCHED].name = "pacing_reschedule", 136 + [BNXT_RE_PACING_CMPL].name = "pacing_complete", 137 + [BNXT_RE_PACING_ALERT].name = "pacing_alerts", 138 + [BNXT_RE_DB_FIFO_REG].name = "db_fifo_register", 142 139 }; 143 140 144 141 static void bnxt_re_copy_ext_stats(struct bnxt_re_dev *rdev, ··· 161 136 stats->value[BNXT_RE_TX_READ_RES] = s->tx_read_res; 162 137 stats->value[BNXT_RE_TX_WRITE_REQ] = s->tx_write_req; 163 138 stats->value[BNXT_RE_TX_SEND_REQ] = s->tx_send_req; 139 + stats->value[BNXT_RE_TX_ROCE_PKTS] = s->tx_roce_pkts; 140 + stats->value[BNXT_RE_TX_ROCE_BYTES] = s->tx_roce_bytes; 164 141 stats->value[BNXT_RE_RX_ATOMIC_REQ] = s->rx_atomic_req; 165 142 stats->value[BNXT_RE_RX_READ_REQ] = s->rx_read_req; 166 143 stats->value[BNXT_RE_RX_READ_RESP] = s->rx_read_res; 167 144 stats->value[BNXT_RE_RX_WRITE_REQ] = s->rx_write_req; 168 145 stats->value[BNXT_RE_RX_SEND_REQ] = s->rx_send_req; 146 + stats->value[BNXT_RE_RX_ROCE_PKTS] = s->rx_roce_pkts; 147 + stats->value[BNXT_RE_RX_ROCE_BYTES] = s->rx_roce_bytes; 169 148 stats->value[BNXT_RE_RX_ROCE_GOOD_PKTS] = s->rx_roce_good_pkts; 170 149 stats->value[BNXT_RE_RX_ROCE_GOOD_BYTES] = s->rx_roce_good_bytes; 171 150 stats->value[BNXT_RE_OOB] = s->rx_out_of_buffer; 151 + stats->value[BNXT_RE_TX_CNP] = s->tx_cnp; 152 + stats->value[BNXT_RE_RX_CNP] = s->rx_cnp; 153 + stats->value[BNXT_RE_RX_ECN] = s->rx_ecn_marked; 154 + stats->value[BNXT_RE_OUT_OF_SEQ_ERR] = s->rx_out_of_sequence; 172 155 } 173 156 174 157 static int bnxt_re_get_ext_stat(struct bnxt_re_dev *rdev, ··· 282 249 err_s->res_oos_drop_count; 283 250 } 284 251 252 + static void bnxt_re_copy_db_pacing_stats(struct bnxt_re_dev *rdev, 253 + struct rdma_hw_stats *stats) 254 + { 255 + struct bnxt_re_db_pacing_stats *pacing_s = &rdev->stats.pacing; 256 + 257 + stats->value[BNXT_RE_PACING_RESCHED] = pacing_s->resched; 258 + stats->value[BNXT_RE_PACING_CMPL] = pacing_s->complete; 259 + stats->value[BNXT_RE_PACING_ALERT] = pacing_s->alerts; 260 + stats->value[BNXT_RE_DB_FIFO_REG] = 261 + readl(rdev->en_dev->bar0 + rdev->pacing.dbr_db_fifo_reg_off); 262 + } 263 + 285 264 int bnxt_re_ib_get_hw_stats(struct ib_device *ibdev, 286 265 struct rdma_hw_stats *stats, 287 266 u32 port, int index) 288 267 { 289 268 struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev); 290 - struct ctx_hw_stats *hw_stats = NULL; 269 + struct bnxt_re_res_cntrs *res_s = &rdev->stats.res; 291 270 struct bnxt_qplib_roce_stats *err_s = NULL; 271 + struct ctx_hw_stats *hw_stats = NULL; 292 272 int rc = 0; 293 273 294 274 hw_stats = rdev->qplib_ctx.stats.dma; 295 275 if (!port || !stats) 296 276 return -EINVAL; 297 277 298 - stats->value[BNXT_RE_ACTIVE_QP] = atomic_read(&rdev->qp_count); 299 - stats->value[BNXT_RE_ACTIVE_SRQ] = atomic_read(&rdev->srq_count); 300 - stats->value[BNXT_RE_ACTIVE_CQ] = atomic_read(&rdev->cq_count); 301 - stats->value[BNXT_RE_ACTIVE_MR] = atomic_read(&rdev->mr_count); 302 - stats->value[BNXT_RE_ACTIVE_MW] = atomic_read(&rdev->mw_count); 303 - stats->value[BNXT_RE_ACTIVE_PD] = atomic_read(&rdev->pd_count); 304 - stats->value[BNXT_RE_ACTIVE_AH] = atomic_read(&rdev->ah_count); 278 + stats->value[BNXT_RE_ACTIVE_QP] = atomic_read(&res_s->qp_count); 279 + stats->value[BNXT_RE_ACTIVE_RC_QP] = atomic_read(&res_s->rc_qp_count); 280 + stats->value[BNXT_RE_ACTIVE_UD_QP] = atomic_read(&res_s->ud_qp_count); 281 + stats->value[BNXT_RE_ACTIVE_SRQ] = atomic_read(&res_s->srq_count); 282 + stats->value[BNXT_RE_ACTIVE_CQ] = atomic_read(&res_s->cq_count); 283 + stats->value[BNXT_RE_ACTIVE_MR] = atomic_read(&res_s->mr_count); 284 + stats->value[BNXT_RE_ACTIVE_MW] = atomic_read(&res_s->mw_count); 285 + stats->value[BNXT_RE_ACTIVE_PD] = atomic_read(&res_s->pd_count); 286 + stats->value[BNXT_RE_ACTIVE_AH] = atomic_read(&res_s->ah_count); 287 + stats->value[BNXT_RE_WATERMARK_QP] = res_s->qp_watermark; 288 + stats->value[BNXT_RE_WATERMARK_RC_QP] = res_s->rc_qp_watermark; 289 + stats->value[BNXT_RE_WATERMARK_UD_QP] = res_s->ud_qp_watermark; 290 + stats->value[BNXT_RE_WATERMARK_SRQ] = res_s->srq_watermark; 291 + stats->value[BNXT_RE_WATERMARK_CQ] = res_s->cq_watermark; 292 + stats->value[BNXT_RE_WATERMARK_MR] = res_s->mr_watermark; 293 + stats->value[BNXT_RE_WATERMARK_MW] = res_s->mw_watermark; 294 + stats->value[BNXT_RE_WATERMARK_PD] = res_s->pd_watermark; 295 + stats->value[BNXT_RE_WATERMARK_AH] = res_s->ah_watermark; 296 + stats->value[BNXT_RE_RESIZE_CQ_CNT] = atomic_read(&res_s->resize_count); 305 297 306 298 if (hw_stats) { 307 299 stats->value[BNXT_RE_RECOVERABLE_ERRORS] = 308 300 le64_to_cpu(hw_stats->tx_bcast_pkts); 301 + stats->value[BNXT_RE_TX_DISCARDS] = 302 + le64_to_cpu(hw_stats->tx_discard_pkts); 303 + stats->value[BNXT_RE_TX_ERRORS] = 304 + le64_to_cpu(hw_stats->tx_error_pkts); 309 305 stats->value[BNXT_RE_RX_ERRORS] = 310 306 le64_to_cpu(hw_stats->rx_error_pkts); 311 307 stats->value[BNXT_RE_RX_DISCARDS] = ··· 356 294 &rdev->flags); 357 295 goto done; 358 296 } 297 + bnxt_re_copy_err_stats(rdev, stats, err_s); 359 298 if (_is_ext_stats_supported(rdev->dev_attr.dev_cap_flags) && 360 299 !rdev->is_virtfn) { 361 300 rc = bnxt_re_get_ext_stat(rdev, stats); ··· 366 303 goto done; 367 304 } 368 305 } 369 - bnxt_re_copy_err_stats(rdev, stats, err_s); 306 + if (rdev->pacing.dbr_pacing) 307 + bnxt_re_copy_db_pacing_stats(rdev, stats); 370 308 } 371 309 372 310 done:
+55
drivers/infiniband/hw/bnxt_re/hw_counters.h
··· 44 44 BNXT_RE_ACTIVE_PD, 45 45 BNXT_RE_ACTIVE_AH, 46 46 BNXT_RE_ACTIVE_QP, 47 + BNXT_RE_ACTIVE_RC_QP, 48 + BNXT_RE_ACTIVE_UD_QP, 47 49 BNXT_RE_ACTIVE_SRQ, 48 50 BNXT_RE_ACTIVE_CQ, 49 51 BNXT_RE_ACTIVE_MR, 50 52 BNXT_RE_ACTIVE_MW, 53 + BNXT_RE_WATERMARK_PD, 54 + BNXT_RE_WATERMARK_AH, 55 + BNXT_RE_WATERMARK_QP, 56 + BNXT_RE_WATERMARK_RC_QP, 57 + BNXT_RE_WATERMARK_UD_QP, 58 + BNXT_RE_WATERMARK_SRQ, 59 + BNXT_RE_WATERMARK_CQ, 60 + BNXT_RE_WATERMARK_MR, 61 + BNXT_RE_WATERMARK_MW, 62 + BNXT_RE_RESIZE_CQ_CNT, 51 63 BNXT_RE_RX_PKTS, 52 64 BNXT_RE_RX_BYTES, 53 65 BNXT_RE_TX_PKTS, 54 66 BNXT_RE_TX_BYTES, 55 67 BNXT_RE_RECOVERABLE_ERRORS, 68 + BNXT_RE_TX_ERRORS, 69 + BNXT_RE_TX_DISCARDS, 56 70 BNXT_RE_RX_ERRORS, 57 71 BNXT_RE_RX_DISCARDS, 58 72 BNXT_RE_TO_RETRANSMITS, ··· 114 100 BNXT_RE_TX_READ_RES, 115 101 BNXT_RE_TX_WRITE_REQ, 116 102 BNXT_RE_TX_SEND_REQ, 103 + BNXT_RE_TX_ROCE_PKTS, 104 + BNXT_RE_TX_ROCE_BYTES, 117 105 BNXT_RE_RX_ATOMIC_REQ, 118 106 BNXT_RE_RX_READ_REQ, 119 107 BNXT_RE_RX_READ_RESP, 120 108 BNXT_RE_RX_WRITE_REQ, 121 109 BNXT_RE_RX_SEND_REQ, 110 + BNXT_RE_RX_ROCE_PKTS, 111 + BNXT_RE_RX_ROCE_BYTES, 122 112 BNXT_RE_RX_ROCE_GOOD_PKTS, 123 113 BNXT_RE_RX_ROCE_GOOD_BYTES, 124 114 BNXT_RE_OOB, 115 + BNXT_RE_TX_CNP, 116 + BNXT_RE_RX_CNP, 117 + BNXT_RE_RX_ECN, 118 + BNXT_RE_PACING_RESCHED, 119 + BNXT_RE_PACING_CMPL, 120 + BNXT_RE_PACING_ALERT, 121 + BNXT_RE_DB_FIFO_REG, 125 122 BNXT_RE_NUM_EXT_COUNTERS 126 123 }; 127 124 128 125 #define BNXT_RE_NUM_STD_COUNTERS (BNXT_RE_OUT_OF_SEQ_ERR + 1) 126 + 127 + struct bnxt_re_db_pacing_stats { 128 + u64 resched; 129 + u64 complete; 130 + u64 alerts; 131 + }; 132 + 133 + struct bnxt_re_res_cntrs { 134 + atomic_t qp_count; 135 + atomic_t rc_qp_count; 136 + atomic_t ud_qp_count; 137 + atomic_t cq_count; 138 + atomic_t srq_count; 139 + atomic_t mr_count; 140 + atomic_t mw_count; 141 + atomic_t ah_count; 142 + atomic_t pd_count; 143 + atomic_t resize_count; 144 + u64 qp_watermark; 145 + u64 rc_qp_watermark; 146 + u64 ud_qp_watermark; 147 + u64 cq_watermark; 148 + u64 srq_watermark; 149 + u64 mr_watermark; 150 + u64 mw_watermark; 151 + u64 ah_watermark; 152 + u64 pd_watermark; 153 + }; 129 154 130 155 struct bnxt_re_rstat { 131 156 struct bnxt_qplib_roce_stats errs; ··· 173 120 174 121 struct bnxt_re_stats { 175 122 struct bnxt_re_rstat rstat; 123 + struct bnxt_re_res_cntrs res; 124 + struct bnxt_re_db_pacing_stats pacing; 176 125 }; 177 126 178 127 struct rdma_hw_stats *bnxt_re_ib_alloc_hw_port_stats(struct ib_device *ibdev,
+184 -77
drivers/infiniband/hw/bnxt_re/ib_verbs.c
··· 284 284 int index, union ib_gid *gid) 285 285 { 286 286 struct bnxt_re_dev *rdev = to_bnxt_re_dev(ibdev, ibdev); 287 - int rc = 0; 287 + int rc; 288 288 289 289 /* Ignore port_num */ 290 290 memset(gid, 0, sizeof(*gid)); ··· 565 565 break; 566 566 case BNXT_RE_MMAP_UC_DB: 567 567 case BNXT_RE_MMAP_WC_DB: 568 + case BNXT_RE_MMAP_DBR_BAR: 569 + case BNXT_RE_MMAP_DBR_PAGE: 568 570 ret = rdma_user_mmap_entry_insert(&uctx->ib_uctx, 569 571 &entry->rdma_entry, PAGE_SIZE); 570 572 break; ··· 602 600 if (!bnxt_qplib_dealloc_pd(&rdev->qplib_res, 603 601 &rdev->qplib_res.pd_tbl, 604 602 &pd->qplib_pd)) 605 - atomic_dec(&rdev->pd_count); 603 + atomic_dec(&rdev->stats.res.pd_count); 606 604 } 607 605 return 0; 608 606 } ··· 615 613 udata, struct bnxt_re_ucontext, ib_uctx); 616 614 struct bnxt_re_pd *pd = container_of(ibpd, struct bnxt_re_pd, ib_pd); 617 615 struct bnxt_re_user_mmap_entry *entry = NULL; 616 + u32 active_pds; 618 617 int rc = 0; 619 618 620 619 pd->rdev = rdev; 621 - if (bnxt_qplib_alloc_pd(&rdev->qplib_res.pd_tbl, &pd->qplib_pd)) { 620 + if (bnxt_qplib_alloc_pd(&rdev->qplib_res, &pd->qplib_pd)) { 622 621 ibdev_err(&rdev->ibdev, "Failed to allocate HW PD"); 623 622 rc = -ENOMEM; 624 623 goto fail; ··· 666 663 if (bnxt_re_create_fence_mr(pd)) 667 664 ibdev_warn(&rdev->ibdev, 668 665 "Failed to create Fence-MR\n"); 669 - atomic_inc(&rdev->pd_count); 666 + active_pds = atomic_inc_return(&rdev->stats.res.pd_count); 667 + if (active_pds > rdev->stats.res.pd_watermark) 668 + rdev->stats.res.pd_watermark = active_pds; 670 669 671 670 return 0; 672 671 dbfail: ··· 684 679 struct bnxt_re_ah *ah = container_of(ib_ah, struct bnxt_re_ah, ib_ah); 685 680 struct bnxt_re_dev *rdev = ah->rdev; 686 681 bool block = true; 687 - int rc = 0; 682 + int rc; 688 683 689 684 block = !(flags & RDMA_DESTROY_AH_SLEEPABLE); 690 685 rc = bnxt_qplib_destroy_ah(&rdev->qplib_res, &ah->qplib_ah, block); ··· 694 689 else 695 690 goto fail; 696 691 } 697 - atomic_dec(&rdev->ah_count); 692 + atomic_dec(&rdev->stats.res.ah_count); 698 693 fail: 699 694 return rc; 700 695 } ··· 728 723 const struct ib_gid_attr *sgid_attr; 729 724 struct bnxt_re_gid_ctx *ctx; 730 725 struct bnxt_re_ah *ah = container_of(ib_ah, struct bnxt_re_ah, ib_ah); 726 + u32 active_ahs; 731 727 u8 nw_type; 732 728 int rc; 733 729 ··· 781 775 wmb(); /* make sure cache is updated. */ 782 776 spin_unlock_irqrestore(&uctx->sh_lock, flag); 783 777 } 784 - atomic_inc(&rdev->ah_count); 778 + active_ahs = atomic_inc_return(&rdev->stats.res.ah_count); 779 + if (active_ahs > rdev->stats.res.ah_watermark) 780 + rdev->stats.res.ah_watermark = active_ahs; 785 781 786 782 return 0; 787 783 } ··· 834 826 struct bnxt_re_qp *gsi_sqp; 835 827 struct bnxt_re_ah *gsi_sah; 836 828 struct bnxt_re_dev *rdev; 837 - int rc = 0; 829 + int rc; 838 830 839 831 rdev = qp->rdev; 840 832 gsi_sqp = rdev->gsi_ctx.gsi_sqp; ··· 844 836 bnxt_qplib_destroy_ah(&rdev->qplib_res, 845 837 &gsi_sah->qplib_ah, 846 838 true); 847 - atomic_dec(&rdev->ah_count); 839 + atomic_dec(&rdev->stats.res.ah_count); 848 840 bnxt_qplib_clean_qp(&qp->qplib_qp); 849 841 850 842 ibdev_dbg(&rdev->ibdev, "Destroy the shadow QP\n"); ··· 859 851 mutex_lock(&rdev->qp_lock); 860 852 list_del(&gsi_sqp->list); 861 853 mutex_unlock(&rdev->qp_lock); 862 - atomic_dec(&rdev->qp_count); 854 + atomic_dec(&rdev->stats.res.qp_count); 863 855 864 856 kfree(rdev->gsi_ctx.sqp_tbl); 865 857 kfree(gsi_sah); ··· 909 901 mutex_lock(&rdev->qp_lock); 910 902 list_del(&qp->list); 911 903 mutex_unlock(&rdev->qp_lock); 912 - atomic_dec(&rdev->qp_count); 904 + atomic_dec(&rdev->stats.res.qp_count); 913 905 914 906 ib_umem_release(qp->rumem); 915 907 ib_umem_release(qp->sumem); ··· 1103 1095 "Failed to allocate HW AH for Shadow QP"); 1104 1096 goto fail; 1105 1097 } 1106 - atomic_inc(&rdev->ah_count); 1098 + atomic_inc(&rdev->stats.res.ah_count); 1107 1099 1108 1100 return ah; 1109 1101 ··· 1171 1163 INIT_LIST_HEAD(&qp->list); 1172 1164 mutex_lock(&rdev->qp_lock); 1173 1165 list_add_tail(&qp->list, &rdev->qp_list); 1174 - atomic_inc(&rdev->qp_count); 1166 + atomic_inc(&rdev->stats.res.qp_count); 1175 1167 mutex_unlock(&rdev->qp_lock); 1176 1168 return qp; 1177 1169 fail: ··· 1348 1340 qplqp->pd = &pd->qplib_pd; 1349 1341 qplqp->qp_handle = (u64)qplqp; 1350 1342 qplqp->max_inline_data = init_attr->cap.max_inline_data; 1351 - qplqp->sig_type = ((init_attr->sq_sig_type == IB_SIGNAL_ALL_WR) ? 1352 - true : false); 1343 + qplqp->sig_type = init_attr->sq_sig_type == IB_SIGNAL_ALL_WR; 1353 1344 qptype = bnxt_re_init_qp_type(rdev, init_attr); 1354 1345 if (qptype < 0) { 1355 1346 rc = qptype; ··· 1453 1446 { 1454 1447 struct bnxt_re_dev *rdev; 1455 1448 struct bnxt_qplib_qp *qplqp; 1456 - int rc = 0; 1449 + int rc; 1457 1450 1458 1451 rdev = qp->rdev; 1459 1452 qplqp = &qp->qplib_qp; ··· 1504 1497 struct bnxt_re_dev *rdev = pd->rdev; 1505 1498 struct bnxt_qplib_dev_attr *dev_attr = &rdev->dev_attr; 1506 1499 struct bnxt_re_qp *qp = container_of(ib_qp, struct bnxt_re_qp, ib_qp); 1500 + u32 active_qps; 1507 1501 int rc; 1508 1502 1509 1503 rc = bnxt_re_test_qp_limits(rdev, qp_init_attr, dev_attr); ··· 1553 1545 mutex_lock(&rdev->qp_lock); 1554 1546 list_add_tail(&qp->list, &rdev->qp_list); 1555 1547 mutex_unlock(&rdev->qp_lock); 1556 - atomic_inc(&rdev->qp_count); 1548 + active_qps = atomic_inc_return(&rdev->stats.res.qp_count); 1549 + if (active_qps > rdev->stats.res.qp_watermark) 1550 + rdev->stats.res.qp_watermark = active_qps; 1551 + if (qp_init_attr->qp_type == IB_QPT_RC) { 1552 + active_qps = atomic_inc_return(&rdev->stats.res.rc_qp_count); 1553 + if (active_qps > rdev->stats.res.rc_qp_watermark) 1554 + rdev->stats.res.rc_qp_watermark = active_qps; 1555 + } else if (qp_init_attr->qp_type == IB_QPT_UD) { 1556 + active_qps = atomic_inc_return(&rdev->stats.res.ud_qp_count); 1557 + if (active_qps > rdev->stats.res.ud_qp_watermark) 1558 + rdev->stats.res.ud_qp_watermark = active_qps; 1559 + } 1557 1560 1558 1561 return 0; 1559 1562 qp_destroy: ··· 1667 1648 nq = qplib_srq->cq->nq; 1668 1649 bnxt_qplib_destroy_srq(&rdev->qplib_res, qplib_srq); 1669 1650 ib_umem_release(srq->umem); 1670 - atomic_dec(&rdev->srq_count); 1651 + atomic_dec(&rdev->stats.res.srq_count); 1671 1652 if (nq) 1672 1653 nq->budget--; 1673 1654 return 0; ··· 1715 1696 struct bnxt_re_srq *srq; 1716 1697 struct bnxt_re_pd *pd; 1717 1698 struct ib_pd *ib_pd; 1699 + u32 active_srqs; 1718 1700 int rc, entries; 1719 1701 1720 1702 ib_pd = ib_srq->pd; ··· 1780 1760 } 1781 1761 if (nq) 1782 1762 nq->budget++; 1783 - atomic_inc(&rdev->srq_count); 1763 + active_srqs = atomic_inc_return(&rdev->stats.res.srq_count); 1764 + if (active_srqs > rdev->stats.res.srq_watermark) 1765 + rdev->stats.res.srq_watermark = active_srqs; 1784 1766 spin_lock_init(&srq->lock); 1785 1767 1786 1768 return 0; ··· 1884 1862 int qp_attr_mask) 1885 1863 { 1886 1864 struct bnxt_re_qp *qp = rdev->gsi_ctx.gsi_sqp; 1887 - int rc = 0; 1865 + int rc; 1888 1866 1889 1867 if (qp_attr_mask & IB_QP_STATE) { 1890 1868 qp->qplib_qp.modify_flags |= CMDQ_MODIFY_QP_MODIFY_MASK_STATE; ··· 2234 2212 u8 ip_version = 0; 2235 2213 u16 vlan_id = 0xFFFF; 2236 2214 void *buf; 2237 - int i, rc = 0; 2215 + int i, rc; 2238 2216 2239 2217 memset(&qp->qp1_hdr, 0, sizeof(qp->qp1_hdr)); 2240 2218 ··· 2272 2250 } 2273 2251 2274 2252 is_eth = true; 2275 - is_vlan = (vlan_id && (vlan_id < 0x1000)) ? true : false; 2253 + is_vlan = vlan_id && (vlan_id < 0x1000); 2276 2254 2277 2255 ib_ud_header_init(payload_size, !is_eth, is_eth, is_vlan, is_grh, 2278 2256 ip_version, is_udp, 0, &qp->qp1_hdr); ··· 2809 2787 struct bnxt_qplib_swqe wqe; 2810 2788 int rc = 0; 2811 2789 2812 - memset(&wqe, 0, sizeof(wqe)); 2813 2790 while (wr) { 2814 2791 /* House keeping */ 2815 2792 memset(&wqe, 0, sizeof(wqe)); ··· 2907 2886 bnxt_qplib_destroy_cq(&rdev->qplib_res, &cq->qplib_cq); 2908 2887 ib_umem_release(cq->umem); 2909 2888 2910 - atomic_dec(&rdev->cq_count); 2889 + atomic_dec(&rdev->stats.res.cq_count); 2911 2890 nq->budget--; 2912 2891 kfree(cq->cql); 2913 2892 return 0; ··· 2923 2902 int cqe = attr->cqe; 2924 2903 struct bnxt_qplib_nq *nq = NULL; 2925 2904 unsigned int nq_alloc_cnt; 2905 + u32 active_cqs; 2926 2906 2927 2907 if (attr->flags) 2928 2908 return -EOPNOTSUPP; ··· 2992 2970 cq->cq_period = cq->qplib_cq.period; 2993 2971 nq->budget++; 2994 2972 2995 - atomic_inc(&rdev->cq_count); 2973 + active_cqs = atomic_inc_return(&rdev->stats.res.cq_count); 2974 + if (active_cqs > rdev->stats.res.cq_watermark) 2975 + rdev->stats.res.cq_watermark = active_cqs; 2996 2976 spin_lock_init(&cq->cq_lock); 2997 2977 2998 2978 if (udata) { ··· 3107 3083 } 3108 3084 3109 3085 cq->ib_cq.cqe = cq->resize_cqe; 3086 + atomic_inc(&rdev->stats.res.resize_count); 3110 3087 3111 3088 return 0; 3112 3089 ··· 3344 3319 struct bnxt_re_dev *rdev = gsi_qp->rdev; 3345 3320 struct bnxt_re_sqp_entries *sqp_entry = NULL; 3346 3321 struct bnxt_re_qp *gsi_sqp = rdev->gsi_ctx.gsi_sqp; 3347 - struct bnxt_re_ah *gsi_sah; 3348 - struct ib_send_wr *swr; 3349 - struct ib_ud_wr udwr; 3350 - struct ib_recv_wr rwr; 3351 - int pkt_type = 0; 3352 - u32 tbl_idx; 3353 - void *rq_hdr_buf; 3354 - dma_addr_t rq_hdr_buf_map; 3355 3322 dma_addr_t shrq_hdr_buf_map; 3356 - u32 offset = 0; 3323 + struct ib_sge s_sge[2] = {}; 3324 + struct ib_sge r_sge[2] = {}; 3325 + struct bnxt_re_ah *gsi_sah; 3326 + struct ib_recv_wr rwr = {}; 3327 + dma_addr_t rq_hdr_buf_map; 3328 + struct ib_ud_wr udwr = {}; 3329 + struct ib_send_wr *swr; 3357 3330 u32 skip_bytes = 0; 3358 - struct ib_sge s_sge[2]; 3359 - struct ib_sge r_sge[2]; 3331 + int pkt_type = 0; 3332 + void *rq_hdr_buf; 3333 + u32 offset = 0; 3334 + u32 tbl_idx; 3360 3335 int rc; 3361 - 3362 - memset(&udwr, 0, sizeof(udwr)); 3363 - memset(&rwr, 0, sizeof(rwr)); 3364 - memset(&s_sge, 0, sizeof(s_sge)); 3365 - memset(&r_sge, 0, sizeof(r_sge)); 3366 3336 3367 3337 swr = &udwr.wr; 3368 3338 tbl_idx = cqe->wr_id; ··· 3598 3578 { 3599 3579 struct bnxt_qplib_qp *lib_qp = &qp->qplib_qp; 3600 3580 unsigned long flags; 3601 - int rc = 0; 3581 + int rc; 3602 3582 3603 3583 spin_lock_irqsave(&qp->sq_lock, flags); 3604 3584 ··· 3788 3768 struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd); 3789 3769 struct bnxt_re_dev *rdev = pd->rdev; 3790 3770 struct bnxt_re_mr *mr; 3771 + u32 active_mrs; 3791 3772 int rc; 3792 3773 3793 3774 mr = kzalloc(sizeof(*mr), GFP_KERNEL); ··· 3816 3795 if (mr_access_flags & (IB_ACCESS_REMOTE_WRITE | IB_ACCESS_REMOTE_READ | 3817 3796 IB_ACCESS_REMOTE_ATOMIC)) 3818 3797 mr->ib_mr.rkey = mr->ib_mr.lkey; 3819 - atomic_inc(&rdev->mr_count); 3798 + active_mrs = atomic_inc_return(&rdev->stats.res.mr_count); 3799 + if (active_mrs > rdev->stats.res.mr_watermark) 3800 + rdev->stats.res.mr_watermark = active_mrs; 3820 3801 3821 3802 return &mr->ib_mr; 3822 3803 ··· 3851 3828 ib_umem_release(mr->ib_umem); 3852 3829 3853 3830 kfree(mr); 3854 - atomic_dec(&rdev->mr_count); 3831 + atomic_dec(&rdev->stats.res.mr_count); 3855 3832 return rc; 3856 3833 } 3857 3834 ··· 3881 3858 struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd); 3882 3859 struct bnxt_re_dev *rdev = pd->rdev; 3883 3860 struct bnxt_re_mr *mr = NULL; 3861 + u32 active_mrs; 3884 3862 int rc; 3885 3863 3886 3864 if (type != IB_MR_TYPE_MEM_REG) { ··· 3920 3896 goto fail_mr; 3921 3897 } 3922 3898 3923 - atomic_inc(&rdev->mr_count); 3899 + active_mrs = atomic_inc_return(&rdev->stats.res.mr_count); 3900 + if (active_mrs > rdev->stats.res.mr_watermark) 3901 + rdev->stats.res.mr_watermark = active_mrs; 3924 3902 return &mr->ib_mr; 3925 3903 3926 3904 fail_mr: ··· 3940 3914 struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd); 3941 3915 struct bnxt_re_dev *rdev = pd->rdev; 3942 3916 struct bnxt_re_mw *mw; 3917 + u32 active_mws; 3943 3918 int rc; 3944 3919 3945 3920 mw = kzalloc(sizeof(*mw), GFP_KERNEL); ··· 3959 3932 } 3960 3933 mw->ib_mw.rkey = mw->qplib_mw.rkey; 3961 3934 3962 - atomic_inc(&rdev->mw_count); 3935 + active_mws = atomic_inc_return(&rdev->stats.res.mw_count); 3936 + if (active_mws > rdev->stats.res.mw_watermark) 3937 + rdev->stats.res.mw_watermark = active_mws; 3963 3938 return &mw->ib_mw; 3964 3939 3965 3940 fail: ··· 3982 3953 } 3983 3954 3984 3955 kfree(mw); 3985 - atomic_dec(&rdev->mw_count); 3956 + atomic_dec(&rdev->stats.res.mw_count); 3986 3957 return rc; 3987 3958 } 3988 3959 3989 - /* uverbs */ 3990 - struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *ib_pd, u64 start, u64 length, 3991 - u64 virt_addr, int mr_access_flags, 3992 - struct ib_udata *udata) 3960 + static struct ib_mr *__bnxt_re_user_reg_mr(struct ib_pd *ib_pd, u64 length, u64 virt_addr, 3961 + int mr_access_flags, struct ib_umem *umem) 3993 3962 { 3994 3963 struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd); 3995 3964 struct bnxt_re_dev *rdev = pd->rdev; 3996 - struct bnxt_re_mr *mr; 3997 - struct ib_umem *umem; 3998 3965 unsigned long page_size; 3966 + struct bnxt_re_mr *mr; 3999 3967 int umem_pgs, rc; 3968 + u32 active_mrs; 4000 3969 4001 3970 if (length > BNXT_RE_MAX_MR_SIZE) { 4002 3971 ibdev_err(&rdev->ibdev, "MR Size: %lld > Max supported:%lld\n", 4003 3972 length, BNXT_RE_MAX_MR_SIZE); 4004 3973 return ERR_PTR(-ENOMEM); 3974 + } 3975 + 3976 + page_size = ib_umem_find_best_pgsz(umem, BNXT_RE_PAGE_SIZE_SUPPORTED, virt_addr); 3977 + if (!page_size) { 3978 + ibdev_err(&rdev->ibdev, "umem page size unsupported!"); 3979 + return ERR_PTR(-EINVAL); 4005 3980 } 4006 3981 4007 3982 mr = kzalloc(sizeof(*mr), GFP_KERNEL); ··· 4019 3986 4020 3987 rc = bnxt_qplib_alloc_mrw(&rdev->qplib_res, &mr->qplib_mr); 4021 3988 if (rc) { 4022 - ibdev_err(&rdev->ibdev, "Failed to allocate MR"); 3989 + ibdev_err(&rdev->ibdev, "Failed to allocate MR rc = %d", rc); 3990 + rc = -EIO; 4023 3991 goto free_mr; 4024 3992 } 4025 3993 /* The fixed portion of the rkey is the same as the lkey */ 4026 3994 mr->ib_mr.rkey = mr->qplib_mr.rkey; 4027 - 4028 - umem = ib_umem_get(&rdev->ibdev, start, length, mr_access_flags); 4029 - if (IS_ERR(umem)) { 4030 - ibdev_err(&rdev->ibdev, "Failed to get umem"); 4031 - rc = -EFAULT; 4032 - goto free_mrw; 4033 - } 4034 3995 mr->ib_umem = umem; 4035 - 4036 3996 mr->qplib_mr.va = virt_addr; 4037 - page_size = ib_umem_find_best_pgsz( 4038 - umem, BNXT_RE_PAGE_SIZE_SUPPORTED, virt_addr); 4039 - if (!page_size) { 4040 - ibdev_err(&rdev->ibdev, "umem page size unsupported!"); 4041 - rc = -EFAULT; 4042 - goto free_umem; 4043 - } 4044 3997 mr->qplib_mr.total_size = length; 4045 3998 4046 3999 umem_pgs = ib_umem_num_dma_blocks(umem, page_size); 4047 4000 rc = bnxt_qplib_reg_mr(&rdev->qplib_res, &mr->qplib_mr, umem, 4048 4001 umem_pgs, page_size); 4049 4002 if (rc) { 4050 - ibdev_err(&rdev->ibdev, "Failed to register user MR"); 4051 - goto free_umem; 4003 + ibdev_err(&rdev->ibdev, "Failed to register user MR - rc = %d\n", rc); 4004 + rc = -EIO; 4005 + goto free_mrw; 4052 4006 } 4053 4007 4054 4008 mr->ib_mr.lkey = mr->qplib_mr.lkey; 4055 4009 mr->ib_mr.rkey = mr->qplib_mr.lkey; 4056 - atomic_inc(&rdev->mr_count); 4010 + active_mrs = atomic_inc_return(&rdev->stats.res.mr_count); 4011 + if (active_mrs > rdev->stats.res.mr_watermark) 4012 + rdev->stats.res.mr_watermark = active_mrs; 4057 4013 4058 4014 return &mr->ib_mr; 4059 - free_umem: 4060 - ib_umem_release(umem); 4015 + 4061 4016 free_mrw: 4062 4017 bnxt_qplib_free_mrw(&rdev->qplib_res, &mr->qplib_mr); 4063 4018 free_mr: 4064 4019 kfree(mr); 4065 4020 return ERR_PTR(rc); 4021 + } 4022 + 4023 + struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *ib_pd, u64 start, u64 length, 4024 + u64 virt_addr, int mr_access_flags, 4025 + struct ib_udata *udata) 4026 + { 4027 + struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd); 4028 + struct bnxt_re_dev *rdev = pd->rdev; 4029 + struct ib_umem *umem; 4030 + struct ib_mr *ib_mr; 4031 + 4032 + umem = ib_umem_get(&rdev->ibdev, start, length, mr_access_flags); 4033 + if (IS_ERR(umem)) 4034 + return ERR_CAST(umem); 4035 + 4036 + ib_mr = __bnxt_re_user_reg_mr(ib_pd, length, virt_addr, mr_access_flags, umem); 4037 + if (IS_ERR(ib_mr)) 4038 + ib_umem_release(umem); 4039 + return ib_mr; 4040 + } 4041 + 4042 + struct ib_mr *bnxt_re_reg_user_mr_dmabuf(struct ib_pd *ib_pd, u64 start, 4043 + u64 length, u64 virt_addr, int fd, 4044 + int mr_access_flags, struct ib_udata *udata) 4045 + { 4046 + struct bnxt_re_pd *pd = container_of(ib_pd, struct bnxt_re_pd, ib_pd); 4047 + struct bnxt_re_dev *rdev = pd->rdev; 4048 + struct ib_umem_dmabuf *umem_dmabuf; 4049 + struct ib_umem *umem; 4050 + struct ib_mr *ib_mr; 4051 + 4052 + umem_dmabuf = ib_umem_dmabuf_get_pinned(&rdev->ibdev, start, length, 4053 + fd, mr_access_flags); 4054 + if (IS_ERR(umem_dmabuf)) 4055 + return ERR_CAST(umem_dmabuf); 4056 + 4057 + umem = &umem_dmabuf->umem; 4058 + 4059 + ib_mr = __bnxt_re_user_reg_mr(ib_pd, length, virt_addr, mr_access_flags, umem); 4060 + if (IS_ERR(ib_mr)) 4061 + ib_umem_release(umem); 4062 + return ib_mr; 4066 4063 } 4067 4064 4068 4065 int bnxt_re_alloc_ucontext(struct ib_ucontext *ctx, struct ib_udata *udata) ··· 4150 4087 goto cfail; 4151 4088 } 4152 4089 uctx->shpage_mmap = &entry->rdma_entry; 4090 + if (rdev->pacing.dbr_pacing) 4091 + resp.comp_mask |= BNXT_RE_UCNTX_CMASK_DBR_PACING_ENABLED; 4153 4092 4154 4093 rc = ib_copy_to_udata(udata, &resp, min(udata->outlen, sizeof(resp))); 4155 4094 if (rc) { ··· 4224 4159 case BNXT_RE_MMAP_SH_PAGE: 4225 4160 ret = vm_insert_page(vma, vma->vm_start, virt_to_page(uctx->shpg)); 4226 4161 break; 4162 + case BNXT_RE_MMAP_DBR_BAR: 4163 + pfn = bnxt_entry->mem_offset >> PAGE_SHIFT; 4164 + ret = rdma_user_mmap_io(ib_uctx, vma, pfn, PAGE_SIZE, 4165 + pgprot_noncached(vma->vm_page_prot), 4166 + rdma_entry); 4167 + break; 4168 + case BNXT_RE_MMAP_DBR_PAGE: 4169 + /* Driver doesn't expect write access for user space */ 4170 + if (vma->vm_flags & VM_WRITE) 4171 + return -EFAULT; 4172 + ret = vm_insert_page(vma, vma->vm_start, 4173 + virt_to_page((void *)bnxt_entry->mem_offset)); 4174 + break; 4227 4175 default: 4228 4176 ret = -EINVAL; 4229 4177 break; ··· 4256 4178 kfree(bnxt_entry); 4257 4179 } 4258 4180 4181 + static int UVERBS_HANDLER(BNXT_RE_METHOD_NOTIFY_DRV)(struct uverbs_attr_bundle *attrs) 4182 + { 4183 + struct bnxt_re_ucontext *uctx; 4184 + 4185 + uctx = container_of(ib_uverbs_get_ucontext(attrs), struct bnxt_re_ucontext, ib_uctx); 4186 + bnxt_re_pacing_alert(uctx->rdev); 4187 + return 0; 4188 + } 4189 + 4259 4190 static int UVERBS_HANDLER(BNXT_RE_METHOD_ALLOC_PAGE)(struct uverbs_attr_bundle *attrs) 4260 4191 { 4261 4192 struct ib_uobject *uobj = uverbs_attr_get_uobject(attrs, BNXT_RE_ALLOC_PAGE_HANDLE); ··· 4277 4190 u64 mmap_offset; 4278 4191 u32 length; 4279 4192 u32 dpi; 4280 - u64 dbr; 4193 + u64 addr; 4281 4194 int err; 4282 4195 4283 4196 uctx = container_of(ib_uverbs_get_ucontext(attrs), struct bnxt_re_ucontext, ib_uctx); ··· 4299 4212 return -ENOMEM; 4300 4213 length = PAGE_SIZE; 4301 4214 dpi = uctx->wcdpi.dpi; 4302 - dbr = (u64)uctx->wcdpi.umdbr; 4215 + addr = (u64)uctx->wcdpi.umdbr; 4303 4216 mmap_flag = BNXT_RE_MMAP_WC_DB; 4304 4217 } else { 4305 4218 return -EINVAL; 4306 4219 } 4307 4220 4308 4221 break; 4222 + case BNXT_RE_ALLOC_DBR_BAR_PAGE: 4223 + length = PAGE_SIZE; 4224 + addr = (u64)rdev->pacing.dbr_bar_addr; 4225 + mmap_flag = BNXT_RE_MMAP_DBR_BAR; 4226 + break; 4227 + 4228 + case BNXT_RE_ALLOC_DBR_PAGE: 4229 + length = PAGE_SIZE; 4230 + addr = (u64)rdev->pacing.dbr_page; 4231 + mmap_flag = BNXT_RE_MMAP_DBR_PAGE; 4232 + break; 4309 4233 4310 4234 default: 4311 4235 return -EOPNOTSUPP; 4312 4236 } 4313 4237 4314 - entry = bnxt_re_mmap_entry_insert(uctx, dbr, mmap_flag, &mmap_offset); 4238 + entry = bnxt_re_mmap_entry_insert(uctx, addr, mmap_flag, &mmap_offset); 4315 4239 if (!entry) 4316 4240 return -ENOMEM; 4317 4241 ··· 4362 4264 uctx->wcdpi.dbr = NULL; 4363 4265 } 4364 4266 break; 4267 + case BNXT_RE_MMAP_DBR_BAR: 4268 + case BNXT_RE_MMAP_DBR_PAGE: 4269 + break; 4365 4270 default: 4366 4271 goto exit; 4367 4272 } ··· 4402 4301 &UVERBS_METHOD(BNXT_RE_METHOD_ALLOC_PAGE), 4403 4302 &UVERBS_METHOD(BNXT_RE_METHOD_DESTROY_PAGE)); 4404 4303 4304 + DECLARE_UVERBS_NAMED_METHOD(BNXT_RE_METHOD_NOTIFY_DRV); 4305 + 4306 + DECLARE_UVERBS_GLOBAL_METHODS(BNXT_RE_OBJECT_NOTIFY_DRV, 4307 + &UVERBS_METHOD(BNXT_RE_METHOD_NOTIFY_DRV)); 4308 + 4405 4309 const struct uapi_definition bnxt_re_uapi_defs[] = { 4406 4310 UAPI_DEF_CHAIN_OBJ_TREE_NAMED(BNXT_RE_OBJECT_ALLOC_PAGE), 4311 + UAPI_DEF_CHAIN_OBJ_TREE_NAMED(BNXT_RE_OBJECT_NOTIFY_DRV), 4407 4312 {} 4408 4313 };
+6
drivers/infiniband/hw/bnxt_re/ib_verbs.h
··· 146 146 BNXT_RE_MMAP_SH_PAGE, 147 147 BNXT_RE_MMAP_UC_DB, 148 148 BNXT_RE_MMAP_WC_DB, 149 + BNXT_RE_MMAP_DBR_PAGE, 150 + BNXT_RE_MMAP_DBR_BAR, 149 151 }; 150 152 151 153 struct bnxt_re_user_mmap_entry { ··· 229 227 struct ib_mr *bnxt_re_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, 230 228 u64 virt_addr, int mr_access_flags, 231 229 struct ib_udata *udata); 230 + struct ib_mr *bnxt_re_reg_user_mr_dmabuf(struct ib_pd *ib_pd, u64 start, 231 + u64 length, u64 virt_addr, 232 + int fd, int mr_access_flags, 233 + struct ib_udata *udata); 232 234 int bnxt_re_alloc_ucontext(struct ib_ucontext *ctx, struct ib_udata *udata); 233 235 void bnxt_re_dealloc_ucontext(struct ib_ucontext *context); 234 236 int bnxt_re_mmap(struct ib_ucontext *context, struct vm_area_struct *vma);
+247 -30
drivers/infiniband/hw/bnxt_re/main.c
··· 360 360 static int bnxt_re_register_netdev(struct bnxt_re_dev *rdev) 361 361 { 362 362 struct bnxt_en_dev *en_dev; 363 - int rc = 0; 363 + int rc; 364 364 365 365 en_dev = rdev->en_dev; 366 366 ··· 395 395 struct bnxt_en_dev *en_dev = rdev->en_dev; 396 396 struct hwrm_func_qcfg_output resp = {0}; 397 397 struct hwrm_func_qcfg_input req = {0}; 398 - struct bnxt_fw_msg fw_msg; 398 + struct bnxt_fw_msg fw_msg = {}; 399 399 int rc; 400 400 401 - memset(&fw_msg, 0, sizeof(fw_msg)); 402 401 bnxt_re_init_hwrm_hdr((void *)&req, HWRM_FUNC_QCFG); 403 402 req.fid = cpu_to_le16(0xffff); 404 403 bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp, ··· 431 432 return rc; 432 433 cctx->modes.db_push = le32_to_cpu(resp.flags) & FUNC_QCAPS_RESP_FLAGS_WCB_PUSH_MODE; 433 434 435 + cctx->modes.dbr_pacing = 436 + le32_to_cpu(resp.flags_ext2) & 437 + FUNC_QCAPS_RESP_FLAGS_EXT2_DBR_PACING_EXT_SUPPORTED; 434 438 return 0; 439 + } 440 + 441 + static int bnxt_re_hwrm_dbr_pacing_qcfg(struct bnxt_re_dev *rdev) 442 + { 443 + struct hwrm_func_dbr_pacing_qcfg_output resp = {}; 444 + struct hwrm_func_dbr_pacing_qcfg_input req = {}; 445 + struct bnxt_en_dev *en_dev = rdev->en_dev; 446 + struct bnxt_qplib_chip_ctx *cctx; 447 + struct bnxt_fw_msg fw_msg = {}; 448 + int rc; 449 + 450 + cctx = rdev->chip_ctx; 451 + bnxt_re_init_hwrm_hdr((void *)&req, HWRM_FUNC_DBR_PACING_QCFG); 452 + bnxt_re_fill_fw_msg(&fw_msg, (void *)&req, sizeof(req), (void *)&resp, 453 + sizeof(resp), DFLT_HWRM_CMD_TIMEOUT); 454 + rc = bnxt_send_msg(en_dev, &fw_msg); 455 + if (rc) 456 + return rc; 457 + 458 + if ((le32_to_cpu(resp.dbr_stat_db_fifo_reg) & 459 + FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_MASK) == 460 + FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_GRC) 461 + cctx->dbr_stat_db_fifo = 462 + le32_to_cpu(resp.dbr_stat_db_fifo_reg) & 463 + ~FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_MASK; 464 + return 0; 465 + } 466 + 467 + /* Update the pacing tunable parameters to the default values */ 468 + static void bnxt_re_set_default_pacing_data(struct bnxt_re_dev *rdev) 469 + { 470 + struct bnxt_qplib_db_pacing_data *pacing_data = rdev->qplib_res.pacing_data; 471 + 472 + pacing_data->do_pacing = rdev->pacing.dbr_def_do_pacing; 473 + pacing_data->pacing_th = rdev->pacing.pacing_algo_th; 474 + pacing_data->alarm_th = 475 + pacing_data->pacing_th * BNXT_RE_PACING_ALARM_TH_MULTIPLE; 476 + } 477 + 478 + static void __wait_for_fifo_occupancy_below_th(struct bnxt_re_dev *rdev) 479 + { 480 + u32 read_val, fifo_occup; 481 + 482 + /* loop shouldn't run infintely as the occupancy usually goes 483 + * below pacing algo threshold as soon as pacing kicks in. 484 + */ 485 + while (1) { 486 + read_val = readl(rdev->en_dev->bar0 + rdev->pacing.dbr_db_fifo_reg_off); 487 + fifo_occup = BNXT_RE_MAX_FIFO_DEPTH - 488 + ((read_val & BNXT_RE_DB_FIFO_ROOM_MASK) >> 489 + BNXT_RE_DB_FIFO_ROOM_SHIFT); 490 + /* Fifo occupancy cannot be greater the MAX FIFO depth */ 491 + if (fifo_occup > BNXT_RE_MAX_FIFO_DEPTH) 492 + break; 493 + 494 + if (fifo_occup < rdev->qplib_res.pacing_data->pacing_th) 495 + break; 496 + } 497 + } 498 + 499 + static void bnxt_re_db_fifo_check(struct work_struct *work) 500 + { 501 + struct bnxt_re_dev *rdev = container_of(work, struct bnxt_re_dev, 502 + dbq_fifo_check_work); 503 + struct bnxt_qplib_db_pacing_data *pacing_data; 504 + u32 pacing_save; 505 + 506 + if (!mutex_trylock(&rdev->pacing.dbq_lock)) 507 + return; 508 + pacing_data = rdev->qplib_res.pacing_data; 509 + pacing_save = rdev->pacing.do_pacing_save; 510 + __wait_for_fifo_occupancy_below_th(rdev); 511 + cancel_delayed_work_sync(&rdev->dbq_pacing_work); 512 + if (pacing_save > rdev->pacing.dbr_def_do_pacing) { 513 + /* Double the do_pacing value during the congestion */ 514 + pacing_save = pacing_save << 1; 515 + } else { 516 + /* 517 + * when a new congestion is detected increase the do_pacing 518 + * by 8 times. And also increase the pacing_th by 4 times. The 519 + * reason to increase pacing_th is to give more space for the 520 + * queue to oscillate down without getting empty, but also more 521 + * room for the queue to increase without causing another alarm. 522 + */ 523 + pacing_save = pacing_save << 3; 524 + pacing_data->pacing_th = rdev->pacing.pacing_algo_th * 4; 525 + } 526 + 527 + if (pacing_save > BNXT_RE_MAX_DBR_DO_PACING) 528 + pacing_save = BNXT_RE_MAX_DBR_DO_PACING; 529 + 530 + pacing_data->do_pacing = pacing_save; 531 + rdev->pacing.do_pacing_save = pacing_data->do_pacing; 532 + pacing_data->alarm_th = 533 + pacing_data->pacing_th * BNXT_RE_PACING_ALARM_TH_MULTIPLE; 534 + schedule_delayed_work(&rdev->dbq_pacing_work, 535 + msecs_to_jiffies(rdev->pacing.dbq_pacing_time)); 536 + rdev->stats.pacing.alerts++; 537 + mutex_unlock(&rdev->pacing.dbq_lock); 538 + } 539 + 540 + static void bnxt_re_pacing_timer_exp(struct work_struct *work) 541 + { 542 + struct bnxt_re_dev *rdev = container_of(work, struct bnxt_re_dev, 543 + dbq_pacing_work.work); 544 + struct bnxt_qplib_db_pacing_data *pacing_data; 545 + u32 read_val, fifo_occup; 546 + 547 + if (!mutex_trylock(&rdev->pacing.dbq_lock)) 548 + return; 549 + 550 + pacing_data = rdev->qplib_res.pacing_data; 551 + read_val = readl(rdev->en_dev->bar0 + rdev->pacing.dbr_db_fifo_reg_off); 552 + fifo_occup = BNXT_RE_MAX_FIFO_DEPTH - 553 + ((read_val & BNXT_RE_DB_FIFO_ROOM_MASK) >> 554 + BNXT_RE_DB_FIFO_ROOM_SHIFT); 555 + 556 + if (fifo_occup > pacing_data->pacing_th) 557 + goto restart_timer; 558 + 559 + /* 560 + * Instead of immediately going back to the default do_pacing 561 + * reduce it by 1/8 times and restart the timer. 562 + */ 563 + pacing_data->do_pacing = pacing_data->do_pacing - (pacing_data->do_pacing >> 3); 564 + pacing_data->do_pacing = max_t(u32, rdev->pacing.dbr_def_do_pacing, pacing_data->do_pacing); 565 + if (pacing_data->do_pacing <= rdev->pacing.dbr_def_do_pacing) { 566 + bnxt_re_set_default_pacing_data(rdev); 567 + rdev->stats.pacing.complete++; 568 + goto dbq_unlock; 569 + } 570 + 571 + restart_timer: 572 + schedule_delayed_work(&rdev->dbq_pacing_work, 573 + msecs_to_jiffies(rdev->pacing.dbq_pacing_time)); 574 + rdev->stats.pacing.resched++; 575 + dbq_unlock: 576 + rdev->pacing.do_pacing_save = pacing_data->do_pacing; 577 + mutex_unlock(&rdev->pacing.dbq_lock); 578 + } 579 + 580 + void bnxt_re_pacing_alert(struct bnxt_re_dev *rdev) 581 + { 582 + struct bnxt_qplib_db_pacing_data *pacing_data; 583 + 584 + if (!rdev->pacing.dbr_pacing) 585 + return; 586 + mutex_lock(&rdev->pacing.dbq_lock); 587 + pacing_data = rdev->qplib_res.pacing_data; 588 + 589 + /* 590 + * Increase the alarm_th to max so that other user lib instances do not 591 + * keep alerting the driver. 592 + */ 593 + pacing_data->alarm_th = BNXT_RE_MAX_FIFO_DEPTH; 594 + pacing_data->do_pacing = BNXT_RE_MAX_DBR_DO_PACING; 595 + cancel_work_sync(&rdev->dbq_fifo_check_work); 596 + schedule_work(&rdev->dbq_fifo_check_work); 597 + mutex_unlock(&rdev->pacing.dbq_lock); 598 + } 599 + 600 + static int bnxt_re_initialize_dbr_pacing(struct bnxt_re_dev *rdev) 601 + { 602 + if (bnxt_re_hwrm_dbr_pacing_qcfg(rdev)) 603 + return -EIO; 604 + 605 + /* Allocate a page for app use */ 606 + rdev->pacing.dbr_page = (void *)__get_free_page(GFP_KERNEL); 607 + if (!rdev->pacing.dbr_page) 608 + return -ENOMEM; 609 + 610 + memset((u8 *)rdev->pacing.dbr_page, 0, PAGE_SIZE); 611 + rdev->qplib_res.pacing_data = (struct bnxt_qplib_db_pacing_data *)rdev->pacing.dbr_page; 612 + 613 + /* MAP HW window 2 for reading db fifo depth */ 614 + writel(rdev->chip_ctx->dbr_stat_db_fifo & BNXT_GRC_BASE_MASK, 615 + rdev->en_dev->bar0 + BNXT_GRCPF_REG_WINDOW_BASE_OUT + 4); 616 + rdev->pacing.dbr_db_fifo_reg_off = 617 + (rdev->chip_ctx->dbr_stat_db_fifo & BNXT_GRC_OFFSET_MASK) + 618 + BNXT_RE_GRC_FIFO_REG_BASE; 619 + rdev->pacing.dbr_bar_addr = 620 + pci_resource_start(rdev->qplib_res.pdev, 0) + rdev->pacing.dbr_db_fifo_reg_off; 621 + 622 + rdev->pacing.pacing_algo_th = BNXT_RE_PACING_ALGO_THRESHOLD; 623 + rdev->pacing.dbq_pacing_time = BNXT_RE_DBR_PACING_TIME; 624 + rdev->pacing.dbr_def_do_pacing = BNXT_RE_DBR_DO_PACING_NO_CONGESTION; 625 + rdev->pacing.do_pacing_save = rdev->pacing.dbr_def_do_pacing; 626 + rdev->qplib_res.pacing_data->fifo_max_depth = BNXT_RE_MAX_FIFO_DEPTH; 627 + rdev->qplib_res.pacing_data->fifo_room_mask = BNXT_RE_DB_FIFO_ROOM_MASK; 628 + rdev->qplib_res.pacing_data->fifo_room_shift = BNXT_RE_DB_FIFO_ROOM_SHIFT; 629 + rdev->qplib_res.pacing_data->grc_reg_offset = rdev->pacing.dbr_db_fifo_reg_off; 630 + bnxt_re_set_default_pacing_data(rdev); 631 + /* Initialize worker for DBR Pacing */ 632 + INIT_WORK(&rdev->dbq_fifo_check_work, bnxt_re_db_fifo_check); 633 + INIT_DELAYED_WORK(&rdev->dbq_pacing_work, bnxt_re_pacing_timer_exp); 634 + return 0; 635 + } 636 + 637 + static void bnxt_re_deinitialize_dbr_pacing(struct bnxt_re_dev *rdev) 638 + { 639 + cancel_work_sync(&rdev->dbq_fifo_check_work); 640 + cancel_delayed_work_sync(&rdev->dbq_pacing_work); 641 + if (rdev->pacing.dbr_page) 642 + free_page((u64)rdev->pacing.dbr_page); 643 + 644 + rdev->pacing.dbr_page = NULL; 645 + rdev->pacing.dbr_pacing = false; 435 646 } 436 647 437 648 static int bnxt_re_net_ring_free(struct bnxt_re_dev *rdev, ··· 861 652 .query_qp = bnxt_re_query_qp, 862 653 .query_srq = bnxt_re_query_srq, 863 654 .reg_user_mr = bnxt_re_reg_user_mr, 655 + .reg_user_mr_dmabuf = bnxt_re_reg_user_mr_dmabuf, 864 656 .req_notify_cq = bnxt_re_req_notify_cq, 865 657 .resize_cq = bnxt_re_resize_cq, 866 658 INIT_RDMA_OBJ_SIZE(ib_ah, bnxt_re_ah, ib_ah), ··· 921 711 rdev->id = rdev->en_dev->pdev->devfn; 922 712 INIT_LIST_HEAD(&rdev->qp_list); 923 713 mutex_init(&rdev->qp_lock); 924 - atomic_set(&rdev->qp_count, 0); 925 - atomic_set(&rdev->cq_count, 0); 926 - atomic_set(&rdev->srq_count, 0); 927 - atomic_set(&rdev->mr_count, 0); 928 - atomic_set(&rdev->mw_count, 0); 929 - atomic_set(&rdev->ah_count, 0); 930 - atomic_set(&rdev->pd_count, 0); 714 + mutex_init(&rdev->pacing.dbq_lock); 715 + atomic_set(&rdev->stats.res.qp_count, 0); 716 + atomic_set(&rdev->stats.res.cq_count, 0); 717 + atomic_set(&rdev->stats.res.srq_count, 0); 718 + atomic_set(&rdev->stats.res.mr_count, 0); 719 + atomic_set(&rdev->stats.res.mw_count, 0); 720 + atomic_set(&rdev->stats.res.ah_count, 0); 721 + atomic_set(&rdev->stats.res.pd_count, 0); 931 722 rdev->cosq[0] = 0xFFFF; 932 723 rdev->cosq[1] = 0xFFFF; 933 724 ··· 970 759 static int bnxt_re_handle_qp_async_event(struct creq_qp_event *qp_event, 971 760 struct bnxt_re_qp *qp) 972 761 { 973 - struct ib_event event; 762 + struct ib_event event = {}; 974 763 unsigned int flags; 975 764 976 765 if (qp->qplib_qp.state == CMDQ_MODIFY_QP_NEW_STATE_ERR && ··· 980 769 bnxt_re_unlock_cqs(qp, flags); 981 770 } 982 771 983 - memset(&event, 0, sizeof(event)); 984 772 if (qp->qplib_qp.srq) { 985 773 event.device = &qp->rdev->ibdev; 986 774 event.element.qp = &qp->ib_qp; ··· 1147 937 { 1148 938 struct bnxt_re_ring_attr rattr = {}; 1149 939 int num_vec_created = 0; 1150 - int rc = 0, i; 940 + int rc, i; 1151 941 u8 type; 1152 942 1153 943 /* Configure and allocate resources for qplib */ 1154 944 rdev->qplib_res.rcfw = &rdev->rcfw; 1155 - rc = bnxt_qplib_get_dev_attr(&rdev->rcfw, &rdev->dev_attr, 1156 - rdev->is_virtfn); 945 + rc = bnxt_qplib_get_dev_attr(&rdev->rcfw, &rdev->dev_attr); 1157 946 if (rc) 1158 947 goto fail; 1159 948 ··· 1299 1090 { 1300 1091 u32 prio_map = 0, tmp_map = 0; 1301 1092 struct net_device *netdev; 1302 - struct dcb_app app; 1093 + struct dcb_app app = {}; 1303 1094 1304 1095 netdev = rdev->netdev; 1305 1096 1306 - memset(&app, 0, sizeof(app)); 1307 1097 app.selector = IEEE_8021QAZ_APP_SEL_ETHERTYPE; 1308 1098 app.protocol = ETH_P_IBOE; 1309 1099 tmp_map = dcb_ieee_getapp_mask(netdev, &app); ··· 1331 1123 */ 1332 1124 if ((prio_map == 0 && rdev->qplib_res.prio) || 1333 1125 (prio_map != 0 && !rdev->qplib_res.prio)) { 1334 - rdev->qplib_res.prio = prio_map ? true : false; 1335 - 1126 + rdev->qplib_res.prio = prio_map; 1336 1127 bnxt_re_update_gid(rdev); 1337 1128 } 1338 1129 ··· 1345 1138 struct hwrm_ver_get_input req = {}; 1346 1139 struct bnxt_qplib_chip_ctx *cctx; 1347 1140 struct bnxt_fw_msg fw_msg = {}; 1348 - int rc = 0; 1141 + int rc; 1349 1142 1350 1143 bnxt_re_init_hwrm_hdr((void *)&req, HWRM_VER_GET); 1351 1144 req.hwrm_intf_maj = HWRM_VERSION_MAJOR; ··· 1375 1168 1376 1169 static int bnxt_re_ib_init(struct bnxt_re_dev *rdev) 1377 1170 { 1378 - int rc = 0; 1171 + int rc; 1379 1172 u32 event; 1380 1173 1381 1174 /* Register ib dev */ ··· 1421 1214 bnxt_re_net_ring_free(rdev, rdev->rcfw.creq.ring_id, type); 1422 1215 bnxt_qplib_free_rcfw_channel(&rdev->rcfw); 1423 1216 } 1424 - if (test_and_clear_bit(BNXT_RE_FLAG_GOT_MSIX, &rdev->flags)) 1425 - rdev->num_msix = 0; 1217 + 1218 + rdev->num_msix = 0; 1219 + 1220 + if (rdev->pacing.dbr_pacing) 1221 + bnxt_re_deinitialize_dbr_pacing(rdev); 1426 1222 1427 1223 bnxt_re_destroy_chip_ctx(rdev); 1428 1224 if (test_and_clear_bit(BNXT_RE_FLAG_NETDEV_REGISTERED, &rdev->flags)) ··· 1444 1234 1445 1235 static int bnxt_re_dev_init(struct bnxt_re_dev *rdev, u8 wqe_mode) 1446 1236 { 1237 + struct bnxt_re_ring_attr rattr = {}; 1447 1238 struct bnxt_qplib_creq_ctx *creq; 1448 - struct bnxt_re_ring_attr rattr; 1449 1239 u32 db_offt; 1450 1240 int vid; 1451 1241 u8 type; 1452 1242 int rc; 1453 1243 1454 1244 /* Registered a new RoCE device instance to netdev */ 1455 - memset(&rattr, 0, sizeof(rattr)); 1456 1245 rc = bnxt_re_register_netdev(rdev); 1457 1246 if (rc) { 1458 1247 ibdev_err(&rdev->ibdev, ··· 1480 1271 ibdev_dbg(&rdev->ibdev, "Got %d MSI-X vectors\n", 1481 1272 rdev->en_dev->ulp_tbl->msix_requested); 1482 1273 rdev->num_msix = rdev->en_dev->ulp_tbl->msix_requested; 1483 - set_bit(BNXT_RE_FLAG_GOT_MSIX, &rdev->flags); 1484 1274 1485 1275 bnxt_re_query_hwrm_intf_version(rdev); 1486 1276 ··· 1519 1311 goto free_ring; 1520 1312 } 1521 1313 1522 - rc = bnxt_qplib_get_dev_attr(&rdev->rcfw, &rdev->dev_attr, 1523 - rdev->is_virtfn); 1314 + if (bnxt_qplib_dbr_pacing_en(rdev->chip_ctx)) { 1315 + rc = bnxt_re_initialize_dbr_pacing(rdev); 1316 + if (!rc) { 1317 + rdev->pacing.dbr_pacing = true; 1318 + } else { 1319 + ibdev_err(&rdev->ibdev, 1320 + "DBR pacing disabled with error : %d\n", rc); 1321 + rdev->pacing.dbr_pacing = false; 1322 + } 1323 + } 1324 + rc = bnxt_qplib_get_dev_attr(&rdev->rcfw, &rdev->dev_attr); 1524 1325 if (rc) 1525 1326 goto disable_rcfw; 1526 1327 ··· 1617 1400 container_of(adev, struct bnxt_aux_priv, aux_dev); 1618 1401 struct bnxt_en_dev *en_dev; 1619 1402 struct bnxt_re_dev *rdev; 1620 - int rc = 0; 1403 + int rc; 1621 1404 1622 1405 /* en_dev should never be NULL as long as adev and aux_dev are valid. */ 1623 1406 en_dev = aux_priv->edev; ··· 1863 1646 1864 1647 static int __init bnxt_re_mod_init(void) 1865 1648 { 1866 - int rc = 0; 1649 + int rc; 1867 1650 1868 1651 pr_info("%s: %s", ROCE_DRV_MODULE_NAME, version); 1869 1652 rc = auxiliary_driver_register(&bnxt_re_driver);
+26 -21
drivers/infiniband/hw/bnxt_re/qplib_fp.c
··· 535 535 cqn_handler_t cqn_handler, 536 536 srqn_handler_t srqn_handler) 537 537 { 538 - int rc = -1; 538 + int rc; 539 539 540 540 nq->pdev = pdev; 541 541 nq->cqn_handler = cqn_handler; ··· 727 727 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 728 728 struct creq_query_srq_resp resp = {}; 729 729 struct bnxt_qplib_cmdqmsg msg = {}; 730 - struct bnxt_qplib_rcfw_sbuf *sbuf; 730 + struct bnxt_qplib_rcfw_sbuf sbuf; 731 731 struct creq_query_srq_resp_sb *sb; 732 732 struct cmdq_query_srq req = {}; 733 - int rc = 0; 733 + int rc; 734 734 735 735 bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 736 736 CMDQ_BASE_OPCODE_QUERY_SRQ, 737 737 sizeof(req)); 738 738 739 739 /* Configure the request */ 740 - sbuf = bnxt_qplib_rcfw_alloc_sbuf(rcfw, sizeof(*sb)); 741 - if (!sbuf) 740 + sbuf.size = ALIGN(sizeof(*sb), BNXT_QPLIB_CMDQE_UNITS); 741 + sbuf.sb = dma_alloc_coherent(&rcfw->pdev->dev, sbuf.size, 742 + &sbuf.dma_addr, GFP_KERNEL); 743 + if (!sbuf.sb) 742 744 return -ENOMEM; 743 - req.resp_size = sizeof(*sb) / BNXT_QPLIB_CMDQE_UNITS; 745 + req.resp_size = sbuf.size / BNXT_QPLIB_CMDQE_UNITS; 744 746 req.srq_cid = cpu_to_le32(srq->id); 745 - sb = sbuf->sb; 746 - bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, sbuf, sizeof(req), 747 + sb = sbuf.sb; 748 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, &sbuf, sizeof(req), 747 749 sizeof(resp), 0); 748 750 rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 749 751 srq->threshold = le16_to_cpu(sb->srq_limit); 750 - bnxt_qplib_rcfw_free_sbuf(rcfw, sbuf); 752 + dma_free_coherent(&rcfw->pdev->dev, sbuf.size, 753 + sbuf.sb, sbuf.dma_addr); 751 754 752 755 return rc; 753 756 } ··· 1368 1365 struct bnxt_qplib_rcfw *rcfw = res->rcfw; 1369 1366 struct creq_query_qp_resp resp = {}; 1370 1367 struct bnxt_qplib_cmdqmsg msg = {}; 1371 - struct bnxt_qplib_rcfw_sbuf *sbuf; 1368 + struct bnxt_qplib_rcfw_sbuf sbuf; 1372 1369 struct creq_query_qp_resp_sb *sb; 1373 1370 struct cmdq_query_qp req = {}; 1374 1371 u32 temp32[4]; 1375 - int i, rc = 0; 1372 + int i, rc; 1373 + 1374 + sbuf.size = ALIGN(sizeof(*sb), BNXT_QPLIB_CMDQE_UNITS); 1375 + sbuf.sb = dma_alloc_coherent(&rcfw->pdev->dev, sbuf.size, 1376 + &sbuf.dma_addr, GFP_KERNEL); 1377 + if (!sbuf.sb) 1378 + return -ENOMEM; 1379 + sb = sbuf.sb; 1376 1380 1377 1381 bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 1378 1382 CMDQ_BASE_OPCODE_QUERY_QP, 1379 1383 sizeof(req)); 1380 1384 1381 - sbuf = bnxt_qplib_rcfw_alloc_sbuf(rcfw, sizeof(*sb)); 1382 - if (!sbuf) 1383 - return -ENOMEM; 1384 - sb = sbuf->sb; 1385 - 1386 1385 req.qp_cid = cpu_to_le32(qp->id); 1387 - req.resp_size = sizeof(*sb) / BNXT_QPLIB_CMDQE_UNITS; 1388 - bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, sbuf, sizeof(req), 1386 + req.resp_size = sbuf.size / BNXT_QPLIB_CMDQE_UNITS; 1387 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, &sbuf, sizeof(req), 1389 1388 sizeof(resp), 0); 1390 1389 rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 1391 1390 if (rc) ··· 1396 1391 qp->state = sb->en_sqd_async_notify_state & 1397 1392 CREQ_QUERY_QP_RESP_SB_STATE_MASK; 1398 1393 qp->en_sqd_async_notify = sb->en_sqd_async_notify_state & 1399 - CREQ_QUERY_QP_RESP_SB_EN_SQD_ASYNC_NOTIFY ? 1400 - true : false; 1394 + CREQ_QUERY_QP_RESP_SB_EN_SQD_ASYNC_NOTIFY; 1401 1395 qp->access = sb->access; 1402 1396 qp->pkey_index = le16_to_cpu(sb->pkey); 1403 1397 qp->qkey = le32_to_cpu(sb->qkey); ··· 1446 1442 memcpy(qp->smac, sb->src_mac, 6); 1447 1443 qp->vlan_id = le16_to_cpu(sb->vlan_pcp_vlan_dei_vlan_id); 1448 1444 bail: 1449 - bnxt_qplib_rcfw_free_sbuf(rcfw, sbuf); 1445 + dma_free_coherent(&rcfw->pdev->dev, sbuf.size, 1446 + sbuf.sb, sbuf.dma_addr); 1450 1447 return rc; 1451 1448 } 1452 1449
+18 -48
drivers/infiniband/hw/bnxt_re/qplib_rcfw.c
··· 55 55 56 56 /** 57 57 * bnxt_qplib_map_rc - map return type based on opcode 58 - * @opcode - roce slow path opcode 58 + * @opcode: roce slow path opcode 59 59 * 60 60 * case #1 61 61 * Firmware initiated error recovery is a safe state machine and ··· 98 98 99 99 /** 100 100 * bnxt_re_is_fw_stalled - Check firmware health 101 - * @rcfw - rcfw channel instance of rdev 102 - * @cookie - cookie to track the command 101 + * @rcfw: rcfw channel instance of rdev 102 + * @cookie: cookie to track the command 103 103 * 104 104 * If firmware has not responded any rcfw command within 105 105 * rcfw->max_timeout, consider firmware as stalled. ··· 133 133 134 134 /** 135 135 * __wait_for_resp - Don't hold the cpu context and wait for response 136 - * @rcfw - rcfw channel instance of rdev 137 - * @cookie - cookie to track the command 136 + * @rcfw: rcfw channel instance of rdev 137 + * @cookie: cookie to track the command 138 138 * 139 139 * Wait for command completion in sleepable context. 140 140 * ··· 179 179 180 180 /** 181 181 * __block_for_resp - hold the cpu context and wait for response 182 - * @rcfw - rcfw channel instance of rdev 183 - * @cookie - cookie to track the command 182 + * @rcfw: rcfw channel instance of rdev 183 + * @cookie: cookie to track the command 184 184 * 185 185 * This function will hold the cpu (non-sleepable context) and 186 186 * wait for command completion. Maximum holding interval is 8 second. ··· 216 216 }; 217 217 218 218 /* __send_message_no_waiter - get cookie and post the message. 219 - * @rcfw - rcfw channel instance of rdev 220 - * @msg - qplib message internal 219 + * @rcfw: rcfw channel instance of rdev 220 + * @msg: qplib message internal 221 221 * 222 222 * This function will just post and don't bother about completion. 223 223 * Current design of this function is - ··· 335 335 cpu_to_le64(sbuf->dma_addr)); 336 336 __set_cmdq_base_resp_size(msg->req, msg->req_sz, 337 337 ALIGN(sbuf->size, 338 - BNXT_QPLIB_CMDQE_UNITS)); 338 + BNXT_QPLIB_CMDQE_UNITS) / 339 + BNXT_QPLIB_CMDQE_UNITS); 339 340 } 340 341 341 342 preq = (u8 *)msg->req; ··· 374 373 375 374 /** 376 375 * __poll_for_resp - self poll completion for rcfw command 377 - * @rcfw - rcfw channel instance of rdev 378 - * @cookie - cookie to track the command 376 + * @rcfw: rcfw channel instance of rdev 377 + * @cookie: cookie to track the command 379 378 * 380 379 * It works same as __wait_for_resp except this function will 381 380 * do self polling in sort interval since interrupt is disabled. ··· 471 470 /** 472 471 * __bnxt_qplib_rcfw_send_message - qplib interface to send 473 472 * and complete rcfw command. 474 - * @rcfw - rcfw channel instance of rdev 475 - * @msg - qplib message internal 473 + * @rcfw: rcfw channel instance of rdev 474 + * @msg: qplib message internal 476 475 * 477 476 * This function does not account shadow queue depth. It will send 478 477 * all the command unconditionally as long as send queue is not full. ··· 488 487 struct bnxt_qplib_crsqe *crsqe; 489 488 unsigned long flags; 490 489 u16 cookie; 491 - int rc = 0; 490 + int rc; 492 491 u8 opcode; 493 492 494 493 opcode = __get_cmdq_base_opcode(msg->req, msg->req_sz); ··· 534 533 /** 535 534 * bnxt_qplib_rcfw_send_message - qplib interface to send 536 535 * and complete rcfw command. 537 - * @rcfw - rcfw channel instance of rdev 538 - * @msg - qplib message internal 536 + * @rcfw: rcfw channel instance of rdev 537 + * @msg: qplib message internal 539 538 * 540 539 * Driver interact with Firmware through rcfw channel/slow path in two ways. 541 540 * a. Blocking rcfw command send. In this path, driver cannot hold ··· 1195 1194 bnxt_qplib_start_rcfw(rcfw); 1196 1195 1197 1196 return 0; 1198 - } 1199 - 1200 - struct bnxt_qplib_rcfw_sbuf *bnxt_qplib_rcfw_alloc_sbuf( 1201 - struct bnxt_qplib_rcfw *rcfw, 1202 - u32 size) 1203 - { 1204 - struct bnxt_qplib_rcfw_sbuf *sbuf; 1205 - 1206 - sbuf = kzalloc(sizeof(*sbuf), GFP_KERNEL); 1207 - if (!sbuf) 1208 - return NULL; 1209 - 1210 - sbuf->size = size; 1211 - sbuf->sb = dma_alloc_coherent(&rcfw->pdev->dev, sbuf->size, 1212 - &sbuf->dma_addr, GFP_KERNEL); 1213 - if (!sbuf->sb) 1214 - goto bail; 1215 - 1216 - return sbuf; 1217 - bail: 1218 - kfree(sbuf); 1219 - return NULL; 1220 - } 1221 - 1222 - void bnxt_qplib_rcfw_free_sbuf(struct bnxt_qplib_rcfw *rcfw, 1223 - struct bnxt_qplib_rcfw_sbuf *sbuf) 1224 - { 1225 - if (sbuf->sb) 1226 - dma_free_coherent(&rcfw->pdev->dev, sbuf->size, 1227 - sbuf->sb, sbuf->dma_addr); 1228 - kfree(sbuf); 1229 1197 }
+26 -12
drivers/infiniband/hw/bnxt_re/qplib_res.c
··· 118 118 else 119 119 pages = sginfo->npages; 120 120 /* page ptr arrays */ 121 - pbl->pg_arr = vmalloc(pages * sizeof(void *)); 121 + pbl->pg_arr = vmalloc_array(pages, sizeof(void *)); 122 122 if (!pbl->pg_arr) 123 123 return -ENOMEM; 124 124 125 - pbl->pg_map_arr = vmalloc(pages * sizeof(dma_addr_t)); 125 + pbl->pg_map_arr = vmalloc_array(pages, sizeof(dma_addr_t)); 126 126 if (!pbl->pg_map_arr) { 127 127 vfree(pbl->pg_arr); 128 128 pbl->pg_arr = NULL; ··· 385 385 struct bnxt_qplib_hwq_attr hwq_attr = {}; 386 386 struct bnxt_qplib_sg_info sginfo = {}; 387 387 struct bnxt_qplib_tqm_ctx *tqmctx; 388 - int rc = 0; 388 + int rc; 389 389 int i; 390 390 391 391 tqmctx = &ctx->tqm_ctx; ··· 463 463 static int bnxt_qplib_setup_tqm_rings(struct bnxt_qplib_res *res, 464 464 struct bnxt_qplib_ctx *ctx) 465 465 { 466 - int rc = 0; 466 + int rc; 467 467 468 468 rc = bnxt_qplib_alloc_tqm_rings(res, ctx); 469 469 if (rc) ··· 501 501 { 502 502 struct bnxt_qplib_hwq_attr hwq_attr = {}; 503 503 struct bnxt_qplib_sg_info sginfo = {}; 504 - int rc = 0; 504 + int rc; 505 505 506 506 if (virt_fn || is_p5) 507 507 goto stats_alloc; ··· 642 642 } 643 643 644 644 /* PDs */ 645 - int bnxt_qplib_alloc_pd(struct bnxt_qplib_pd_tbl *pdt, struct bnxt_qplib_pd *pd) 645 + int bnxt_qplib_alloc_pd(struct bnxt_qplib_res *res, struct bnxt_qplib_pd *pd) 646 646 { 647 + struct bnxt_qplib_pd_tbl *pdt = &res->pd_tbl; 647 648 u32 bit_num; 649 + int rc = 0; 648 650 651 + mutex_lock(&res->pd_tbl_lock); 649 652 bit_num = find_first_bit(pdt->tbl, pdt->max); 650 - if (bit_num == pdt->max) 651 - return -ENOMEM; 653 + if (bit_num == pdt->max) { 654 + rc = -ENOMEM; 655 + goto exit; 656 + } 652 657 653 658 /* Found unused PD */ 654 659 clear_bit(bit_num, pdt->tbl); 655 660 pd->id = bit_num; 656 - return 0; 661 + exit: 662 + mutex_unlock(&res->pd_tbl_lock); 663 + return rc; 657 664 } 658 665 659 666 int bnxt_qplib_dealloc_pd(struct bnxt_qplib_res *res, 660 667 struct bnxt_qplib_pd_tbl *pdt, 661 668 struct bnxt_qplib_pd *pd) 662 669 { 670 + int rc = 0; 671 + 672 + mutex_lock(&res->pd_tbl_lock); 663 673 if (test_and_set_bit(pd->id, pdt->tbl)) { 664 674 dev_warn(&res->pdev->dev, "Freeing an unused PD? pdn = %d\n", 665 675 pd->id); 666 - return -EINVAL; 676 + rc = -EINVAL; 677 + goto exit; 667 678 } 668 679 pd->id = 0; 669 - return 0; 680 + exit: 681 + mutex_unlock(&res->pd_tbl_lock); 682 + return rc; 670 683 } 671 684 672 685 static void bnxt_qplib_free_pd_tbl(struct bnxt_qplib_pd_tbl *pdt) ··· 704 691 705 692 pdt->max = max; 706 693 memset((u8 *)pdt->tbl, 0xFF, bytes); 694 + mutex_init(&res->pd_tbl_lock); 707 695 708 696 return 0; 709 697 } ··· 891 877 struct net_device *netdev, 892 878 struct bnxt_qplib_dev_attr *dev_attr) 893 879 { 894 - int rc = 0; 880 + int rc; 895 881 896 882 res->pdev = pdev; 897 883 res->netdev = netdev;
+22 -1
drivers/infiniband/hw/bnxt_re/qplib_res.h
··· 48 48 struct bnxt_qplib_drv_modes { 49 49 u8 wqe_mode; 50 50 bool db_push; 51 + bool dbr_pacing; 51 52 }; 52 53 53 54 struct bnxt_qplib_chip_ctx { ··· 59 58 u16 hwrm_cmd_max_timeout; 60 59 struct bnxt_qplib_drv_modes modes; 61 60 u64 hwrm_intf_ver; 61 + u32 dbr_stat_db_fifo; 62 + }; 63 + 64 + struct bnxt_qplib_db_pacing_data { 65 + u32 do_pacing; 66 + u32 pacing_th; 67 + u32 alarm_th; 68 + u32 fifo_max_depth; 69 + u32 fifo_room_mask; 70 + u32 fifo_room_shift; 71 + u32 grc_reg_offset; 62 72 }; 63 73 64 74 #define BNXT_QPLIB_DBR_PF_DB_OFFSET 0x10000 ··· 277 265 struct net_device *netdev; 278 266 struct bnxt_qplib_rcfw *rcfw; 279 267 struct bnxt_qplib_pd_tbl pd_tbl; 268 + /* To protect the pd table bit map */ 269 + struct mutex pd_tbl_lock; 280 270 struct bnxt_qplib_sgid_tbl sgid_tbl; 281 271 struct bnxt_qplib_dpi_tbl dpi_tbl; 282 272 /* To protect the dpi table bit map */ 283 273 struct mutex dpi_tbl_lock; 284 274 bool prio; 285 275 bool is_vf; 276 + struct bnxt_qplib_db_pacing_data *pacing_data; 286 277 }; 287 278 288 279 static inline bool bnxt_qplib_is_chip_gen_p5(struct bnxt_qplib_chip_ctx *cctx) ··· 370 355 struct bnxt_qplib_hwq *hwq); 371 356 int bnxt_qplib_alloc_init_hwq(struct bnxt_qplib_hwq *hwq, 372 357 struct bnxt_qplib_hwq_attr *hwq_attr); 373 - int bnxt_qplib_alloc_pd(struct bnxt_qplib_pd_tbl *pd_tbl, 358 + int bnxt_qplib_alloc_pd(struct bnxt_qplib_res *res, 374 359 struct bnxt_qplib_pd *pd); 375 360 int bnxt_qplib_dealloc_pd(struct bnxt_qplib_res *res, 376 361 struct bnxt_qplib_pd_tbl *pd_tbl, ··· 482 467 return dev_cap_flags & 483 468 CREQ_QUERY_FUNC_RESP_SB_EXT_STATS; 484 469 } 470 + 471 + static inline u8 bnxt_qplib_dbr_pacing_en(struct bnxt_qplib_chip_ctx *cctx) 472 + { 473 + return cctx->modes.dbr_pacing; 474 + } 475 + 485 476 #endif /* __BNXT_QPLIB_RES_H__ */
+45 -40
drivers/infiniband/hw/bnxt_re/qplib_sp.c
··· 72 72 struct creq_query_version_resp resp = {}; 73 73 struct bnxt_qplib_cmdqmsg msg = {}; 74 74 struct cmdq_query_version req = {}; 75 - int rc = 0; 75 + int rc; 76 76 77 77 bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 78 78 CMDQ_BASE_OPCODE_QUERY_VERSION, ··· 89 89 } 90 90 91 91 int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, 92 - struct bnxt_qplib_dev_attr *attr, bool vf) 92 + struct bnxt_qplib_dev_attr *attr) 93 93 { 94 94 struct creq_query_func_resp resp = {}; 95 95 struct bnxt_qplib_cmdqmsg msg = {}; 96 96 struct creq_query_func_resp_sb *sb; 97 - struct bnxt_qplib_rcfw_sbuf *sbuf; 97 + struct bnxt_qplib_rcfw_sbuf sbuf; 98 98 struct cmdq_query_func req = {}; 99 99 u8 *tqm_alloc; 100 - int i, rc = 0; 100 + int i, rc; 101 101 u32 temp; 102 102 103 103 bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 104 104 CMDQ_BASE_OPCODE_QUERY_FUNC, 105 105 sizeof(req)); 106 106 107 - sbuf = bnxt_qplib_rcfw_alloc_sbuf(rcfw, sizeof(*sb)); 108 - if (!sbuf) { 109 - dev_err(&rcfw->pdev->dev, 110 - "SP: QUERY_FUNC alloc side buffer failed\n"); 107 + sbuf.size = ALIGN(sizeof(*sb), BNXT_QPLIB_CMDQE_UNITS); 108 + sbuf.sb = dma_alloc_coherent(&rcfw->pdev->dev, sbuf.size, 109 + &sbuf.dma_addr, GFP_KERNEL); 110 + if (!sbuf.sb) 111 111 return -ENOMEM; 112 - } 113 - 114 - sb = sbuf->sb; 115 - req.resp_size = sizeof(*sb) / BNXT_QPLIB_CMDQE_UNITS; 116 - bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, sbuf, sizeof(req), 112 + sb = sbuf.sb; 113 + req.resp_size = sbuf.size / BNXT_QPLIB_CMDQE_UNITS; 114 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, &sbuf, sizeof(req), 117 115 sizeof(resp), 0); 118 116 rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 119 117 if (rc) ··· 119 121 120 122 /* Extract the context from the side buffer */ 121 123 attr->max_qp = le32_to_cpu(sb->max_qp); 122 - /* max_qp value reported by FW for PF doesn't include the QP1 for PF */ 123 - if (!vf) 124 - attr->max_qp += 1; 124 + /* max_qp value reported by FW doesn't include the QP1 */ 125 + attr->max_qp += 1; 125 126 attr->max_qp_rd_atom = 126 127 sb->max_qp_rd_atom > BNXT_QPLIB_MAX_OUT_RD_ATOM ? 127 128 BNXT_QPLIB_MAX_OUT_RD_ATOM : sb->max_qp_rd_atom; ··· 172 175 173 176 attr->is_atomic = bnxt_qplib_is_atomic_cap(rcfw); 174 177 bail: 175 - bnxt_qplib_rcfw_free_sbuf(rcfw, sbuf); 178 + dma_free_coherent(&rcfw->pdev->dev, sbuf.size, 179 + sbuf.sb, sbuf.dma_addr); 176 180 return rc; 177 181 } 178 182 ··· 184 186 struct creq_set_func_resources_resp resp = {}; 185 187 struct cmdq_set_func_resources req = {}; 186 188 struct bnxt_qplib_cmdqmsg msg = {}; 187 - int rc = 0; 189 + int rc; 188 190 189 191 bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 190 192 CMDQ_BASE_OPCODE_SET_FUNC_RESOURCES, ··· 716 718 struct creq_query_roce_stats_resp_sb *sb; 717 719 struct cmdq_query_roce_stats req = {}; 718 720 struct bnxt_qplib_cmdqmsg msg = {}; 719 - struct bnxt_qplib_rcfw_sbuf *sbuf; 720 - int rc = 0; 721 + struct bnxt_qplib_rcfw_sbuf sbuf; 722 + int rc; 721 723 722 724 bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 723 725 CMDQ_BASE_OPCODE_QUERY_ROCE_STATS, 724 726 sizeof(req)); 725 727 726 - sbuf = bnxt_qplib_rcfw_alloc_sbuf(rcfw, sizeof(*sb)); 727 - if (!sbuf) { 728 - dev_err(&rcfw->pdev->dev, 729 - "SP: QUERY_ROCE_STATS alloc side buffer failed\n"); 728 + sbuf.size = ALIGN(sizeof(*sb), BNXT_QPLIB_CMDQE_UNITS); 729 + sbuf.sb = dma_alloc_coherent(&rcfw->pdev->dev, sbuf.size, 730 + &sbuf.dma_addr, GFP_KERNEL); 731 + if (!sbuf.sb) 730 732 return -ENOMEM; 731 - } 733 + sb = sbuf.sb; 732 734 733 - sb = sbuf->sb; 734 - req.resp_size = sizeof(*sb) / BNXT_QPLIB_CMDQE_UNITS; 735 - bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, sbuf, sizeof(req), 735 + req.resp_size = sbuf.size / BNXT_QPLIB_CMDQE_UNITS; 736 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, &sbuf, sizeof(req), 736 737 sizeof(resp), 0); 737 738 rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 738 739 if (rc) ··· 787 790 } 788 791 789 792 bail: 790 - bnxt_qplib_rcfw_free_sbuf(rcfw, sbuf); 793 + dma_free_coherent(&rcfw->pdev->dev, sbuf.size, 794 + sbuf.sb, sbuf.dma_addr); 791 795 return rc; 792 796 } 793 797 ··· 799 801 struct creq_query_roce_stats_ext_resp_sb *sb; 800 802 struct cmdq_query_roce_stats_ext req = {}; 801 803 struct bnxt_qplib_cmdqmsg msg = {}; 802 - struct bnxt_qplib_rcfw_sbuf *sbuf; 804 + struct bnxt_qplib_rcfw_sbuf sbuf; 803 805 int rc; 804 806 805 - sbuf = bnxt_qplib_rcfw_alloc_sbuf(rcfw, sizeof(*sb)); 806 - if (!sbuf) { 807 - dev_err(&rcfw->pdev->dev, 808 - "SP: QUERY_ROCE_STATS_EXT alloc sb failed"); 807 + sbuf.size = ALIGN(sizeof(*sb), BNXT_QPLIB_CMDQE_UNITS); 808 + sbuf.sb = dma_alloc_coherent(&rcfw->pdev->dev, sbuf.size, 809 + &sbuf.dma_addr, GFP_KERNEL); 810 + if (!sbuf.sb) 809 811 return -ENOMEM; 810 - } 811 812 813 + sb = sbuf.sb; 812 814 bnxt_qplib_rcfw_cmd_prep((struct cmdq_base *)&req, 813 815 CMDQ_QUERY_ROCE_STATS_EXT_OPCODE_QUERY_ROCE_STATS, 814 816 sizeof(req)); 815 817 816 - req.resp_size = ALIGN(sizeof(*sb), BNXT_QPLIB_CMDQE_UNITS); 817 - req.resp_addr = cpu_to_le64(sbuf->dma_addr); 818 + req.resp_size = sbuf.size / BNXT_QPLIB_CMDQE_UNITS; 819 + req.resp_addr = cpu_to_le64(sbuf.dma_addr); 818 820 req.function_id = cpu_to_le32(fid); 819 821 req.flags = cpu_to_le16(CMDQ_QUERY_ROCE_STATS_EXT_FLAGS_FUNCTION_ID); 820 822 821 - bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, sbuf, sizeof(req), 823 + bnxt_qplib_fill_cmdqmsg(&msg, &req, &resp, &sbuf, sizeof(req), 822 824 sizeof(resp), 0); 823 825 rc = bnxt_qplib_rcfw_send_message(rcfw, &msg); 824 826 if (rc) 825 827 goto bail; 826 828 827 - sb = sbuf->sb; 828 829 estat->tx_atomic_req = le64_to_cpu(sb->tx_atomic_req_pkts); 829 830 estat->tx_read_req = le64_to_cpu(sb->tx_read_req_pkts); 830 831 estat->tx_read_res = le64_to_cpu(sb->tx_read_res_pkts); 831 832 estat->tx_write_req = le64_to_cpu(sb->tx_write_req_pkts); 832 833 estat->tx_send_req = le64_to_cpu(sb->tx_send_req_pkts); 834 + estat->tx_roce_pkts = le64_to_cpu(sb->tx_roce_pkts); 835 + estat->tx_roce_bytes = le64_to_cpu(sb->tx_roce_bytes); 833 836 estat->rx_atomic_req = le64_to_cpu(sb->rx_atomic_req_pkts); 834 837 estat->rx_read_req = le64_to_cpu(sb->rx_read_req_pkts); 835 838 estat->rx_read_res = le64_to_cpu(sb->rx_read_res_pkts); 836 839 estat->rx_write_req = le64_to_cpu(sb->rx_write_req_pkts); 837 840 estat->rx_send_req = le64_to_cpu(sb->rx_send_req_pkts); 841 + estat->rx_roce_pkts = le64_to_cpu(sb->rx_roce_pkts); 842 + estat->rx_roce_bytes = le64_to_cpu(sb->rx_roce_bytes); 838 843 estat->rx_roce_good_pkts = le64_to_cpu(sb->rx_roce_good_pkts); 839 844 estat->rx_roce_good_bytes = le64_to_cpu(sb->rx_roce_good_bytes); 840 845 estat->rx_out_of_buffer = le64_to_cpu(sb->rx_out_of_buffer_pkts); 841 846 estat->rx_out_of_sequence = le64_to_cpu(sb->rx_out_of_sequence_pkts); 847 + estat->tx_cnp = le64_to_cpu(sb->tx_cnp_pkts); 848 + estat->rx_cnp = le64_to_cpu(sb->rx_cnp_pkts); 849 + estat->rx_ecn_marked = le64_to_cpu(sb->rx_ecn_marked_pkts); 842 850 843 851 bail: 844 - bnxt_qplib_rcfw_free_sbuf(rcfw, sbuf); 852 + dma_free_coherent(&rcfw->pdev->dev, sbuf.size, 853 + sbuf.sb, sbuf.dma_addr); 845 854 return rc; 846 855 } 847 856
+1 -1
drivers/infiniband/hw/bnxt_re/qplib_sp.h
··· 322 322 struct bnxt_qplib_gid *gid, u16 gid_idx, 323 323 const u8 *smac); 324 324 int bnxt_qplib_get_dev_attr(struct bnxt_qplib_rcfw *rcfw, 325 - struct bnxt_qplib_dev_attr *attr, bool vf); 325 + struct bnxt_qplib_dev_attr *attr); 326 326 int bnxt_qplib_set_func_resources(struct bnxt_qplib_res *res, 327 327 struct bnxt_qplib_rcfw *rcfw, 328 328 struct bnxt_qplib_ctx *ctx);
+1 -1
drivers/infiniband/hw/cxgb4/qp.c
··· 2466 2466 init_attr->cap.max_send_sge = qhp->attr.sq_max_sges; 2467 2467 init_attr->cap.max_recv_sge = qhp->attr.rq_max_sges; 2468 2468 init_attr->cap.max_inline_data = T4_MAX_SEND_INLINE; 2469 - init_attr->sq_sig_type = qhp->sq_sig_all ? IB_SIGNAL_ALL_WR : 0; 2469 + init_attr->sq_sig_type = qhp->sq_sig_all ? IB_SIGNAL_ALL_WR : IB_SIGNAL_REQ_WR; 2470 2470 return 0; 2471 2471 } 2472 2472
+13
drivers/infiniband/hw/efa/efa_admin_cmds_defs.h
··· 66 66 EFA_ADMIN_GET_STATS_TYPE_BASIC = 0, 67 67 EFA_ADMIN_GET_STATS_TYPE_MESSAGES = 1, 68 68 EFA_ADMIN_GET_STATS_TYPE_RDMA_READ = 2, 69 + EFA_ADMIN_GET_STATS_TYPE_RDMA_WRITE = 3, 69 70 }; 70 71 71 72 enum efa_admin_get_stats_scope { ··· 571 570 u64 read_resp_bytes; 572 571 }; 573 572 573 + struct efa_admin_rdma_write_stats { 574 + u64 write_wrs; 575 + 576 + u64 write_bytes; 577 + 578 + u64 write_wr_err; 579 + 580 + u64 write_recv_bytes; 581 + }; 582 + 574 583 struct efa_admin_acq_get_stats_resp { 575 584 struct efa_admin_acq_common_desc acq_common_desc; 576 585 ··· 590 579 struct efa_admin_messages_stats messages_stats; 591 580 592 581 struct efa_admin_rdma_read_stats rdma_read_stats; 582 + 583 + struct efa_admin_rdma_write_stats rdma_write_stats; 593 584 } u; 594 585 }; 595 586
+7 -1
drivers/infiniband/hw/efa/efa_com_cmd.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause 2 2 /* 3 - * Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All rights reserved. 3 + * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved. 4 4 */ 5 5 6 6 #include "efa_com.h" ··· 793 793 result->rdma_read_stats.read_bytes = resp.u.rdma_read_stats.read_bytes; 794 794 result->rdma_read_stats.read_wr_err = resp.u.rdma_read_stats.read_wr_err; 795 795 result->rdma_read_stats.read_resp_bytes = resp.u.rdma_read_stats.read_resp_bytes; 796 + break; 797 + case EFA_ADMIN_GET_STATS_TYPE_RDMA_WRITE: 798 + result->rdma_write_stats.write_wrs = resp.u.rdma_write_stats.write_wrs; 799 + result->rdma_write_stats.write_bytes = resp.u.rdma_write_stats.write_bytes; 800 + result->rdma_write_stats.write_wr_err = resp.u.rdma_write_stats.write_wr_err; 801 + result->rdma_write_stats.write_recv_bytes = resp.u.rdma_write_stats.write_recv_bytes; 796 802 break; 797 803 } 798 804
+9 -1
drivers/infiniband/hw/efa/efa_com_cmd.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause */ 2 2 /* 3 - * Copyright 2018-2021 Amazon.com, Inc. or its affiliates. All rights reserved. 3 + * Copyright 2018-2023 Amazon.com, Inc. or its affiliates. All rights reserved. 4 4 */ 5 5 6 6 #ifndef _EFA_COM_CMD_H_ ··· 262 262 u64 read_resp_bytes; 263 263 }; 264 264 265 + struct efa_com_rdma_write_stats { 266 + u64 write_wrs; 267 + u64 write_bytes; 268 + u64 write_wr_err; 269 + u64 write_recv_bytes; 270 + }; 271 + 265 272 union efa_com_get_stats_result { 266 273 struct efa_com_basic_stats basic_stats; 267 274 struct efa_com_messages_stats messages_stats; 268 275 struct efa_com_rdma_read_stats rdma_read_stats; 276 + struct efa_com_rdma_write_stats rdma_write_stats; 269 277 }; 270 278 271 279 int efa_com_create_qp(struct efa_com_dev *edev,
+21 -3
drivers/infiniband/hw/efa/efa_verbs.c
··· 61 61 op(EFA_RDMA_READ_BYTES, "rdma_read_bytes") \ 62 62 op(EFA_RDMA_READ_WR_ERR, "rdma_read_wr_err") \ 63 63 op(EFA_RDMA_READ_RESP_BYTES, "rdma_read_resp_bytes") \ 64 + op(EFA_RDMA_WRITE_WRS, "rdma_write_wrs") \ 65 + op(EFA_RDMA_WRITE_BYTES, "rdma_write_bytes") \ 66 + op(EFA_RDMA_WRITE_WR_ERR, "rdma_write_wr_err") \ 67 + op(EFA_RDMA_WRITE_RECV_BYTES, "rdma_write_recv_bytes") \ 64 68 65 69 #define EFA_STATS_ENUM(ename, name) ename, 66 70 #define EFA_STATS_STR(ename, nam) \ ··· 453 449 454 450 ibdev_dbg(&dev->ibdev, "Destroy qp[%u]\n", ibqp->qp_num); 455 451 456 - efa_qp_user_mmap_entries_remove(qp); 457 - 458 452 err = efa_destroy_qp_handle(dev, qp->qp_handle); 459 453 if (err) 460 454 return err; 455 + 456 + efa_qp_user_mmap_entries_remove(qp); 461 457 462 458 if (qp->rq_cpu_addr) { 463 459 ibdev_dbg(&dev->ibdev, ··· 1017 1013 "Destroy cq[%d] virt[0x%p] freed: size[%lu], dma[%pad]\n", 1018 1014 cq->cq_idx, cq->cpu_addr, cq->size, &cq->dma_addr); 1019 1015 1020 - efa_cq_user_mmap_entries_remove(cq); 1021 1016 efa_destroy_cq_idx(dev, cq->cq_idx); 1017 + efa_cq_user_mmap_entries_remove(cq); 1022 1018 if (cq->eq) { 1023 1019 xa_erase(&dev->cqs_xa, cq->cq_idx); 1024 1020 synchronize_irq(cq->eq->irq.irqn); ··· 2084 2080 { 2085 2081 struct efa_com_get_stats_params params = {}; 2086 2082 union efa_com_get_stats_result result; 2083 + struct efa_com_rdma_write_stats *rws; 2087 2084 struct efa_com_rdma_read_stats *rrs; 2088 2085 struct efa_com_messages_stats *ms; 2089 2086 struct efa_com_basic_stats *bs; ··· 2125 2120 stats->value[EFA_RDMA_READ_BYTES] = rrs->read_bytes; 2126 2121 stats->value[EFA_RDMA_READ_WR_ERR] = rrs->read_wr_err; 2127 2122 stats->value[EFA_RDMA_READ_RESP_BYTES] = rrs->read_resp_bytes; 2123 + 2124 + if (EFA_DEV_CAP(dev, RDMA_WRITE)) { 2125 + params.type = EFA_ADMIN_GET_STATS_TYPE_RDMA_WRITE; 2126 + err = efa_com_get_stats(&dev->edev, &params, &result); 2127 + if (err) 2128 + return err; 2129 + 2130 + rws = &result.rdma_write_stats; 2131 + stats->value[EFA_RDMA_WRITE_WRS] = rws->write_wrs; 2132 + stats->value[EFA_RDMA_WRITE_BYTES] = rws->write_bytes; 2133 + stats->value[EFA_RDMA_WRITE_WR_ERR] = rws->write_wr_err; 2134 + stats->value[EFA_RDMA_WRITE_RECV_BYTES] = rws->write_recv_bytes; 2135 + } 2128 2136 2129 2137 return ARRAY_SIZE(efa_port_stats_descs); 2130 2138 }
+14 -4
drivers/infiniband/hw/erdma/erdma_hw.h
··· 228 228 229 229 /* create_cq cfg1 */ 230 230 #define ERDMA_CMD_CREATE_CQ_MTT_CNT_MASK GENMASK(31, 16) 231 - #define ERDMA_CMD_CREATE_CQ_MTT_TYPE_MASK BIT(15) 231 + #define ERDMA_CMD_CREATE_CQ_MTT_LEVEL_MASK BIT(15) 232 232 #define ERDMA_CMD_CREATE_CQ_MTT_DB_CFG_MASK BIT(11) 233 233 #define ERDMA_CMD_CREATE_CQ_EQN_MASK GENMASK(9, 0) 234 234 ··· 248 248 249 249 /* regmr/deregmr cfg0 */ 250 250 #define ERDMA_CMD_MR_VALID_MASK BIT(31) 251 + #define ERDMA_CMD_MR_VERSION_MASK GENMASK(30, 28) 251 252 #define ERDMA_CMD_MR_KEY_MASK GENMASK(27, 20) 252 253 #define ERDMA_CMD_MR_MPT_IDX_MASK GENMASK(19, 0) 253 254 ··· 259 258 260 259 /* regmr cfg2 */ 261 260 #define ERDMA_CMD_REGMR_PAGESIZE_MASK GENMASK(31, 27) 262 - #define ERDMA_CMD_REGMR_MTT_TYPE_MASK GENMASK(21, 20) 261 + #define ERDMA_CMD_REGMR_MTT_PAGESIZE_MASK GENMASK(26, 24) 262 + #define ERDMA_CMD_REGMR_MTT_LEVEL_MASK GENMASK(21, 20) 263 263 #define ERDMA_CMD_REGMR_MTT_CNT_MASK GENMASK(19, 0) 264 264 265 265 struct erdma_cmdq_reg_mr_req { ··· 270 268 u64 start_va; 271 269 u32 size; 272 270 u32 cfg2; 273 - u64 phy_addr[4]; 271 + union { 272 + u64 phy_addr[4]; 273 + struct { 274 + u64 rsvd; 275 + u32 size_h; 276 + u32 mtt_cnt_h; 277 + }; 278 + }; 274 279 }; 275 280 276 281 struct erdma_cmdq_dereg_mr_req { ··· 318 309 /* create qp mtt_cfg */ 319 310 #define ERDMA_CMD_CREATE_QP_PAGE_OFFSET_MASK GENMASK(31, 12) 320 311 #define ERDMA_CMD_CREATE_QP_MTT_CNT_MASK GENMASK(11, 1) 321 - #define ERDMA_CMD_CREATE_QP_MTT_TYPE_MASK BIT(0) 312 + #define ERDMA_CMD_CREATE_QP_MTT_LEVEL_MASK BIT(0) 322 313 323 314 /* create qp db cfg */ 324 315 #define ERDMA_CMD_CREATE_QP_SQDB_CFG_MASK GENMASK(31, 16) ··· 373 364 374 365 enum { 375 366 ERDMA_DEV_CAP_FLAGS_ATOMIC = 1 << 7, 367 + ERDMA_DEV_CAP_FLAGS_MTT_VA = 1 << 5, 376 368 ERDMA_DEV_CAP_FLAGS_EXTEND_DB = 1 << 3, 377 369 }; 378 370
+1 -1
drivers/infiniband/hw/erdma/erdma_qp.c
··· 410 410 /* Copy SGLs to SQE content to accelerate */ 411 411 memcpy(get_queue_entry(qp->kern_qp.sq_buf, idx + 1, 412 412 qp->attrs.sq_size, SQEBB_SHIFT), 413 - mr->mem.mtt_buf, MTT_SIZE(mr->mem.mtt_nents)); 413 + mr->mem.mtt->buf, MTT_SIZE(mr->mem.mtt_nents)); 414 414 wqe_size = sizeof(struct erdma_reg_mr_sqe) + 415 415 MTT_SIZE(mr->mem.mtt_nents); 416 416 } else {
+318 -116
drivers/infiniband/hw/erdma/erdma_verbs.c
··· 19 19 #include "erdma_cm.h" 20 20 #include "erdma_verbs.h" 21 21 22 + static void assemble_qbuf_mtt_for_cmd(struct erdma_mem *mem, u32 *cfg, 23 + u64 *addr0, u64 *addr1) 24 + { 25 + struct erdma_mtt *mtt = mem->mtt; 26 + 27 + if (mem->mtt_nents > ERDMA_MAX_INLINE_MTT_ENTRIES) { 28 + *addr0 = mtt->buf_dma; 29 + *cfg |= FIELD_PREP(ERDMA_CMD_CREATE_QP_MTT_LEVEL_MASK, 30 + ERDMA_MR_MTT_1LEVEL); 31 + } else { 32 + *addr0 = mtt->buf[0]; 33 + memcpy(addr1, mtt->buf + 1, MTT_SIZE(mem->mtt_nents - 1)); 34 + *cfg |= FIELD_PREP(ERDMA_CMD_CREATE_QP_MTT_LEVEL_MASK, 35 + ERDMA_MR_MTT_0LEVEL); 36 + } 37 + } 38 + 22 39 static int create_qp_cmd(struct erdma_ucontext *uctx, struct erdma_qp *qp) 23 40 { 24 41 struct erdma_dev *dev = to_edev(qp->ibqp.device); ··· 70 53 req.sq_mtt_cfg = 71 54 FIELD_PREP(ERDMA_CMD_CREATE_QP_PAGE_OFFSET_MASK, 0) | 72 55 FIELD_PREP(ERDMA_CMD_CREATE_QP_MTT_CNT_MASK, 1) | 73 - FIELD_PREP(ERDMA_CMD_CREATE_QP_MTT_TYPE_MASK, 74 - ERDMA_MR_INLINE_MTT); 56 + FIELD_PREP(ERDMA_CMD_CREATE_QP_MTT_LEVEL_MASK, 57 + ERDMA_MR_MTT_0LEVEL); 75 58 req.rq_mtt_cfg = req.sq_mtt_cfg; 76 59 77 60 req.rq_buf_addr = qp->kern_qp.rq_buf_dma_addr; ··· 84 67 user_qp = &qp->user_qp; 85 68 req.sq_cqn_mtt_cfg = FIELD_PREP( 86 69 ERDMA_CMD_CREATE_QP_PAGE_SIZE_MASK, 87 - ilog2(user_qp->sq_mtt.page_size) - ERDMA_HW_PAGE_SHIFT); 70 + ilog2(user_qp->sq_mem.page_size) - ERDMA_HW_PAGE_SHIFT); 88 71 req.sq_cqn_mtt_cfg |= 89 72 FIELD_PREP(ERDMA_CMD_CREATE_QP_CQN_MASK, qp->scq->cqn); 90 73 91 74 req.rq_cqn_mtt_cfg = FIELD_PREP( 92 75 ERDMA_CMD_CREATE_QP_PAGE_SIZE_MASK, 93 - ilog2(user_qp->rq_mtt.page_size) - ERDMA_HW_PAGE_SHIFT); 76 + ilog2(user_qp->rq_mem.page_size) - ERDMA_HW_PAGE_SHIFT); 94 77 req.rq_cqn_mtt_cfg |= 95 78 FIELD_PREP(ERDMA_CMD_CREATE_QP_CQN_MASK, qp->rcq->cqn); 96 79 97 - req.sq_mtt_cfg = user_qp->sq_mtt.page_offset; 80 + req.sq_mtt_cfg = user_qp->sq_mem.page_offset; 98 81 req.sq_mtt_cfg |= FIELD_PREP(ERDMA_CMD_CREATE_QP_MTT_CNT_MASK, 99 - user_qp->sq_mtt.mtt_nents) | 100 - FIELD_PREP(ERDMA_CMD_CREATE_QP_MTT_TYPE_MASK, 101 - user_qp->sq_mtt.mtt_type); 82 + user_qp->sq_mem.mtt_nents); 102 83 103 - req.rq_mtt_cfg = user_qp->rq_mtt.page_offset; 84 + req.rq_mtt_cfg = user_qp->rq_mem.page_offset; 104 85 req.rq_mtt_cfg |= FIELD_PREP(ERDMA_CMD_CREATE_QP_MTT_CNT_MASK, 105 - user_qp->rq_mtt.mtt_nents) | 106 - FIELD_PREP(ERDMA_CMD_CREATE_QP_MTT_TYPE_MASK, 107 - user_qp->rq_mtt.mtt_type); 86 + user_qp->rq_mem.mtt_nents); 108 87 109 - req.sq_buf_addr = user_qp->sq_mtt.mtt_entry[0]; 110 - req.rq_buf_addr = user_qp->rq_mtt.mtt_entry[0]; 88 + assemble_qbuf_mtt_for_cmd(&user_qp->sq_mem, &req.sq_mtt_cfg, 89 + &req.sq_buf_addr, req.sq_mtt_entry); 90 + assemble_qbuf_mtt_for_cmd(&user_qp->rq_mem, &req.rq_mtt_cfg, 91 + &req.rq_buf_addr, req.rq_mtt_entry); 111 92 112 93 req.sq_db_info_dma_addr = user_qp->sq_db_info_dma_addr; 113 94 req.rq_db_info_dma_addr = user_qp->rq_db_info_dma_addr; ··· 132 117 133 118 static int regmr_cmd(struct erdma_dev *dev, struct erdma_mr *mr) 134 119 { 135 - struct erdma_cmdq_reg_mr_req req; 136 120 struct erdma_pd *pd = to_epd(mr->ibmr.pd); 137 - u64 *phy_addr; 138 - int i; 121 + struct erdma_cmdq_reg_mr_req req; 122 + u32 mtt_level; 139 123 140 124 erdma_cmdq_build_reqhdr(&req.hdr, CMDQ_SUBMOD_RDMA, CMDQ_OPCODE_REG_MR); 125 + 126 + if (mr->type == ERDMA_MR_TYPE_FRMR || 127 + mr->mem.page_cnt > ERDMA_MAX_INLINE_MTT_ENTRIES) { 128 + if (mr->mem.mtt->continuous) { 129 + req.phy_addr[0] = mr->mem.mtt->buf_dma; 130 + mtt_level = ERDMA_MR_MTT_1LEVEL; 131 + } else { 132 + req.phy_addr[0] = sg_dma_address(mr->mem.mtt->sglist); 133 + mtt_level = mr->mem.mtt->level; 134 + } 135 + } else { 136 + memcpy(req.phy_addr, mr->mem.mtt->buf, 137 + MTT_SIZE(mr->mem.page_cnt)); 138 + mtt_level = ERDMA_MR_MTT_0LEVEL; 139 + } 141 140 142 141 req.cfg0 = FIELD_PREP(ERDMA_CMD_MR_VALID_MASK, mr->valid) | 143 142 FIELD_PREP(ERDMA_CMD_MR_KEY_MASK, mr->ibmr.lkey & 0xFF) | ··· 161 132 FIELD_PREP(ERDMA_CMD_REGMR_RIGHT_MASK, mr->access); 162 133 req.cfg2 = FIELD_PREP(ERDMA_CMD_REGMR_PAGESIZE_MASK, 163 134 ilog2(mr->mem.page_size)) | 164 - FIELD_PREP(ERDMA_CMD_REGMR_MTT_TYPE_MASK, mr->mem.mtt_type) | 135 + FIELD_PREP(ERDMA_CMD_REGMR_MTT_LEVEL_MASK, mtt_level) | 165 136 FIELD_PREP(ERDMA_CMD_REGMR_MTT_CNT_MASK, mr->mem.page_cnt); 166 137 167 138 if (mr->type == ERDMA_MR_TYPE_DMA) ··· 172 143 req.size = mr->mem.len; 173 144 } 174 145 175 - if (mr->type == ERDMA_MR_TYPE_FRMR || 176 - mr->mem.mtt_type == ERDMA_MR_INDIRECT_MTT) { 177 - phy_addr = req.phy_addr; 178 - *phy_addr = mr->mem.mtt_entry[0]; 179 - } else { 180 - phy_addr = req.phy_addr; 181 - for (i = 0; i < mr->mem.mtt_nents; i++) 182 - *phy_addr++ = mr->mem.mtt_entry[i]; 146 + if (!mr->mem.mtt->continuous && mr->mem.mtt->level > 1) { 147 + req.cfg0 |= FIELD_PREP(ERDMA_CMD_MR_VERSION_MASK, 1); 148 + req.cfg2 |= FIELD_PREP(ERDMA_CMD_REGMR_MTT_PAGESIZE_MASK, 149 + PAGE_SHIFT - ERDMA_HW_PAGE_SHIFT); 150 + req.size_h = upper_32_bits(mr->mem.len); 151 + req.mtt_cnt_h = mr->mem.page_cnt >> 20; 183 152 } 184 153 185 154 post_cmd: ··· 188 161 { 189 162 struct erdma_dev *dev = to_edev(cq->ibcq.device); 190 163 struct erdma_cmdq_create_cq_req req; 191 - struct erdma_mem *mtt; 164 + struct erdma_mem *mem; 192 165 u32 page_size; 193 166 194 167 erdma_cmdq_build_reqhdr(&req.hdr, CMDQ_SUBMOD_RDMA, ··· 206 179 req.qbuf_addr_h = upper_32_bits(cq->kern_cq.qbuf_dma_addr); 207 180 208 181 req.cfg1 |= FIELD_PREP(ERDMA_CMD_CREATE_CQ_MTT_CNT_MASK, 1) | 209 - FIELD_PREP(ERDMA_CMD_CREATE_CQ_MTT_TYPE_MASK, 210 - ERDMA_MR_INLINE_MTT); 182 + FIELD_PREP(ERDMA_CMD_CREATE_CQ_MTT_LEVEL_MASK, 183 + ERDMA_MR_MTT_0LEVEL); 211 184 212 185 req.first_page_offset = 0; 213 186 req.cq_db_info_addr = 214 187 cq->kern_cq.qbuf_dma_addr + (cq->depth << CQE_SHIFT); 215 188 } else { 216 - mtt = &cq->user_cq.qbuf_mtt; 189 + mem = &cq->user_cq.qbuf_mem; 217 190 req.cfg0 |= 218 191 FIELD_PREP(ERDMA_CMD_CREATE_CQ_PAGESIZE_MASK, 219 - ilog2(mtt->page_size) - ERDMA_HW_PAGE_SHIFT); 220 - if (mtt->mtt_nents == 1) { 221 - req.qbuf_addr_l = lower_32_bits(*(u64 *)mtt->mtt_buf); 222 - req.qbuf_addr_h = upper_32_bits(*(u64 *)mtt->mtt_buf); 192 + ilog2(mem->page_size) - ERDMA_HW_PAGE_SHIFT); 193 + if (mem->mtt_nents == 1) { 194 + req.qbuf_addr_l = lower_32_bits(mem->mtt->buf[0]); 195 + req.qbuf_addr_h = upper_32_bits(mem->mtt->buf[0]); 196 + req.cfg1 |= 197 + FIELD_PREP(ERDMA_CMD_CREATE_CQ_MTT_LEVEL_MASK, 198 + ERDMA_MR_MTT_0LEVEL); 223 199 } else { 224 - req.qbuf_addr_l = lower_32_bits(mtt->mtt_entry[0]); 225 - req.qbuf_addr_h = upper_32_bits(mtt->mtt_entry[0]); 200 + req.qbuf_addr_l = lower_32_bits(mem->mtt->buf_dma); 201 + req.qbuf_addr_h = upper_32_bits(mem->mtt->buf_dma); 202 + req.cfg1 |= 203 + FIELD_PREP(ERDMA_CMD_CREATE_CQ_MTT_LEVEL_MASK, 204 + ERDMA_MR_MTT_1LEVEL); 226 205 } 227 206 req.cfg1 |= FIELD_PREP(ERDMA_CMD_CREATE_CQ_MTT_CNT_MASK, 228 - mtt->mtt_nents); 229 - req.cfg1 |= FIELD_PREP(ERDMA_CMD_CREATE_CQ_MTT_TYPE_MASK, 230 - mtt->mtt_type); 207 + mem->mtt_nents); 231 208 232 - req.first_page_offset = mtt->page_offset; 209 + req.first_page_offset = mem->page_offset; 233 210 req.cq_db_info_addr = cq->user_cq.db_info_dma_addr; 234 211 235 212 if (uctx->ext_db.enable) { ··· 512 481 dev->func_bar + (ERDMA_SDB_SHARED_PAGE_INDEX << PAGE_SHIFT); 513 482 kqp->hw_rq_db = dev->func_bar + ERDMA_BAR_RQDB_SPACE_OFFSET; 514 483 515 - kqp->swr_tbl = vmalloc(qp->attrs.sq_size * sizeof(u64)); 516 - kqp->rwr_tbl = vmalloc(qp->attrs.rq_size * sizeof(u64)); 484 + kqp->swr_tbl = vmalloc_array(qp->attrs.sq_size, sizeof(u64)); 485 + kqp->rwr_tbl = vmalloc_array(qp->attrs.rq_size, sizeof(u64)); 517 486 if (!kqp->swr_tbl || !kqp->rwr_tbl) 518 487 goto err_out; 519 488 ··· 539 508 return -ENOMEM; 540 509 } 541 510 511 + static void erdma_fill_bottom_mtt(struct erdma_dev *dev, struct erdma_mem *mem) 512 + { 513 + struct erdma_mtt *mtt = mem->mtt; 514 + struct ib_block_iter biter; 515 + u32 idx = 0; 516 + 517 + while (mtt->low_level) 518 + mtt = mtt->low_level; 519 + 520 + rdma_umem_for_each_dma_block(mem->umem, &biter, mem->page_size) 521 + mtt->buf[idx++] = rdma_block_iter_dma_address(&biter); 522 + } 523 + 524 + static struct erdma_mtt *erdma_create_cont_mtt(struct erdma_dev *dev, 525 + size_t size) 526 + { 527 + struct erdma_mtt *mtt; 528 + 529 + mtt = kzalloc(sizeof(*mtt), GFP_KERNEL); 530 + if (!mtt) 531 + return ERR_PTR(-ENOMEM); 532 + 533 + mtt->size = size; 534 + mtt->buf = kzalloc(mtt->size, GFP_KERNEL); 535 + if (!mtt->buf) 536 + goto err_free_mtt; 537 + 538 + mtt->continuous = true; 539 + mtt->buf_dma = dma_map_single(&dev->pdev->dev, mtt->buf, mtt->size, 540 + DMA_TO_DEVICE); 541 + if (dma_mapping_error(&dev->pdev->dev, mtt->buf_dma)) 542 + goto err_free_mtt_buf; 543 + 544 + return mtt; 545 + 546 + err_free_mtt_buf: 547 + kfree(mtt->buf); 548 + 549 + err_free_mtt: 550 + kfree(mtt); 551 + 552 + return ERR_PTR(-ENOMEM); 553 + } 554 + 555 + static void erdma_destroy_mtt_buf_sg(struct erdma_dev *dev, 556 + struct erdma_mtt *mtt) 557 + { 558 + dma_unmap_sg(&dev->pdev->dev, mtt->sglist, mtt->nsg, DMA_TO_DEVICE); 559 + vfree(mtt->sglist); 560 + } 561 + 562 + static void erdma_destroy_scatter_mtt(struct erdma_dev *dev, 563 + struct erdma_mtt *mtt) 564 + { 565 + erdma_destroy_mtt_buf_sg(dev, mtt); 566 + vfree(mtt->buf); 567 + kfree(mtt); 568 + } 569 + 570 + static void erdma_init_middle_mtt(struct erdma_mtt *mtt, 571 + struct erdma_mtt *low_mtt) 572 + { 573 + struct scatterlist *sg; 574 + u32 idx = 0, i; 575 + 576 + for_each_sg(low_mtt->sglist, sg, low_mtt->nsg, i) 577 + mtt->buf[idx++] = sg_dma_address(sg); 578 + } 579 + 580 + static int erdma_create_mtt_buf_sg(struct erdma_dev *dev, struct erdma_mtt *mtt) 581 + { 582 + struct scatterlist *sglist; 583 + void *buf = mtt->buf; 584 + u32 npages, i, nsg; 585 + struct page *pg; 586 + 587 + /* Failed if buf is not page aligned */ 588 + if ((uintptr_t)buf & ~PAGE_MASK) 589 + return -EINVAL; 590 + 591 + npages = DIV_ROUND_UP(mtt->size, PAGE_SIZE); 592 + sglist = vzalloc(npages * sizeof(*sglist)); 593 + if (!sglist) 594 + return -ENOMEM; 595 + 596 + sg_init_table(sglist, npages); 597 + for (i = 0; i < npages; i++) { 598 + pg = vmalloc_to_page(buf); 599 + if (!pg) 600 + goto err; 601 + sg_set_page(&sglist[i], pg, PAGE_SIZE, 0); 602 + buf += PAGE_SIZE; 603 + } 604 + 605 + nsg = dma_map_sg(&dev->pdev->dev, sglist, npages, DMA_TO_DEVICE); 606 + if (!nsg) 607 + goto err; 608 + 609 + mtt->sglist = sglist; 610 + mtt->nsg = nsg; 611 + 612 + return 0; 613 + err: 614 + vfree(sglist); 615 + 616 + return -ENOMEM; 617 + } 618 + 619 + static struct erdma_mtt *erdma_create_scatter_mtt(struct erdma_dev *dev, 620 + size_t size) 621 + { 622 + struct erdma_mtt *mtt; 623 + int ret = -ENOMEM; 624 + 625 + mtt = kzalloc(sizeof(*mtt), GFP_KERNEL); 626 + if (!mtt) 627 + return NULL; 628 + 629 + mtt->size = ALIGN(size, PAGE_SIZE); 630 + mtt->buf = vzalloc(mtt->size); 631 + mtt->continuous = false; 632 + if (!mtt->buf) 633 + goto err_free_mtt; 634 + 635 + ret = erdma_create_mtt_buf_sg(dev, mtt); 636 + if (ret) 637 + goto err_free_mtt_buf; 638 + 639 + ibdev_dbg(&dev->ibdev, "create scatter mtt, size:%lu, nsg:%u\n", 640 + mtt->size, mtt->nsg); 641 + 642 + return mtt; 643 + 644 + err_free_mtt_buf: 645 + vfree(mtt->buf); 646 + 647 + err_free_mtt: 648 + kfree(mtt); 649 + 650 + return ERR_PTR(ret); 651 + } 652 + 653 + static struct erdma_mtt *erdma_create_mtt(struct erdma_dev *dev, size_t size, 654 + bool force_continuous) 655 + { 656 + struct erdma_mtt *mtt, *tmp_mtt; 657 + int ret, level = 0; 658 + 659 + ibdev_dbg(&dev->ibdev, "create_mtt, size:%lu, force cont:%d\n", size, 660 + force_continuous); 661 + 662 + if (!(dev->attrs.cap_flags & ERDMA_DEV_CAP_FLAGS_MTT_VA)) 663 + force_continuous = true; 664 + 665 + if (force_continuous) 666 + return erdma_create_cont_mtt(dev, size); 667 + 668 + mtt = erdma_create_scatter_mtt(dev, size); 669 + if (IS_ERR(mtt)) 670 + return mtt; 671 + level = 1; 672 + 673 + /* convergence the mtt table. */ 674 + while (mtt->nsg != 1 && level <= 3) { 675 + tmp_mtt = erdma_create_scatter_mtt(dev, MTT_SIZE(mtt->nsg)); 676 + if (IS_ERR(tmp_mtt)) { 677 + ret = PTR_ERR(tmp_mtt); 678 + goto err_free_mtt; 679 + } 680 + erdma_init_middle_mtt(tmp_mtt, mtt); 681 + tmp_mtt->low_level = mtt; 682 + mtt = tmp_mtt; 683 + level++; 684 + } 685 + 686 + if (level > 3) { 687 + ret = -ENOMEM; 688 + goto err_free_mtt; 689 + } 690 + 691 + mtt->level = level; 692 + ibdev_dbg(&dev->ibdev, "top mtt: level:%d, dma_addr 0x%llx\n", 693 + mtt->level, mtt->sglist[0].dma_address); 694 + 695 + return mtt; 696 + err_free_mtt: 697 + while (mtt) { 698 + tmp_mtt = mtt->low_level; 699 + erdma_destroy_scatter_mtt(dev, mtt); 700 + mtt = tmp_mtt; 701 + } 702 + 703 + return ERR_PTR(ret); 704 + } 705 + 706 + static void erdma_destroy_mtt(struct erdma_dev *dev, struct erdma_mtt *mtt) 707 + { 708 + struct erdma_mtt *tmp_mtt; 709 + 710 + if (mtt->continuous) { 711 + dma_unmap_single(&dev->pdev->dev, mtt->buf_dma, mtt->size, 712 + DMA_TO_DEVICE); 713 + kfree(mtt->buf); 714 + kfree(mtt); 715 + } else { 716 + while (mtt) { 717 + tmp_mtt = mtt->low_level; 718 + erdma_destroy_scatter_mtt(dev, mtt); 719 + mtt = tmp_mtt; 720 + } 721 + } 722 + } 723 + 542 724 static int get_mtt_entries(struct erdma_dev *dev, struct erdma_mem *mem, 543 725 u64 start, u64 len, int access, u64 virt, 544 - unsigned long req_page_size, u8 force_indirect_mtt) 726 + unsigned long req_page_size, bool force_continuous) 545 727 { 546 - struct ib_block_iter biter; 547 - uint64_t *phy_addr = NULL; 548 728 int ret = 0; 549 729 550 730 mem->umem = ib_umem_get(&dev->ibdev, start, len, access); ··· 771 529 mem->page_offset = start & (mem->page_size - 1); 772 530 mem->mtt_nents = ib_umem_num_dma_blocks(mem->umem, mem->page_size); 773 531 mem->page_cnt = mem->mtt_nents; 774 - 775 - if (mem->page_cnt > ERDMA_MAX_INLINE_MTT_ENTRIES || 776 - force_indirect_mtt) { 777 - mem->mtt_type = ERDMA_MR_INDIRECT_MTT; 778 - mem->mtt_buf = 779 - alloc_pages_exact(MTT_SIZE(mem->page_cnt), GFP_KERNEL); 780 - if (!mem->mtt_buf) { 781 - ret = -ENOMEM; 782 - goto error_ret; 783 - } 784 - phy_addr = mem->mtt_buf; 785 - } else { 786 - mem->mtt_type = ERDMA_MR_INLINE_MTT; 787 - phy_addr = mem->mtt_entry; 532 + mem->mtt = erdma_create_mtt(dev, MTT_SIZE(mem->page_cnt), 533 + force_continuous); 534 + if (IS_ERR(mem->mtt)) { 535 + ret = PTR_ERR(mem->mtt); 536 + goto error_ret; 788 537 } 789 538 790 - rdma_umem_for_each_dma_block(mem->umem, &biter, mem->page_size) { 791 - *phy_addr = rdma_block_iter_dma_address(&biter); 792 - phy_addr++; 793 - } 794 - 795 - if (mem->mtt_type == ERDMA_MR_INDIRECT_MTT) { 796 - mem->mtt_entry[0] = 797 - dma_map_single(&dev->pdev->dev, mem->mtt_buf, 798 - MTT_SIZE(mem->page_cnt), DMA_TO_DEVICE); 799 - if (dma_mapping_error(&dev->pdev->dev, mem->mtt_entry[0])) { 800 - free_pages_exact(mem->mtt_buf, MTT_SIZE(mem->page_cnt)); 801 - mem->mtt_buf = NULL; 802 - ret = -ENOMEM; 803 - goto error_ret; 804 - } 805 - } 539 + erdma_fill_bottom_mtt(dev, mem); 806 540 807 541 return 0; 808 542 ··· 793 575 794 576 static void put_mtt_entries(struct erdma_dev *dev, struct erdma_mem *mem) 795 577 { 796 - if (mem->mtt_buf) { 797 - dma_unmap_single(&dev->pdev->dev, mem->mtt_entry[0], 798 - MTT_SIZE(mem->page_cnt), DMA_TO_DEVICE); 799 - free_pages_exact(mem->mtt_buf, MTT_SIZE(mem->page_cnt)); 800 - } 578 + if (mem->mtt) 579 + erdma_destroy_mtt(dev, mem->mtt); 801 580 802 581 if (mem->umem) { 803 582 ib_umem_release(mem->umem); ··· 875 660 qp->attrs.rq_size * RQE_SIZE)) 876 661 return -EINVAL; 877 662 878 - ret = get_mtt_entries(qp->dev, &qp->user_qp.sq_mtt, va, 663 + ret = get_mtt_entries(qp->dev, &qp->user_qp.sq_mem, va, 879 664 qp->attrs.sq_size << SQEBB_SHIFT, 0, va, 880 - (SZ_1M - SZ_4K), 1); 665 + (SZ_1M - SZ_4K), true); 881 666 if (ret) 882 667 return ret; 883 668 884 669 rq_offset = ALIGN(qp->attrs.sq_size << SQEBB_SHIFT, ERDMA_HW_PAGE_SIZE); 885 670 qp->user_qp.rq_offset = rq_offset; 886 671 887 - ret = get_mtt_entries(qp->dev, &qp->user_qp.rq_mtt, va + rq_offset, 672 + ret = get_mtt_entries(qp->dev, &qp->user_qp.rq_mem, va + rq_offset, 888 673 qp->attrs.rq_size << RQE_SHIFT, 0, va + rq_offset, 889 - (SZ_1M - SZ_4K), 1); 674 + (SZ_1M - SZ_4K), true); 890 675 if (ret) 891 676 goto put_sq_mtt; 892 677 ··· 902 687 return 0; 903 688 904 689 put_rq_mtt: 905 - put_mtt_entries(qp->dev, &qp->user_qp.rq_mtt); 690 + put_mtt_entries(qp->dev, &qp->user_qp.rq_mem); 906 691 907 692 put_sq_mtt: 908 - put_mtt_entries(qp->dev, &qp->user_qp.sq_mtt); 693 + put_mtt_entries(qp->dev, &qp->user_qp.sq_mem); 909 694 910 695 return ret; 911 696 } 912 697 913 698 static void free_user_qp(struct erdma_qp *qp, struct erdma_ucontext *uctx) 914 699 { 915 - put_mtt_entries(qp->dev, &qp->user_qp.sq_mtt); 916 - put_mtt_entries(qp->dev, &qp->user_qp.rq_mtt); 700 + put_mtt_entries(qp->dev, &qp->user_qp.sq_mem); 701 + put_mtt_entries(qp->dev, &qp->user_qp.rq_mem); 917 702 erdma_unmap_user_dbrecords(uctx, &qp->user_qp.user_dbr_page); 918 703 } 919 704 ··· 1090 875 1091 876 mr->mem.page_size = PAGE_SIZE; /* update it later. */ 1092 877 mr->mem.page_cnt = max_num_sg; 1093 - mr->mem.mtt_type = ERDMA_MR_INDIRECT_MTT; 1094 - mr->mem.mtt_buf = 1095 - alloc_pages_exact(MTT_SIZE(mr->mem.page_cnt), GFP_KERNEL); 1096 - if (!mr->mem.mtt_buf) { 1097 - ret = -ENOMEM; 878 + mr->mem.mtt = erdma_create_mtt(dev, MTT_SIZE(max_num_sg), true); 879 + if (IS_ERR(mr->mem.mtt)) { 880 + ret = PTR_ERR(mr->mem.mtt); 1098 881 goto out_remove_stag; 1099 - } 1100 - 1101 - mr->mem.mtt_entry[0] = 1102 - dma_map_single(&dev->pdev->dev, mr->mem.mtt_buf, 1103 - MTT_SIZE(mr->mem.page_cnt), DMA_TO_DEVICE); 1104 - if (dma_mapping_error(&dev->pdev->dev, mr->mem.mtt_entry[0])) { 1105 - ret = -ENOMEM; 1106 - goto out_free_mtt; 1107 882 } 1108 883 1109 884 ret = regmr_cmd(dev, mr); 1110 885 if (ret) 1111 - goto out_dma_unmap; 886 + goto out_destroy_mtt; 1112 887 1113 888 return &mr->ibmr; 1114 889 1115 - out_dma_unmap: 1116 - dma_unmap_single(&dev->pdev->dev, mr->mem.mtt_entry[0], 1117 - MTT_SIZE(mr->mem.page_cnt), DMA_TO_DEVICE); 1118 - out_free_mtt: 1119 - free_pages_exact(mr->mem.mtt_buf, MTT_SIZE(mr->mem.page_cnt)); 890 + out_destroy_mtt: 891 + erdma_destroy_mtt(dev, mr->mem.mtt); 1120 892 1121 893 out_remove_stag: 1122 894 erdma_free_idx(&dev->res_cb[ERDMA_RES_TYPE_STAG_IDX], ··· 1122 920 if (mr->mem.mtt_nents >= mr->mem.page_cnt) 1123 921 return -1; 1124 922 1125 - *((u64 *)mr->mem.mtt_buf + mr->mem.mtt_nents) = addr; 923 + mr->mem.mtt->buf[mr->mem.mtt_nents] = addr; 1126 924 mr->mem.mtt_nents++; 1127 925 1128 926 return 0; ··· 1158 956 return ERR_PTR(-ENOMEM); 1159 957 1160 958 ret = get_mtt_entries(dev, &mr->mem, start, len, access, virt, 1161 - SZ_2G - SZ_4K, 0); 959 + SZ_2G - SZ_4K, false); 1162 960 if (ret) 1163 961 goto err_out_free; 1164 962 ··· 1243 1041 cq->kern_cq.qbuf, cq->kern_cq.qbuf_dma_addr); 1244 1042 } else { 1245 1043 erdma_unmap_user_dbrecords(ctx, &cq->user_cq.user_dbr_page); 1246 - put_mtt_entries(dev, &cq->user_cq.qbuf_mtt); 1044 + put_mtt_entries(dev, &cq->user_cq.qbuf_mem); 1247 1045 } 1248 1046 1249 1047 xa_erase(&dev->cq_xa, cq->cqn); ··· 1291 1089 WARPPED_BUFSIZE(qp->attrs.sq_size << SQEBB_SHIFT), 1292 1090 qp->kern_qp.sq_buf, qp->kern_qp.sq_buf_dma_addr); 1293 1091 } else { 1294 - put_mtt_entries(dev, &qp->user_qp.sq_mtt); 1295 - put_mtt_entries(dev, &qp->user_qp.rq_mtt); 1092 + put_mtt_entries(dev, &qp->user_qp.sq_mem); 1093 + put_mtt_entries(dev, &qp->user_qp.rq_mem); 1296 1094 erdma_unmap_user_dbrecords(ctx, &qp->user_qp.user_dbr_page); 1297 1095 } 1298 1096 ··· 1581 1379 int ret; 1582 1380 struct erdma_dev *dev = to_edev(cq->ibcq.device); 1583 1381 1584 - ret = get_mtt_entries(dev, &cq->user_cq.qbuf_mtt, ureq->qbuf_va, 1382 + ret = get_mtt_entries(dev, &cq->user_cq.qbuf_mem, ureq->qbuf_va, 1585 1383 ureq->qbuf_len, 0, ureq->qbuf_va, SZ_64M - SZ_4K, 1586 - 1); 1384 + true); 1587 1385 if (ret) 1588 1386 return ret; 1589 1387 ··· 1591 1389 &cq->user_cq.user_dbr_page, 1592 1390 &cq->user_cq.db_info_dma_addr); 1593 1391 if (ret) 1594 - put_mtt_entries(dev, &cq->user_cq.qbuf_mtt); 1392 + put_mtt_entries(dev, &cq->user_cq.qbuf_mem); 1595 1393 1596 1394 return ret; 1597 1395 } ··· 1675 1473 err_free_res: 1676 1474 if (!rdma_is_kernel_res(&ibcq->res)) { 1677 1475 erdma_unmap_user_dbrecords(ctx, &cq->user_cq.user_dbr_page); 1678 - put_mtt_entries(dev, &cq->user_cq.qbuf_mtt); 1476 + put_mtt_entries(dev, &cq->user_cq.qbuf_mem); 1679 1477 } else { 1680 1478 dma_free_coherent(&dev->pdev->dev, 1681 1479 WARPPED_BUFSIZE(depth << CQE_SHIFT),
+26 -10
drivers/infiniband/hw/erdma/erdma_verbs.h
··· 65 65 * MemoryRegion definition. 66 66 */ 67 67 #define ERDMA_MAX_INLINE_MTT_ENTRIES 4 68 - #define MTT_SIZE(mtt_cnt) (mtt_cnt << 3) /* per mtt takes 8 Bytes. */ 68 + #define MTT_SIZE(mtt_cnt) ((mtt_cnt) << 3) /* per mtt entry takes 8 Bytes. */ 69 69 #define ERDMA_MR_MAX_MTT_CNT 524288 70 70 #define ERDMA_MTT_ENTRY_SIZE 8 71 71 ··· 73 73 #define ERDMA_MR_TYPE_FRMR 1 74 74 #define ERDMA_MR_TYPE_DMA 2 75 75 76 - #define ERDMA_MR_INLINE_MTT 0 77 - #define ERDMA_MR_INDIRECT_MTT 1 76 + #define ERDMA_MR_MTT_0LEVEL 0 77 + #define ERDMA_MR_MTT_1LEVEL 1 78 78 79 79 #define ERDMA_MR_ACC_RA BIT(0) 80 80 #define ERDMA_MR_ACC_LR BIT(1) ··· 90 90 (access & IB_ACCESS_REMOTE_ATOMIC ? ERDMA_MR_ACC_RA : 0); 91 91 } 92 92 93 + /* Hierarchical storage structure for MTT entries */ 94 + struct erdma_mtt { 95 + u64 *buf; 96 + size_t size; 97 + 98 + bool continuous; 99 + union { 100 + dma_addr_t buf_dma; 101 + struct { 102 + struct scatterlist *sglist; 103 + u32 nsg; 104 + u32 level; 105 + }; 106 + }; 107 + 108 + struct erdma_mtt *low_level; 109 + }; 110 + 93 111 struct erdma_mem { 94 112 struct ib_umem *umem; 95 - void *mtt_buf; 96 - u32 mtt_type; 113 + struct erdma_mtt *mtt; 114 + 97 115 u32 page_size; 98 116 u32 page_offset; 99 117 u32 page_cnt; ··· 119 101 120 102 u64 va; 121 103 u64 len; 122 - 123 - u64 mtt_entry[ERDMA_MAX_INLINE_MTT_ENTRIES]; 124 104 }; 125 105 126 106 struct erdma_mr { ··· 137 121 }; 138 122 139 123 struct erdma_uqp { 140 - struct erdma_mem sq_mtt; 141 - struct erdma_mem rq_mtt; 124 + struct erdma_mem sq_mem; 125 + struct erdma_mem rq_mem; 142 126 143 127 dma_addr_t sq_db_info_dma_addr; 144 128 dma_addr_t rq_db_info_dma_addr; ··· 250 234 }; 251 235 252 236 struct erdma_ucq_info { 253 - struct erdma_mem qbuf_mtt; 237 + struct erdma_mem qbuf_mem; 254 238 struct erdma_user_dbrecords_page *user_dbr_page; 255 239 dma_addr_t db_info_dma_addr; 256 240 };
+1
drivers/infiniband/hw/hfi1/Makefile
··· 31 31 netdev_rx.o \ 32 32 opfn.o \ 33 33 pcie.o \ 34 + pin_system.o \ 34 35 pio.o \ 35 36 pio_copy.o \ 36 37 platform.o \
+1 -3
drivers/infiniband/hw/hfi1/affinity.c
··· 230 230 /* It must be called with node_affinity.lock held */ 231 231 static struct hfi1_affinity_node *node_affinity_lookup(int node) 232 232 { 233 - struct list_head *pos; 234 233 struct hfi1_affinity_node *entry; 235 234 236 - list_for_each(pos, &node_affinity.list) { 237 - entry = list_entry(pos, struct hfi1_affinity_node, list); 235 + list_for_each_entry(entry, &node_affinity.list, list) { 238 236 if (entry->node == node) 239 237 return entry; 240 238 }
+5 -3
drivers/infiniband/hw/hfi1/chip.c
··· 1461 1461 ret = write_lcb_csr(dd, csr, data); 1462 1462 1463 1463 if (ret) { 1464 - dd_dev_err(dd, "Could not acquire LCB for counter 0x%x", csr); 1464 + if (!(dd->flags & HFI1_SHUTDOWN)) 1465 + dd_dev_err(dd, "Could not acquire LCB for counter 0x%x", csr); 1465 1466 return 0; 1466 1467 } 1467 1468 ··· 6161 6160 ret = do_8051_command(dd, HCMD_MISC, 6162 6161 (u64)HCMD_MISC_REQUEST_LCB_ACCESS << 6163 6162 LOAD_DATA_FIELD_ID_SHIFT, NULL); 6164 - if (ret != HCMD_SUCCESS) { 6163 + if (ret != HCMD_SUCCESS && !(dd->flags & HFI1_SHUTDOWN)) { 6165 6164 dd_dev_err(dd, "%s: command failed with error %d\n", 6166 6165 __func__, ret); 6167 6166 } ··· 6242 6241 if (dd->lcb_access_count == 0) { 6243 6242 ret = request_host_lcb_access(dd); 6244 6243 if (ret) { 6245 - dd_dev_err(dd, 6244 + if (!(dd->flags & HFI1_SHUTDOWN)) 6245 + dd_dev_err(dd, 6246 6246 "%s: unable to acquire LCB access, err %d\n", 6247 6247 __func__, ret); 6248 6248 goto done;
+32 -40
drivers/infiniband/hw/hfi1/device.c
··· 10 10 #include "hfi.h" 11 11 #include "device.h" 12 12 13 - static struct class *class; 14 - static struct class *user_class; 13 + static char *hfi1_devnode(const struct device *dev, umode_t *mode) 14 + { 15 + if (mode) 16 + *mode = 0600; 17 + return kasprintf(GFP_KERNEL, "%s", dev_name(dev)); 18 + } 19 + 20 + static const struct class class = { 21 + .name = "hfi1", 22 + .devnode = hfi1_devnode, 23 + }; 24 + 25 + static char *hfi1_user_devnode(const struct device *dev, umode_t *mode) 26 + { 27 + if (mode) 28 + *mode = 0666; 29 + return kasprintf(GFP_KERNEL, "%s", dev_name(dev)); 30 + } 31 + 32 + static const struct class user_class = { 33 + .name = "hfi1_user", 34 + .devnode = hfi1_user_devnode, 35 + }; 15 36 static dev_t hfi1_dev; 16 37 17 38 int hfi1_cdev_init(int minor, const char *name, ··· 58 37 } 59 38 60 39 if (user_accessible) 61 - device = device_create(user_class, NULL, dev, NULL, "%s", name); 40 + device = device_create(&user_class, NULL, dev, NULL, "%s", name); 62 41 else 63 - device = device_create(class, NULL, dev, NULL, "%s", name); 42 + device = device_create(&class, NULL, dev, NULL, "%s", name); 64 43 65 44 if (IS_ERR(device)) { 66 45 ret = PTR_ERR(device); ··· 93 72 return hfi1_class_name; 94 73 } 95 74 96 - static char *hfi1_devnode(const struct device *dev, umode_t *mode) 97 - { 98 - if (mode) 99 - *mode = 0600; 100 - return kasprintf(GFP_KERNEL, "%s", dev_name(dev)); 101 - } 102 - 103 - static const char *hfi1_class_name_user = "hfi1_user"; 104 - static const char *class_name_user(void) 105 - { 106 - return hfi1_class_name_user; 107 - } 108 - 109 - static char *hfi1_user_devnode(const struct device *dev, umode_t *mode) 110 - { 111 - if (mode) 112 - *mode = 0666; 113 - return kasprintf(GFP_KERNEL, "%s", dev_name(dev)); 114 - } 115 - 116 75 int __init dev_init(void) 117 76 { 118 77 int ret; ··· 103 102 goto done; 104 103 } 105 104 106 - class = class_create(class_name()); 107 - if (IS_ERR(class)) { 108 - ret = PTR_ERR(class); 105 + ret = class_register(&class); 106 + if (ret) { 109 107 pr_err("Could not create device class (err %d)\n", -ret); 110 108 unregister_chrdev_region(hfi1_dev, HFI1_NMINORS); 111 109 goto done; 112 110 } 113 - class->devnode = hfi1_devnode; 114 111 115 - user_class = class_create(class_name_user()); 116 - if (IS_ERR(user_class)) { 117 - ret = PTR_ERR(user_class); 112 + ret = class_register(&user_class); 113 + if (ret) { 118 114 pr_err("Could not create device class for user accessible files (err %d)\n", 119 115 -ret); 120 - class_destroy(class); 121 - class = NULL; 122 - user_class = NULL; 116 + class_unregister(&class); 123 117 unregister_chrdev_region(hfi1_dev, HFI1_NMINORS); 124 118 goto done; 125 119 } 126 - user_class->devnode = hfi1_user_devnode; 127 120 128 121 done: 129 122 return ret; ··· 125 130 126 131 void dev_cleanup(void) 127 132 { 128 - class_destroy(class); 129 - class = NULL; 130 - 131 - class_destroy(user_class); 132 - user_class = NULL; 133 + class_unregister(&class); 134 + class_unregister(&user_class); 133 135 134 136 unregister_chrdev_region(hfi1_dev, HFI1_NMINORS); 135 137 }
+1 -3
drivers/infiniband/hw/hfi1/hfi.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */ 2 2 /* 3 - * Copyright(c) 2020 Cornelis Networks, Inc. 3 + * Copyright(c) 2020-2023 Cornelis Networks, Inc. 4 4 * Copyright(c) 2015-2020 Intel Corporation. 5 5 */ 6 6 ··· 1378 1378 #define PT_INVALID 3 1379 1379 1380 1380 struct tid_rb_node; 1381 - struct mmu_rb_node; 1382 - struct mmu_rb_handler; 1383 1381 1384 1382 /* Private data for file operations */ 1385 1383 struct hfi1_filedata {
+474
drivers/infiniband/hw/hfi1/pin_system.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause 2 + /* 3 + * Copyright(c) 2023 - Cornelis Networks, Inc. 4 + */ 5 + 6 + #include <linux/types.h> 7 + 8 + #include "hfi.h" 9 + #include "common.h" 10 + #include "device.h" 11 + #include "pinning.h" 12 + #include "mmu_rb.h" 13 + #include "user_sdma.h" 14 + #include "trace.h" 15 + 16 + struct sdma_mmu_node { 17 + struct mmu_rb_node rb; 18 + struct hfi1_user_sdma_pkt_q *pq; 19 + struct page **pages; 20 + unsigned int npages; 21 + }; 22 + 23 + static bool sdma_rb_filter(struct mmu_rb_node *node, unsigned long addr, 24 + unsigned long len); 25 + static int sdma_rb_evict(void *arg, struct mmu_rb_node *mnode, void *arg2, 26 + bool *stop); 27 + static void sdma_rb_remove(void *arg, struct mmu_rb_node *mnode); 28 + 29 + static struct mmu_rb_ops sdma_rb_ops = { 30 + .filter = sdma_rb_filter, 31 + .evict = sdma_rb_evict, 32 + .remove = sdma_rb_remove, 33 + }; 34 + 35 + int hfi1_init_system_pinning(struct hfi1_user_sdma_pkt_q *pq) 36 + { 37 + struct hfi1_devdata *dd = pq->dd; 38 + int ret; 39 + 40 + ret = hfi1_mmu_rb_register(pq, &sdma_rb_ops, dd->pport->hfi1_wq, 41 + &pq->handler); 42 + if (ret) 43 + dd_dev_err(dd, 44 + "[%u:%u] Failed to register system memory DMA support with MMU: %d\n", 45 + pq->ctxt, pq->subctxt, ret); 46 + return ret; 47 + } 48 + 49 + void hfi1_free_system_pinning(struct hfi1_user_sdma_pkt_q *pq) 50 + { 51 + if (pq->handler) 52 + hfi1_mmu_rb_unregister(pq->handler); 53 + } 54 + 55 + static u32 sdma_cache_evict(struct hfi1_user_sdma_pkt_q *pq, u32 npages) 56 + { 57 + struct evict_data evict_data; 58 + 59 + evict_data.cleared = 0; 60 + evict_data.target = npages; 61 + hfi1_mmu_rb_evict(pq->handler, &evict_data); 62 + return evict_data.cleared; 63 + } 64 + 65 + static void unpin_vector_pages(struct mm_struct *mm, struct page **pages, 66 + unsigned int start, unsigned int npages) 67 + { 68 + hfi1_release_user_pages(mm, pages + start, npages, false); 69 + kfree(pages); 70 + } 71 + 72 + static inline struct mm_struct *mm_from_sdma_node(struct sdma_mmu_node *node) 73 + { 74 + return node->rb.handler->mn.mm; 75 + } 76 + 77 + static void free_system_node(struct sdma_mmu_node *node) 78 + { 79 + if (node->npages) { 80 + unpin_vector_pages(mm_from_sdma_node(node), node->pages, 0, 81 + node->npages); 82 + atomic_sub(node->npages, &node->pq->n_locked); 83 + } 84 + kfree(node); 85 + } 86 + 87 + /* 88 + * kref_get()'s an additional kref on the returned rb_node to prevent rb_node 89 + * from being released until after rb_node is assigned to an SDMA descriptor 90 + * (struct sdma_desc) under add_system_iovec_to_sdma_packet(), even if the 91 + * virtual address range for rb_node is invalidated between now and then. 92 + */ 93 + static struct sdma_mmu_node *find_system_node(struct mmu_rb_handler *handler, 94 + unsigned long start, 95 + unsigned long end) 96 + { 97 + struct mmu_rb_node *rb_node; 98 + unsigned long flags; 99 + 100 + spin_lock_irqsave(&handler->lock, flags); 101 + rb_node = hfi1_mmu_rb_get_first(handler, start, (end - start)); 102 + if (!rb_node) { 103 + spin_unlock_irqrestore(&handler->lock, flags); 104 + return NULL; 105 + } 106 + 107 + /* "safety" kref to prevent release before add_system_iovec_to_sdma_packet() */ 108 + kref_get(&rb_node->refcount); 109 + spin_unlock_irqrestore(&handler->lock, flags); 110 + 111 + return container_of(rb_node, struct sdma_mmu_node, rb); 112 + } 113 + 114 + static int pin_system_pages(struct user_sdma_request *req, 115 + uintptr_t start_address, size_t length, 116 + struct sdma_mmu_node *node, int npages) 117 + { 118 + struct hfi1_user_sdma_pkt_q *pq = req->pq; 119 + int pinned, cleared; 120 + struct page **pages; 121 + 122 + pages = kcalloc(npages, sizeof(*pages), GFP_KERNEL); 123 + if (!pages) 124 + return -ENOMEM; 125 + 126 + retry: 127 + if (!hfi1_can_pin_pages(pq->dd, current->mm, atomic_read(&pq->n_locked), 128 + npages)) { 129 + SDMA_DBG(req, "Evicting: nlocked %u npages %u", 130 + atomic_read(&pq->n_locked), npages); 131 + cleared = sdma_cache_evict(pq, npages); 132 + if (cleared >= npages) 133 + goto retry; 134 + } 135 + 136 + SDMA_DBG(req, "Acquire user pages start_address %lx node->npages %u npages %u", 137 + start_address, node->npages, npages); 138 + pinned = hfi1_acquire_user_pages(current->mm, start_address, npages, 0, 139 + pages); 140 + 141 + if (pinned < 0) { 142 + kfree(pages); 143 + SDMA_DBG(req, "pinned %d", pinned); 144 + return pinned; 145 + } 146 + if (pinned != npages) { 147 + unpin_vector_pages(current->mm, pages, node->npages, pinned); 148 + SDMA_DBG(req, "npages %u pinned %d", npages, pinned); 149 + return -EFAULT; 150 + } 151 + node->rb.addr = start_address; 152 + node->rb.len = length; 153 + node->pages = pages; 154 + node->npages = npages; 155 + atomic_add(pinned, &pq->n_locked); 156 + SDMA_DBG(req, "done. pinned %d", pinned); 157 + return 0; 158 + } 159 + 160 + /* 161 + * kref refcount on *node_p will be 2 on successful addition: one kref from 162 + * kref_init() for mmu_rb_handler and one kref to prevent *node_p from being 163 + * released until after *node_p is assigned to an SDMA descriptor (struct 164 + * sdma_desc) under add_system_iovec_to_sdma_packet(), even if the virtual 165 + * address range for *node_p is invalidated between now and then. 166 + */ 167 + static int add_system_pinning(struct user_sdma_request *req, 168 + struct sdma_mmu_node **node_p, 169 + unsigned long start, unsigned long len) 170 + 171 + { 172 + struct hfi1_user_sdma_pkt_q *pq = req->pq; 173 + struct sdma_mmu_node *node; 174 + int ret; 175 + 176 + node = kzalloc(sizeof(*node), GFP_KERNEL); 177 + if (!node) 178 + return -ENOMEM; 179 + 180 + /* First kref "moves" to mmu_rb_handler */ 181 + kref_init(&node->rb.refcount); 182 + 183 + /* "safety" kref to prevent release before add_system_iovec_to_sdma_packet() */ 184 + kref_get(&node->rb.refcount); 185 + 186 + node->pq = pq; 187 + ret = pin_system_pages(req, start, len, node, PFN_DOWN(len)); 188 + if (ret == 0) { 189 + ret = hfi1_mmu_rb_insert(pq->handler, &node->rb); 190 + if (ret) 191 + free_system_node(node); 192 + else 193 + *node_p = node; 194 + 195 + return ret; 196 + } 197 + 198 + kfree(node); 199 + return ret; 200 + } 201 + 202 + static int get_system_cache_entry(struct user_sdma_request *req, 203 + struct sdma_mmu_node **node_p, 204 + size_t req_start, size_t req_len) 205 + { 206 + struct hfi1_user_sdma_pkt_q *pq = req->pq; 207 + u64 start = ALIGN_DOWN(req_start, PAGE_SIZE); 208 + u64 end = PFN_ALIGN(req_start + req_len); 209 + int ret; 210 + 211 + if ((end - start) == 0) { 212 + SDMA_DBG(req, 213 + "Request for empty cache entry req_start %lx req_len %lx start %llx end %llx", 214 + req_start, req_len, start, end); 215 + return -EINVAL; 216 + } 217 + 218 + SDMA_DBG(req, "req_start %lx req_len %lu", req_start, req_len); 219 + 220 + while (1) { 221 + struct sdma_mmu_node *node = 222 + find_system_node(pq->handler, start, end); 223 + u64 prepend_len = 0; 224 + 225 + SDMA_DBG(req, "node %p start %llx end %llu", node, start, end); 226 + if (!node) { 227 + ret = add_system_pinning(req, node_p, start, 228 + end - start); 229 + if (ret == -EEXIST) { 230 + /* 231 + * Another execution context has inserted a 232 + * conficting entry first. 233 + */ 234 + continue; 235 + } 236 + return ret; 237 + } 238 + 239 + if (node->rb.addr <= start) { 240 + /* 241 + * This entry covers at least part of the region. If it doesn't extend 242 + * to the end, then this will be called again for the next segment. 243 + */ 244 + *node_p = node; 245 + return 0; 246 + } 247 + 248 + SDMA_DBG(req, "prepend: node->rb.addr %lx, node->rb.refcount %d", 249 + node->rb.addr, kref_read(&node->rb.refcount)); 250 + prepend_len = node->rb.addr - start; 251 + 252 + /* 253 + * This node will not be returned, instead a new node 254 + * will be. So release the reference. 255 + */ 256 + kref_put(&node->rb.refcount, hfi1_mmu_rb_release); 257 + 258 + /* Prepend a node to cover the beginning of the allocation */ 259 + ret = add_system_pinning(req, node_p, start, prepend_len); 260 + if (ret == -EEXIST) { 261 + /* Another execution context has inserted a conficting entry first. */ 262 + continue; 263 + } 264 + return ret; 265 + } 266 + } 267 + 268 + static void sdma_mmu_rb_node_get(void *ctx) 269 + { 270 + struct mmu_rb_node *node = ctx; 271 + 272 + kref_get(&node->refcount); 273 + } 274 + 275 + static void sdma_mmu_rb_node_put(void *ctx) 276 + { 277 + struct sdma_mmu_node *node = ctx; 278 + 279 + kref_put(&node->rb.refcount, hfi1_mmu_rb_release); 280 + } 281 + 282 + static int add_mapping_to_sdma_packet(struct user_sdma_request *req, 283 + struct user_sdma_txreq *tx, 284 + struct sdma_mmu_node *cache_entry, 285 + size_t start, 286 + size_t from_this_cache_entry) 287 + { 288 + struct hfi1_user_sdma_pkt_q *pq = req->pq; 289 + unsigned int page_offset; 290 + unsigned int from_this_page; 291 + size_t page_index; 292 + void *ctx; 293 + int ret; 294 + 295 + /* 296 + * Because the cache may be more fragmented than the memory that is being accessed, 297 + * it's not strictly necessary to have a descriptor per cache entry. 298 + */ 299 + 300 + while (from_this_cache_entry) { 301 + page_index = PFN_DOWN(start - cache_entry->rb.addr); 302 + 303 + if (page_index >= cache_entry->npages) { 304 + SDMA_DBG(req, 305 + "Request for page_index %zu >= cache_entry->npages %u", 306 + page_index, cache_entry->npages); 307 + return -EINVAL; 308 + } 309 + 310 + page_offset = start - ALIGN_DOWN(start, PAGE_SIZE); 311 + from_this_page = PAGE_SIZE - page_offset; 312 + 313 + if (from_this_page < from_this_cache_entry) { 314 + ctx = NULL; 315 + } else { 316 + /* 317 + * In the case they are equal the next line has no practical effect, 318 + * but it's better to do a register to register copy than a conditional 319 + * branch. 320 + */ 321 + from_this_page = from_this_cache_entry; 322 + ctx = cache_entry; 323 + } 324 + 325 + ret = sdma_txadd_page(pq->dd, &tx->txreq, 326 + cache_entry->pages[page_index], 327 + page_offset, from_this_page, 328 + ctx, 329 + sdma_mmu_rb_node_get, 330 + sdma_mmu_rb_node_put); 331 + if (ret) { 332 + /* 333 + * When there's a failure, the entire request is freed by 334 + * user_sdma_send_pkts(). 335 + */ 336 + SDMA_DBG(req, 337 + "sdma_txadd_page failed %d page_index %lu page_offset %u from_this_page %u", 338 + ret, page_index, page_offset, from_this_page); 339 + return ret; 340 + } 341 + start += from_this_page; 342 + from_this_cache_entry -= from_this_page; 343 + } 344 + return 0; 345 + } 346 + 347 + static int add_system_iovec_to_sdma_packet(struct user_sdma_request *req, 348 + struct user_sdma_txreq *tx, 349 + struct user_sdma_iovec *iovec, 350 + size_t from_this_iovec) 351 + { 352 + while (from_this_iovec > 0) { 353 + struct sdma_mmu_node *cache_entry; 354 + size_t from_this_cache_entry; 355 + size_t start; 356 + int ret; 357 + 358 + start = (uintptr_t)iovec->iov.iov_base + iovec->offset; 359 + ret = get_system_cache_entry(req, &cache_entry, start, 360 + from_this_iovec); 361 + if (ret) { 362 + SDMA_DBG(req, "pin system segment failed %d", ret); 363 + return ret; 364 + } 365 + 366 + from_this_cache_entry = cache_entry->rb.len - (start - cache_entry->rb.addr); 367 + if (from_this_cache_entry > from_this_iovec) 368 + from_this_cache_entry = from_this_iovec; 369 + 370 + ret = add_mapping_to_sdma_packet(req, tx, cache_entry, start, 371 + from_this_cache_entry); 372 + 373 + /* 374 + * Done adding cache_entry to zero or more sdma_desc. Can 375 + * kref_put() the "safety" kref taken under 376 + * get_system_cache_entry(). 377 + */ 378 + kref_put(&cache_entry->rb.refcount, hfi1_mmu_rb_release); 379 + 380 + if (ret) { 381 + SDMA_DBG(req, "add system segment failed %d", ret); 382 + return ret; 383 + } 384 + 385 + iovec->offset += from_this_cache_entry; 386 + from_this_iovec -= from_this_cache_entry; 387 + } 388 + 389 + return 0; 390 + } 391 + 392 + /* 393 + * Add up to pkt_data_remaining bytes to the txreq, starting at the current 394 + * offset in the given iovec entry and continuing until all data has been added 395 + * to the iovec or the iovec entry type changes. 396 + * 397 + * On success, prior to returning, adjust pkt_data_remaining, req->iov_idx, and 398 + * the offset value in req->iov[req->iov_idx] to reflect the data that has been 399 + * consumed. 400 + */ 401 + int hfi1_add_pages_to_sdma_packet(struct user_sdma_request *req, 402 + struct user_sdma_txreq *tx, 403 + struct user_sdma_iovec *iovec, 404 + u32 *pkt_data_remaining) 405 + { 406 + size_t remaining_to_add = *pkt_data_remaining; 407 + /* 408 + * Walk through iovec entries, ensure the associated pages 409 + * are pinned and mapped, add data to the packet until no more 410 + * data remains to be added or the iovec entry type changes. 411 + */ 412 + while (remaining_to_add > 0) { 413 + struct user_sdma_iovec *cur_iovec; 414 + size_t from_this_iovec; 415 + int ret; 416 + 417 + cur_iovec = iovec; 418 + from_this_iovec = iovec->iov.iov_len - iovec->offset; 419 + 420 + if (from_this_iovec > remaining_to_add) { 421 + from_this_iovec = remaining_to_add; 422 + } else { 423 + /* The current iovec entry will be consumed by this pass. */ 424 + req->iov_idx++; 425 + iovec++; 426 + } 427 + 428 + ret = add_system_iovec_to_sdma_packet(req, tx, cur_iovec, 429 + from_this_iovec); 430 + if (ret) 431 + return ret; 432 + 433 + remaining_to_add -= from_this_iovec; 434 + } 435 + *pkt_data_remaining = remaining_to_add; 436 + 437 + return 0; 438 + } 439 + 440 + static bool sdma_rb_filter(struct mmu_rb_node *node, unsigned long addr, 441 + unsigned long len) 442 + { 443 + return (bool)(node->addr == addr); 444 + } 445 + 446 + /* 447 + * Return 1 to remove the node from the rb tree and call the remove op. 448 + * 449 + * Called with the rb tree lock held. 450 + */ 451 + static int sdma_rb_evict(void *arg, struct mmu_rb_node *mnode, 452 + void *evict_arg, bool *stop) 453 + { 454 + struct sdma_mmu_node *node = 455 + container_of(mnode, struct sdma_mmu_node, rb); 456 + struct evict_data *evict_data = evict_arg; 457 + 458 + /* this node will be evicted, add its pages to our count */ 459 + evict_data->cleared += node->npages; 460 + 461 + /* have enough pages been cleared? */ 462 + if (evict_data->cleared >= evict_data->target) 463 + *stop = true; 464 + 465 + return 1; /* remove this node */ 466 + } 467 + 468 + static void sdma_rb_remove(void *arg, struct mmu_rb_node *mnode) 469 + { 470 + struct sdma_mmu_node *node = 471 + container_of(mnode, struct sdma_mmu_node, rb); 472 + 473 + free_system_node(node); 474 + }
+20
drivers/infiniband/hw/hfi1/pinning.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */ 2 + /* 3 + * Copyright(c) 2023 Cornelis Networks, Inc. 4 + */ 5 + #ifndef _HFI1_PINNING_H 6 + #define _HFI1_PINNING_H 7 + 8 + struct hfi1_user_sdma_pkt_q; 9 + struct user_sdma_request; 10 + struct user_sdma_txreq; 11 + struct user_sdma_iovec; 12 + 13 + int hfi1_init_system_pinning(struct hfi1_user_sdma_pkt_q *pq); 14 + void hfi1_free_system_pinning(struct hfi1_user_sdma_pkt_q *pq); 15 + int hfi1_add_pages_to_sdma_packet(struct user_sdma_request *req, 16 + struct user_sdma_txreq *tx, 17 + struct user_sdma_iovec *iovec, 18 + u32 *pkt_data_remaining); 19 + 20 + #endif /* _HFI1_PINNING_H */
+3 -6
drivers/infiniband/hw/hfi1/pio.c
··· 1893 1893 vl_scontexts[i] = sc_per_vl + (extra > 0 ? 1 : 0); 1894 1894 } 1895 1895 /* build new map */ 1896 - newmap = kzalloc(sizeof(*newmap) + 1897 - roundup_pow_of_two(num_vls) * 1898 - sizeof(struct pio_map_elem *), 1896 + newmap = kzalloc(struct_size(newmap, map, roundup_pow_of_two(num_vls)), 1899 1897 GFP_KERNEL); 1900 1898 if (!newmap) 1901 1899 goto bail; ··· 1908 1910 int sz = roundup_pow_of_two(vl_scontexts[i]); 1909 1911 1910 1912 /* only allocate once */ 1911 - newmap->map[i] = kzalloc(sizeof(*newmap->map[i]) + 1912 - sz * sizeof(struct 1913 - send_context *), 1913 + newmap->map[i] = kzalloc(struct_size(newmap->map[i], 1914 + ksc, sz), 1914 1915 GFP_KERNEL); 1915 1916 if (!newmap->map[i]) 1916 1917 goto bail;
+6 -435
drivers/infiniband/hw/hfi1/user_sdma.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause 2 2 /* 3 - * Copyright(c) 2020 - Cornelis Networks, Inc. 3 + * Copyright(c) 2020 - 2023 Cornelis Networks, Inc. 4 4 * Copyright(c) 2015 - 2018 Intel Corporation. 5 5 */ 6 6 ··· 60 60 uint seq, 61 61 bool pkts_sent); 62 62 static void activate_packet_queue(struct iowait *wait, int reason); 63 - static bool sdma_rb_filter(struct mmu_rb_node *node, unsigned long addr, 64 - unsigned long len); 65 - static int sdma_rb_evict(void *arg, struct mmu_rb_node *mnode, 66 - void *arg2, bool *stop); 67 - static void sdma_rb_remove(void *arg, struct mmu_rb_node *mnode); 68 - 69 - static struct mmu_rb_ops sdma_rb_ops = { 70 - .filter = sdma_rb_filter, 71 - .evict = sdma_rb_evict, 72 - .remove = sdma_rb_remove, 73 - }; 74 - 75 - static int add_system_pages_to_sdma_packet(struct user_sdma_request *req, 76 - struct user_sdma_txreq *tx, 77 - struct user_sdma_iovec *iovec, 78 - u32 *pkt_remaining); 79 63 80 64 static int defer_packet_queue( 81 65 struct sdma_engine *sde, ··· 169 185 170 186 cq->nentries = hfi1_sdma_comp_ring_size; 171 187 172 - ret = hfi1_mmu_rb_register(pq, &sdma_rb_ops, dd->pport->hfi1_wq, 173 - &pq->handler); 174 - if (ret) { 175 - dd_dev_err(dd, "Failed to register with MMU %d", ret); 188 + ret = hfi1_init_system_pinning(pq); 189 + if (ret) 176 190 goto pq_mmu_fail; 177 - } 178 191 179 192 rcu_assign_pointer(fd->pq, pq); 180 193 fd->cq = cq; ··· 230 249 pq->wait, 231 250 !atomic_read(&pq->n_reqs)); 232 251 kfree(pq->reqs); 233 - if (pq->handler) 234 - hfi1_mmu_rb_unregister(pq->handler); 252 + hfi1_free_system_pinning(pq); 235 253 bitmap_free(pq->req_in_use); 236 254 kmem_cache_destroy(pq->txreq_cache); 237 255 flush_pq_iowait(pq); ··· 801 821 req->tidoffset += datalen; 802 822 req->sent += datalen; 803 823 while (datalen) { 804 - ret = add_system_pages_to_sdma_packet(req, tx, iovec, 805 - &datalen); 824 + ret = hfi1_add_pages_to_sdma_packet(req, tx, iovec, 825 + &datalen); 806 826 if (ret) 807 827 goto free_txreq; 808 828 iovec = &req->iovs[req->iov_idx]; ··· 838 858 free_tx: 839 859 kmem_cache_free(pq->txreq_cache, tx); 840 860 return ret; 841 - } 842 - 843 - static u32 sdma_cache_evict(struct hfi1_user_sdma_pkt_q *pq, u32 npages) 844 - { 845 - struct evict_data evict_data; 846 - struct mmu_rb_handler *handler = pq->handler; 847 - 848 - evict_data.cleared = 0; 849 - evict_data.target = npages; 850 - hfi1_mmu_rb_evict(handler, &evict_data); 851 - return evict_data.cleared; 852 861 } 853 862 854 863 static int check_header_template(struct user_sdma_request *req, ··· 1221 1252 cq->comps[idx].status = state; 1222 1253 trace_hfi1_sdma_user_completion(pq->dd, pq->ctxt, pq->subctxt, 1223 1254 idx, state, ret); 1224 - } 1225 - 1226 - static void unpin_vector_pages(struct mm_struct *mm, struct page **pages, 1227 - unsigned int start, unsigned int npages) 1228 - { 1229 - hfi1_release_user_pages(mm, pages + start, npages, false); 1230 - kfree(pages); 1231 - } 1232 - 1233 - static void free_system_node(struct sdma_mmu_node *node) 1234 - { 1235 - if (node->npages) { 1236 - unpin_vector_pages(mm_from_sdma_node(node), node->pages, 0, 1237 - node->npages); 1238 - atomic_sub(node->npages, &node->pq->n_locked); 1239 - } 1240 - kfree(node); 1241 - } 1242 - 1243 - /* 1244 - * kref_get()'s an additional kref on the returned rb_node to prevent rb_node 1245 - * from being released until after rb_node is assigned to an SDMA descriptor 1246 - * (struct sdma_desc) under add_system_iovec_to_sdma_packet(), even if the 1247 - * virtual address range for rb_node is invalidated between now and then. 1248 - */ 1249 - static struct sdma_mmu_node *find_system_node(struct mmu_rb_handler *handler, 1250 - unsigned long start, 1251 - unsigned long end) 1252 - { 1253 - struct mmu_rb_node *rb_node; 1254 - unsigned long flags; 1255 - 1256 - spin_lock_irqsave(&handler->lock, flags); 1257 - rb_node = hfi1_mmu_rb_get_first(handler, start, (end - start)); 1258 - if (!rb_node) { 1259 - spin_unlock_irqrestore(&handler->lock, flags); 1260 - return NULL; 1261 - } 1262 - 1263 - /* "safety" kref to prevent release before add_system_iovec_to_sdma_packet() */ 1264 - kref_get(&rb_node->refcount); 1265 - spin_unlock_irqrestore(&handler->lock, flags); 1266 - 1267 - return container_of(rb_node, struct sdma_mmu_node, rb); 1268 - } 1269 - 1270 - static int pin_system_pages(struct user_sdma_request *req, 1271 - uintptr_t start_address, size_t length, 1272 - struct sdma_mmu_node *node, int npages) 1273 - { 1274 - struct hfi1_user_sdma_pkt_q *pq = req->pq; 1275 - int pinned, cleared; 1276 - struct page **pages; 1277 - 1278 - pages = kcalloc(npages, sizeof(*pages), GFP_KERNEL); 1279 - if (!pages) 1280 - return -ENOMEM; 1281 - 1282 - retry: 1283 - if (!hfi1_can_pin_pages(pq->dd, current->mm, atomic_read(&pq->n_locked), 1284 - npages)) { 1285 - SDMA_DBG(req, "Evicting: nlocked %u npages %u", 1286 - atomic_read(&pq->n_locked), npages); 1287 - cleared = sdma_cache_evict(pq, npages); 1288 - if (cleared >= npages) 1289 - goto retry; 1290 - } 1291 - 1292 - SDMA_DBG(req, "Acquire user pages start_address %lx node->npages %u npages %u", 1293 - start_address, node->npages, npages); 1294 - pinned = hfi1_acquire_user_pages(current->mm, start_address, npages, 0, 1295 - pages); 1296 - 1297 - if (pinned < 0) { 1298 - kfree(pages); 1299 - SDMA_DBG(req, "pinned %d", pinned); 1300 - return pinned; 1301 - } 1302 - if (pinned != npages) { 1303 - unpin_vector_pages(current->mm, pages, node->npages, pinned); 1304 - SDMA_DBG(req, "npages %u pinned %d", npages, pinned); 1305 - return -EFAULT; 1306 - } 1307 - node->rb.addr = start_address; 1308 - node->rb.len = length; 1309 - node->pages = pages; 1310 - node->npages = npages; 1311 - atomic_add(pinned, &pq->n_locked); 1312 - SDMA_DBG(req, "done. pinned %d", pinned); 1313 - return 0; 1314 - } 1315 - 1316 - /* 1317 - * kref refcount on *node_p will be 2 on successful addition: one kref from 1318 - * kref_init() for mmu_rb_handler and one kref to prevent *node_p from being 1319 - * released until after *node_p is assigned to an SDMA descriptor (struct 1320 - * sdma_desc) under add_system_iovec_to_sdma_packet(), even if the virtual 1321 - * address range for *node_p is invalidated between now and then. 1322 - */ 1323 - static int add_system_pinning(struct user_sdma_request *req, 1324 - struct sdma_mmu_node **node_p, 1325 - unsigned long start, unsigned long len) 1326 - 1327 - { 1328 - struct hfi1_user_sdma_pkt_q *pq = req->pq; 1329 - struct sdma_mmu_node *node; 1330 - int ret; 1331 - 1332 - node = kzalloc(sizeof(*node), GFP_KERNEL); 1333 - if (!node) 1334 - return -ENOMEM; 1335 - 1336 - /* First kref "moves" to mmu_rb_handler */ 1337 - kref_init(&node->rb.refcount); 1338 - 1339 - /* "safety" kref to prevent release before add_system_iovec_to_sdma_packet() */ 1340 - kref_get(&node->rb.refcount); 1341 - 1342 - node->pq = pq; 1343 - ret = pin_system_pages(req, start, len, node, PFN_DOWN(len)); 1344 - if (ret == 0) { 1345 - ret = hfi1_mmu_rb_insert(pq->handler, &node->rb); 1346 - if (ret) 1347 - free_system_node(node); 1348 - else 1349 - *node_p = node; 1350 - 1351 - return ret; 1352 - } 1353 - 1354 - kfree(node); 1355 - return ret; 1356 - } 1357 - 1358 - static int get_system_cache_entry(struct user_sdma_request *req, 1359 - struct sdma_mmu_node **node_p, 1360 - size_t req_start, size_t req_len) 1361 - { 1362 - struct hfi1_user_sdma_pkt_q *pq = req->pq; 1363 - u64 start = ALIGN_DOWN(req_start, PAGE_SIZE); 1364 - u64 end = PFN_ALIGN(req_start + req_len); 1365 - struct mmu_rb_handler *handler = pq->handler; 1366 - int ret; 1367 - 1368 - if ((end - start) == 0) { 1369 - SDMA_DBG(req, 1370 - "Request for empty cache entry req_start %lx req_len %lx start %llx end %llx", 1371 - req_start, req_len, start, end); 1372 - return -EINVAL; 1373 - } 1374 - 1375 - SDMA_DBG(req, "req_start %lx req_len %lu", req_start, req_len); 1376 - 1377 - while (1) { 1378 - struct sdma_mmu_node *node = 1379 - find_system_node(handler, start, end); 1380 - u64 prepend_len = 0; 1381 - 1382 - SDMA_DBG(req, "node %p start %llx end %llu", node, start, end); 1383 - if (!node) { 1384 - ret = add_system_pinning(req, node_p, start, 1385 - end - start); 1386 - if (ret == -EEXIST) { 1387 - /* 1388 - * Another execution context has inserted a 1389 - * conficting entry first. 1390 - */ 1391 - continue; 1392 - } 1393 - return ret; 1394 - } 1395 - 1396 - if (node->rb.addr <= start) { 1397 - /* 1398 - * This entry covers at least part of the region. If it doesn't extend 1399 - * to the end, then this will be called again for the next segment. 1400 - */ 1401 - *node_p = node; 1402 - return 0; 1403 - } 1404 - 1405 - SDMA_DBG(req, "prepend: node->rb.addr %lx, node->rb.refcount %d", 1406 - node->rb.addr, kref_read(&node->rb.refcount)); 1407 - prepend_len = node->rb.addr - start; 1408 - 1409 - /* 1410 - * This node will not be returned, instead a new node 1411 - * will be. So release the reference. 1412 - */ 1413 - kref_put(&node->rb.refcount, hfi1_mmu_rb_release); 1414 - 1415 - /* Prepend a node to cover the beginning of the allocation */ 1416 - ret = add_system_pinning(req, node_p, start, prepend_len); 1417 - if (ret == -EEXIST) { 1418 - /* Another execution context has inserted a conficting entry first. */ 1419 - continue; 1420 - } 1421 - return ret; 1422 - } 1423 - } 1424 - 1425 - static void sdma_mmu_rb_node_get(void *ctx) 1426 - { 1427 - struct mmu_rb_node *node = ctx; 1428 - 1429 - kref_get(&node->refcount); 1430 - } 1431 - 1432 - static void sdma_mmu_rb_node_put(void *ctx) 1433 - { 1434 - struct sdma_mmu_node *node = ctx; 1435 - 1436 - kref_put(&node->rb.refcount, hfi1_mmu_rb_release); 1437 - } 1438 - 1439 - static int add_mapping_to_sdma_packet(struct user_sdma_request *req, 1440 - struct user_sdma_txreq *tx, 1441 - struct sdma_mmu_node *cache_entry, 1442 - size_t start, 1443 - size_t from_this_cache_entry) 1444 - { 1445 - struct hfi1_user_sdma_pkt_q *pq = req->pq; 1446 - unsigned int page_offset; 1447 - unsigned int from_this_page; 1448 - size_t page_index; 1449 - void *ctx; 1450 - int ret; 1451 - 1452 - /* 1453 - * Because the cache may be more fragmented than the memory that is being accessed, 1454 - * it's not strictly necessary to have a descriptor per cache entry. 1455 - */ 1456 - 1457 - while (from_this_cache_entry) { 1458 - page_index = PFN_DOWN(start - cache_entry->rb.addr); 1459 - 1460 - if (page_index >= cache_entry->npages) { 1461 - SDMA_DBG(req, 1462 - "Request for page_index %zu >= cache_entry->npages %u", 1463 - page_index, cache_entry->npages); 1464 - return -EINVAL; 1465 - } 1466 - 1467 - page_offset = start - ALIGN_DOWN(start, PAGE_SIZE); 1468 - from_this_page = PAGE_SIZE - page_offset; 1469 - 1470 - if (from_this_page < from_this_cache_entry) { 1471 - ctx = NULL; 1472 - } else { 1473 - /* 1474 - * In the case they are equal the next line has no practical effect, 1475 - * but it's better to do a register to register copy than a conditional 1476 - * branch. 1477 - */ 1478 - from_this_page = from_this_cache_entry; 1479 - ctx = cache_entry; 1480 - } 1481 - 1482 - ret = sdma_txadd_page(pq->dd, &tx->txreq, 1483 - cache_entry->pages[page_index], 1484 - page_offset, from_this_page, 1485 - ctx, 1486 - sdma_mmu_rb_node_get, 1487 - sdma_mmu_rb_node_put); 1488 - if (ret) { 1489 - /* 1490 - * When there's a failure, the entire request is freed by 1491 - * user_sdma_send_pkts(). 1492 - */ 1493 - SDMA_DBG(req, 1494 - "sdma_txadd_page failed %d page_index %lu page_offset %u from_this_page %u", 1495 - ret, page_index, page_offset, from_this_page); 1496 - return ret; 1497 - } 1498 - start += from_this_page; 1499 - from_this_cache_entry -= from_this_page; 1500 - } 1501 - return 0; 1502 - } 1503 - 1504 - static int add_system_iovec_to_sdma_packet(struct user_sdma_request *req, 1505 - struct user_sdma_txreq *tx, 1506 - struct user_sdma_iovec *iovec, 1507 - size_t from_this_iovec) 1508 - { 1509 - while (from_this_iovec > 0) { 1510 - struct sdma_mmu_node *cache_entry; 1511 - size_t from_this_cache_entry; 1512 - size_t start; 1513 - int ret; 1514 - 1515 - start = (uintptr_t)iovec->iov.iov_base + iovec->offset; 1516 - ret = get_system_cache_entry(req, &cache_entry, start, 1517 - from_this_iovec); 1518 - if (ret) { 1519 - SDMA_DBG(req, "pin system segment failed %d", ret); 1520 - return ret; 1521 - } 1522 - 1523 - from_this_cache_entry = cache_entry->rb.len - (start - cache_entry->rb.addr); 1524 - if (from_this_cache_entry > from_this_iovec) 1525 - from_this_cache_entry = from_this_iovec; 1526 - 1527 - ret = add_mapping_to_sdma_packet(req, tx, cache_entry, start, 1528 - from_this_cache_entry); 1529 - 1530 - /* 1531 - * Done adding cache_entry to zero or more sdma_desc. Can 1532 - * kref_put() the "safety" kref taken under 1533 - * get_system_cache_entry(). 1534 - */ 1535 - kref_put(&cache_entry->rb.refcount, hfi1_mmu_rb_release); 1536 - 1537 - if (ret) { 1538 - SDMA_DBG(req, "add system segment failed %d", ret); 1539 - return ret; 1540 - } 1541 - 1542 - iovec->offset += from_this_cache_entry; 1543 - from_this_iovec -= from_this_cache_entry; 1544 - } 1545 - 1546 - return 0; 1547 - } 1548 - 1549 - static int add_system_pages_to_sdma_packet(struct user_sdma_request *req, 1550 - struct user_sdma_txreq *tx, 1551 - struct user_sdma_iovec *iovec, 1552 - u32 *pkt_data_remaining) 1553 - { 1554 - size_t remaining_to_add = *pkt_data_remaining; 1555 - /* 1556 - * Walk through iovec entries, ensure the associated pages 1557 - * are pinned and mapped, add data to the packet until no more 1558 - * data remains to be added. 1559 - */ 1560 - while (remaining_to_add > 0) { 1561 - struct user_sdma_iovec *cur_iovec; 1562 - size_t from_this_iovec; 1563 - int ret; 1564 - 1565 - cur_iovec = iovec; 1566 - from_this_iovec = iovec->iov.iov_len - iovec->offset; 1567 - 1568 - if (from_this_iovec > remaining_to_add) { 1569 - from_this_iovec = remaining_to_add; 1570 - } else { 1571 - /* The current iovec entry will be consumed by this pass. */ 1572 - req->iov_idx++; 1573 - iovec++; 1574 - } 1575 - 1576 - ret = add_system_iovec_to_sdma_packet(req, tx, cur_iovec, 1577 - from_this_iovec); 1578 - if (ret) 1579 - return ret; 1580 - 1581 - remaining_to_add -= from_this_iovec; 1582 - } 1583 - *pkt_data_remaining = remaining_to_add; 1584 - 1585 - return 0; 1586 - } 1587 - 1588 - static bool sdma_rb_filter(struct mmu_rb_node *node, unsigned long addr, 1589 - unsigned long len) 1590 - { 1591 - return (bool)(node->addr == addr); 1592 - } 1593 - 1594 - /* 1595 - * Return 1 to remove the node from the rb tree and call the remove op. 1596 - * 1597 - * Called with the rb tree lock held. 1598 - */ 1599 - static int sdma_rb_evict(void *arg, struct mmu_rb_node *mnode, 1600 - void *evict_arg, bool *stop) 1601 - { 1602 - struct sdma_mmu_node *node = 1603 - container_of(mnode, struct sdma_mmu_node, rb); 1604 - struct evict_data *evict_data = evict_arg; 1605 - 1606 - /* this node will be evicted, add its pages to our count */ 1607 - evict_data->cleared += node->npages; 1608 - 1609 - /* have enough pages been cleared? */ 1610 - if (evict_data->cleared >= evict_data->target) 1611 - *stop = true; 1612 - 1613 - return 1; /* remove this node */ 1614 - } 1615 - 1616 - static void sdma_rb_remove(void *arg, struct mmu_rb_node *mnode) 1617 - { 1618 - struct sdma_mmu_node *node = 1619 - container_of(mnode, struct sdma_mmu_node, rb); 1620 - 1621 - free_system_node(node); 1622 1255 }
+3 -14
drivers/infiniband/hw/hfi1/user_sdma.h
··· 1 1 /* SPDX-License-Identifier: GPL-2.0 or BSD-3-Clause */ 2 2 /* 3 - * Copyright(c) 2020 - Cornelis Networks, Inc. 3 + * Copyright(c) 2023 - Cornelis Networks, Inc. 4 4 * Copyright(c) 2015 - 2018 Intel Corporation. 5 5 */ 6 6 #ifndef _HFI1_USER_SDMA_H ··· 13 13 #include "iowait.h" 14 14 #include "user_exp_rcv.h" 15 15 #include "mmu_rb.h" 16 + #include "pinning.h" 17 + #include "sdma.h" 16 18 17 19 /* The maximum number of Data io vectors per message/request */ 18 20 #define MAX_VECTORS_PER_REQ 8 ··· 101 99 struct hfi1_user_sdma_comp_q { 102 100 u16 nentries; 103 101 struct hfi1_sdma_comp_entry *comps; 104 - }; 105 - 106 - struct sdma_mmu_node { 107 - struct mmu_rb_node rb; 108 - struct hfi1_user_sdma_pkt_q *pq; 109 - struct page **pages; 110 - unsigned int npages; 111 102 }; 112 103 113 104 struct user_sdma_iovec { ··· 198 203 int hfi1_user_sdma_process_request(struct hfi1_filedata *fd, 199 204 struct iovec *iovec, unsigned long dim, 200 205 unsigned long *count); 201 - 202 - static inline struct mm_struct *mm_from_sdma_node(struct sdma_mmu_node *node) 203 - { 204 - return node->rb.handler->mn.mm; 205 - } 206 - 207 206 #endif /* _HFI1_USER_SDMA_H */
+29 -6
drivers/infiniband/hw/hns/hns_roce_device.h
··· 97 97 #define HNS_ROCE_CQ_BANK_NUM 4 98 98 99 99 #define CQ_BANKID_SHIFT 2 100 + #define CQ_BANKID_MASK GENMASK(1, 0) 100 101 101 102 enum { 102 103 SERV_TYPE_RC, ··· 715 714 u32 max_rq_sg; 716 715 u32 rsv0; 717 716 u32 num_qps; 718 - u32 num_pi_qps; 719 717 u32 reserved_qps; 720 718 u32 num_srqs; 721 719 u32 max_wqes; ··· 840 840 HNS_ROCE_DEVICE_STATE_UNINIT, 841 841 }; 842 842 843 + enum hns_roce_hw_pkt_stat_index { 844 + HNS_ROCE_HW_RX_RC_PKT_CNT, 845 + HNS_ROCE_HW_RX_UC_PKT_CNT, 846 + HNS_ROCE_HW_RX_UD_PKT_CNT, 847 + HNS_ROCE_HW_RX_XRC_PKT_CNT, 848 + HNS_ROCE_HW_RX_PKT_CNT, 849 + HNS_ROCE_HW_RX_ERR_PKT_CNT, 850 + HNS_ROCE_HW_RX_CNP_PKT_CNT, 851 + HNS_ROCE_HW_TX_RC_PKT_CNT, 852 + HNS_ROCE_HW_TX_UC_PKT_CNT, 853 + HNS_ROCE_HW_TX_UD_PKT_CNT, 854 + HNS_ROCE_HW_TX_XRC_PKT_CNT, 855 + HNS_ROCE_HW_TX_PKT_CNT, 856 + HNS_ROCE_HW_TX_ERR_PKT_CNT, 857 + HNS_ROCE_HW_TX_CNP_PKT_CNT, 858 + HNS_ROCE_HW_TRP_GET_MPT_ERR_PKT_CNT, 859 + HNS_ROCE_HW_TRP_GET_IRRL_ERR_PKT_CNT, 860 + HNS_ROCE_HW_ECN_DB_CNT, 861 + HNS_ROCE_HW_RX_BUF_CNT, 862 + HNS_ROCE_HW_TRP_RX_SOF_CNT, 863 + HNS_ROCE_HW_CQ_CQE_CNT, 864 + HNS_ROCE_HW_CQ_POE_CNT, 865 + HNS_ROCE_HW_CQ_NOTIFY_CNT, 866 + HNS_ROCE_HW_CNT_TOTAL 867 + }; 868 + 843 869 struct hns_roce_hw { 844 870 int (*cmq_init)(struct hns_roce_dev *hr_dev); 845 871 void (*cmq_exit)(struct hns_roce_dev *hr_dev); ··· 908 882 int (*query_cqc)(struct hns_roce_dev *hr_dev, u32 cqn, void *buffer); 909 883 int (*query_qpc)(struct hns_roce_dev *hr_dev, u32 qpn, void *buffer); 910 884 int (*query_mpt)(struct hns_roce_dev *hr_dev, u32 key, void *buffer); 885 + int (*query_hw_counter)(struct hns_roce_dev *hr_dev, 886 + u64 *stats, u32 port, int *hw_counters); 911 887 const struct ib_device_ops *hns_roce_dev_ops; 912 888 const struct ib_device_ops *hns_roce_dev_srq_ops; 913 889 }; ··· 1140 1112 void hns_roce_init_srq_table(struct hns_roce_dev *hr_dev); 1141 1113 void hns_roce_init_xrcd_table(struct hns_roce_dev *hr_dev); 1142 1114 1143 - void hns_roce_cleanup_eq_table(struct hns_roce_dev *hr_dev); 1144 1115 void hns_roce_cleanup_cq_table(struct hns_roce_dev *hr_dev); 1145 1116 void hns_roce_cleanup_qp_table(struct hns_roce_dev *hr_dev); 1146 1117 ··· 1188 1161 int hns_roce_create_srq(struct ib_srq *srq, 1189 1162 struct ib_srq_init_attr *srq_init_attr, 1190 1163 struct ib_udata *udata); 1191 - int hns_roce_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr, 1192 - enum ib_srq_attr_mask srq_attr_mask, 1193 - struct ib_udata *udata); 1194 1164 int hns_roce_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata); 1195 1165 1196 1166 int hns_roce_alloc_xrcd(struct ib_xrcd *ib_xrcd, struct ib_udata *udata); ··· 1230 1206 void flush_cqe(struct hns_roce_dev *dev, struct hns_roce_qp *qp); 1231 1207 void hns_roce_qp_event(struct hns_roce_dev *hr_dev, u32 qpn, int event_type); 1232 1208 void hns_roce_srq_event(struct hns_roce_dev *hr_dev, u32 srqn, int event_type); 1233 - u8 hns_get_gid_index(struct hns_roce_dev *hr_dev, u32 port, int gid_index); 1234 1209 void hns_roce_handle_device_err(struct hns_roce_dev *hr_dev); 1235 1210 int hns_roce_init(struct hns_roce_dev *hr_dev); 1236 1211 void hns_roce_exit(struct hns_roce_dev *hr_dev);
+1 -1
drivers/infiniband/hw/hns/hns_roce_hem.c
··· 78 78 return false; 79 79 } 80 80 81 - return hop_num ? true : false; 81 + return hop_num; 82 82 } 83 83 84 84 static bool hns_roce_check_hem_null(struct hns_roce_hem **hem, u64 hem_idx,
+71 -84
drivers/infiniband/hw/hns/hns_roce_hw_v2.c
··· 750 750 qp->sq.head += nreq; 751 751 qp->next_sge = sge_idx; 752 752 753 - if (nreq == 1 && (qp->en_flags & HNS_ROCE_QP_CAP_DIRECT_WQE)) 753 + if (nreq == 1 && !ret && 754 + (qp->en_flags & HNS_ROCE_QP_CAP_DIRECT_WQE)) 754 755 write_dwqe(hr_dev, qp, wqe); 755 756 else 756 757 update_sq_db(hr_dev, qp); ··· 1613 1612 return 0; 1614 1613 } 1615 1614 1615 + static int hns_roce_hw_v2_query_counter(struct hns_roce_dev *hr_dev, 1616 + u64 *stats, u32 port, int *num_counters) 1617 + { 1618 + #define CNT_PER_DESC 3 1619 + struct hns_roce_cmq_desc *desc; 1620 + int bd_idx, cnt_idx; 1621 + __le64 *cnt_data; 1622 + int desc_num; 1623 + int ret; 1624 + int i; 1625 + 1626 + if (port > hr_dev->caps.num_ports) 1627 + return -EINVAL; 1628 + 1629 + desc_num = DIV_ROUND_UP(HNS_ROCE_HW_CNT_TOTAL, CNT_PER_DESC); 1630 + desc = kcalloc(desc_num, sizeof(*desc), GFP_KERNEL); 1631 + if (!desc) 1632 + return -ENOMEM; 1633 + 1634 + for (i = 0; i < desc_num; i++) { 1635 + hns_roce_cmq_setup_basic_desc(&desc[i], 1636 + HNS_ROCE_OPC_QUERY_COUNTER, true); 1637 + if (i != desc_num - 1) 1638 + desc[i].flag |= cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT); 1639 + } 1640 + 1641 + ret = hns_roce_cmq_send(hr_dev, desc, desc_num); 1642 + if (ret) { 1643 + ibdev_err(&hr_dev->ib_dev, 1644 + "failed to get counter, ret = %d.\n", ret); 1645 + goto err_out; 1646 + } 1647 + 1648 + for (i = 0; i < HNS_ROCE_HW_CNT_TOTAL && i < *num_counters; i++) { 1649 + bd_idx = i / CNT_PER_DESC; 1650 + if (!(desc[bd_idx].flag & HNS_ROCE_CMD_FLAG_NEXT) && 1651 + bd_idx != HNS_ROCE_HW_CNT_TOTAL / CNT_PER_DESC) 1652 + break; 1653 + 1654 + cnt_data = (__le64 *)&desc[bd_idx].data[0]; 1655 + cnt_idx = i % CNT_PER_DESC; 1656 + stats[i] = le64_to_cpu(cnt_data[cnt_idx]); 1657 + } 1658 + *num_counters = i; 1659 + 1660 + err_out: 1661 + kfree(desc); 1662 + return ret; 1663 + } 1664 + 1616 1665 static int hns_roce_config_global_param(struct hns_roce_dev *hr_dev) 1617 1666 { 1618 1667 struct hns_roce_cmq_desc desc; ··· 1731 1680 return 0; 1732 1681 } 1733 1682 1734 - static int load_ext_cfg_caps(struct hns_roce_dev *hr_dev, bool is_vf) 1735 - { 1736 - struct hns_roce_cmq_desc desc; 1737 - struct hns_roce_cmq_req *req = (struct hns_roce_cmq_req *)desc.data; 1738 - struct hns_roce_caps *caps = &hr_dev->caps; 1739 - u32 func_num, qp_num; 1740 - int ret; 1741 - 1742 - hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_EXT_CFG, true); 1743 - ret = hns_roce_cmq_send(hr_dev, &desc, 1); 1744 - if (ret) 1745 - return ret; 1746 - 1747 - func_num = is_vf ? 1 : max_t(u32, 1, hr_dev->func_num); 1748 - qp_num = hr_reg_read(req, EXT_CFG_QP_PI_NUM) / func_num; 1749 - caps->num_pi_qps = round_down(qp_num, HNS_ROCE_QP_BANK_NUM); 1750 - 1751 - qp_num = hr_reg_read(req, EXT_CFG_QP_NUM) / func_num; 1752 - caps->num_qps = round_down(qp_num, HNS_ROCE_QP_BANK_NUM); 1753 - 1754 - return 0; 1755 - } 1756 - 1757 1683 static int load_pf_timer_res_caps(struct hns_roce_dev *hr_dev) 1758 1684 { 1759 1685 struct hns_roce_cmq_desc desc; ··· 1751 1723 return 0; 1752 1724 } 1753 1725 1754 - static int query_func_resource_caps(struct hns_roce_dev *hr_dev, bool is_vf) 1755 - { 1756 - struct device *dev = hr_dev->dev; 1757 - int ret; 1758 - 1759 - ret = load_func_res_caps(hr_dev, is_vf); 1760 - if (ret) { 1761 - dev_err(dev, "failed to load res caps, ret = %d (%s).\n", ret, 1762 - is_vf ? "vf" : "pf"); 1763 - return ret; 1764 - } 1765 - 1766 - if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09) { 1767 - ret = load_ext_cfg_caps(hr_dev, is_vf); 1768 - if (ret) 1769 - dev_err(dev, "failed to load ext cfg, ret = %d (%s).\n", 1770 - ret, is_vf ? "vf" : "pf"); 1771 - } 1772 - 1773 - return ret; 1774 - } 1775 - 1776 1726 static int hns_roce_query_pf_resource(struct hns_roce_dev *hr_dev) 1777 1727 { 1778 1728 struct device *dev = hr_dev->dev; 1779 1729 int ret; 1780 1730 1781 - ret = query_func_resource_caps(hr_dev, false); 1782 - if (ret) 1731 + ret = load_func_res_caps(hr_dev, false); 1732 + if (ret) { 1733 + dev_err(dev, "failed to load pf res caps, ret = %d.\n", ret); 1783 1734 return ret; 1735 + } 1784 1736 1785 1737 ret = load_pf_timer_res_caps(hr_dev); 1786 1738 if (ret) ··· 1772 1764 1773 1765 static int hns_roce_query_vf_resource(struct hns_roce_dev *hr_dev) 1774 1766 { 1775 - return query_func_resource_caps(hr_dev, true); 1767 + struct device *dev = hr_dev->dev; 1768 + int ret; 1769 + 1770 + ret = load_func_res_caps(hr_dev, true); 1771 + if (ret) 1772 + dev_err(dev, "failed to load vf res caps, ret = %d.\n", ret); 1773 + 1774 + return ret; 1776 1775 } 1777 1776 1778 1777 static int __hns_roce_set_vf_switch_param(struct hns_roce_dev *hr_dev, ··· 1864 1849 return hns_roce_cmq_send(hr_dev, desc, 2); 1865 1850 } 1866 1851 1867 - static int config_vf_ext_resource(struct hns_roce_dev *hr_dev, u32 vf_id) 1868 - { 1869 - struct hns_roce_cmq_desc desc; 1870 - struct hns_roce_cmq_req *req = (struct hns_roce_cmq_req *)desc.data; 1871 - struct hns_roce_caps *caps = &hr_dev->caps; 1872 - 1873 - hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_EXT_CFG, false); 1874 - 1875 - hr_reg_write(req, EXT_CFG_VF_ID, vf_id); 1876 - 1877 - hr_reg_write(req, EXT_CFG_QP_PI_NUM, caps->num_pi_qps); 1878 - hr_reg_write(req, EXT_CFG_QP_PI_IDX, vf_id * caps->num_pi_qps); 1879 - hr_reg_write(req, EXT_CFG_QP_NUM, caps->num_qps); 1880 - hr_reg_write(req, EXT_CFG_QP_IDX, vf_id * caps->num_qps); 1881 - 1882 - return hns_roce_cmq_send(hr_dev, &desc, 1); 1883 - } 1884 - 1885 1852 static int hns_roce_alloc_vf_resource(struct hns_roce_dev *hr_dev) 1886 1853 { 1887 1854 u32 func_num = max_t(u32, 1, hr_dev->func_num); ··· 1877 1880 "failed to config vf-%u hem res, ret = %d.\n", 1878 1881 vf_id, ret); 1879 1882 return ret; 1880 - } 1881 - 1882 - if (hr_dev->pci_dev->revision >= PCI_REVISION_ID_HIP09) { 1883 - ret = config_vf_ext_resource(hr_dev, vf_id); 1884 - if (ret) { 1885 - dev_err(hr_dev->dev, 1886 - "failed to config vf-%u ext res, ret = %d.\n", 1887 - vf_id, ret); 1888 - return ret; 1889 - } 1890 1883 } 1891 1884 } 1892 1885 ··· 2062 2075 caps->qpc_timer_hop_num = HNS_ROCE_HOP_NUM_0; 2063 2076 caps->cqc_timer_hop_num = HNS_ROCE_HOP_NUM_0; 2064 2077 2065 - caps->num_xrcds = HNS_ROCE_V2_MAX_XRCD_NUM; 2066 - caps->reserved_xrcds = HNS_ROCE_V2_RSV_XRCD_NUM; 2067 - 2068 2078 caps->num_srqwqe_segs = HNS_ROCE_V2_MAX_SRQWQE_SEGS; 2069 2079 caps->num_idx_segs = HNS_ROCE_V2_MAX_IDX_SEGS; 2070 2080 ··· 2184 2200 caps->num_cqs = 1 << hr_reg_read(resp_c, PF_CAPS_C_NUM_CQS); 2185 2201 caps->gid_table_len[0] = hr_reg_read(resp_c, PF_CAPS_C_MAX_GID); 2186 2202 caps->max_cqes = 1 << hr_reg_read(resp_c, PF_CAPS_C_CQ_DEPTH); 2203 + caps->num_xrcds = 1 << hr_reg_read(resp_c, PF_CAPS_C_NUM_XRCDS); 2187 2204 caps->num_mtpts = 1 << hr_reg_read(resp_c, PF_CAPS_C_NUM_MRWS); 2188 2205 caps->num_qps = 1 << hr_reg_read(resp_c, PF_CAPS_C_NUM_QPS); 2189 2206 caps->max_qp_init_rdma = hr_reg_read(resp_c, PF_CAPS_C_MAX_ORD); ··· 2205 2220 caps->reserved_mrws = hr_reg_read(resp_e, PF_CAPS_E_RSV_MRWS); 2206 2221 caps->chunk_sz = 1 << hr_reg_read(resp_e, PF_CAPS_E_CHUNK_SIZE_SHIFT); 2207 2222 caps->reserved_cqs = hr_reg_read(resp_e, PF_CAPS_E_RSV_CQS); 2223 + caps->reserved_xrcds = hr_reg_read(resp_e, PF_CAPS_E_RSV_XRCDS); 2208 2224 caps->reserved_srqs = hr_reg_read(resp_e, PF_CAPS_E_RSV_SRQS); 2209 2225 caps->reserved_lkey = hr_reg_read(resp_e, PF_CAPS_E_RSV_LKEYS); 2210 2226 ··· 6632 6646 .query_cqc = hns_roce_v2_query_cqc, 6633 6647 .query_qpc = hns_roce_v2_query_qpc, 6634 6648 .query_mpt = hns_roce_v2_query_mpt, 6649 + .query_hw_counter = hns_roce_hw_v2_query_counter, 6635 6650 .hns_roce_dev_ops = &hns_roce_v2_dev_ops, 6636 6651 .hns_roce_dev_srq_ops = &hns_roce_v2_dev_srq_ops, 6637 6652 }; ··· 6709 6722 ret = hns_roce_init(hr_dev); 6710 6723 if (ret) { 6711 6724 dev_err(hr_dev->dev, "RoCE Engine init failed!\n"); 6712 - goto error_failed_cfg; 6725 + goto error_failed_roce_init; 6713 6726 } 6714 6727 6715 6728 if (hr_dev->pci_dev->revision == PCI_REVISION_ID_HIP08) { 6716 6729 ret = free_mr_init(hr_dev); 6717 6730 if (ret) { 6718 6731 dev_err(hr_dev->dev, "failed to init free mr!\n"); 6719 - goto error_failed_roce_init; 6732 + goto error_failed_free_mr_init; 6720 6733 } 6721 6734 } 6722 6735 ··· 6724 6737 6725 6738 return 0; 6726 6739 6727 - error_failed_roce_init: 6740 + error_failed_free_mr_init: 6728 6741 hns_roce_exit(hr_dev); 6729 6742 6730 - error_failed_cfg: 6743 + error_failed_roce_init: 6731 6744 kfree(hr_dev->priv); 6732 6745 6733 6746 error_failed_kzalloc:
+3 -11
drivers/infiniband/hw/hns/hns_roce_hw_v2.h
··· 42 42 #define HNS_ROCE_V2_MAX_SRQWQE_SEGS 0x1000000 43 43 #define HNS_ROCE_V2_MAX_IDX_SEGS 0x1000000 44 44 #define HNS_ROCE_V2_MAX_XRCD_NUM 0x1000000 45 - #define HNS_ROCE_V2_RSV_XRCD_NUM 0 46 45 47 46 #define HNS_ROCE_V2_QP_ACK_TIMEOUT_OFS_HIP08 10 48 47 ··· 198 199 HNS_ROCE_OPC_QUERY_HW_VER = 0x8000, 199 200 HNS_ROCE_OPC_CFG_GLOBAL_PARAM = 0x8001, 200 201 HNS_ROCE_OPC_ALLOC_PF_RES = 0x8004, 202 + HNS_ROCE_OPC_QUERY_COUNTER = 0x8206, 201 203 HNS_ROCE_OPC_QUERY_PF_RES = 0x8400, 202 204 HNS_ROCE_OPC_ALLOC_VF_RES = 0x8401, 203 205 HNS_ROCE_OPC_CFG_EXT_LLM = 0x8403, ··· 220 220 HNS_ROCE_OPC_QUERY_VF_RES = 0x850e, 221 221 HNS_ROCE_OPC_CFG_GMV_TBL = 0x850f, 222 222 HNS_ROCE_OPC_CFG_GMV_BT = 0x8510, 223 - HNS_ROCE_OPC_EXT_CFG = 0x8512, 224 223 HNS_ROCE_QUERY_RAM_ECC = 0x8513, 225 224 HNS_SWITCH_PARAMETER_CFG = 0x1033, 226 225 }; ··· 956 957 #define HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_INTERVAL 40 957 958 #define HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_FAIL_WAIT 20 958 959 959 - /* Fields of HNS_ROCE_OPC_EXT_CFG */ 960 - #define EXT_CFG_VF_ID CMQ_REQ_FIELD_LOC(31, 0) 961 - #define EXT_CFG_QP_PI_IDX CMQ_REQ_FIELD_LOC(45, 32) 962 - #define EXT_CFG_QP_PI_NUM CMQ_REQ_FIELD_LOC(63, 48) 963 - #define EXT_CFG_QP_NUM CMQ_REQ_FIELD_LOC(87, 64) 964 - #define EXT_CFG_QP_IDX CMQ_REQ_FIELD_LOC(119, 96) 965 - #define EXT_CFG_LLM_IDX CMQ_REQ_FIELD_LOC(139, 128) 966 - #define EXT_CFG_LLM_NUM CMQ_REQ_FIELD_LOC(156, 144) 967 - 968 960 #define CFG_LLM_A_BA_L CMQ_REQ_FIELD_LOC(31, 0) 969 961 #define CFG_LLM_A_BA_H CMQ_REQ_FIELD_LOC(63, 32) 970 962 #define CFG_LLM_A_DEPTH CMQ_REQ_FIELD_LOC(76, 64) ··· 1192 1202 #define PF_CAPS_C_NUM_CQS PF_CAPS_C_FIELD_LOC(51, 32) 1193 1203 #define PF_CAPS_C_MAX_GID PF_CAPS_C_FIELD_LOC(60, 52) 1194 1204 #define PF_CAPS_C_CQ_DEPTH PF_CAPS_C_FIELD_LOC(86, 64) 1205 + #define PF_CAPS_C_NUM_XRCDS PF_CAPS_C_FIELD_LOC(91, 87) 1195 1206 #define PF_CAPS_C_NUM_MRWS PF_CAPS_C_FIELD_LOC(115, 96) 1196 1207 #define PF_CAPS_C_NUM_QPS PF_CAPS_C_FIELD_LOC(147, 128) 1197 1208 #define PF_CAPS_C_MAX_ORD PF_CAPS_C_FIELD_LOC(155, 148) ··· 1251 1260 #define PF_CAPS_E_RSV_MRWS PF_CAPS_E_FIELD_LOC(19, 0) 1252 1261 #define PF_CAPS_E_CHUNK_SIZE_SHIFT PF_CAPS_E_FIELD_LOC(31, 20) 1253 1262 #define PF_CAPS_E_RSV_CQS PF_CAPS_E_FIELD_LOC(51, 32) 1263 + #define PF_CAPS_E_RSV_XRCDS PF_CAPS_E_FIELD_LOC(63, 52) 1254 1264 #define PF_CAPS_E_RSV_SRQS PF_CAPS_E_FIELD_LOC(83, 64) 1255 1265 #define PF_CAPS_E_RSV_LKEYS PF_CAPS_E_FIELD_LOC(115, 96) 1256 1266
+84 -2
drivers/infiniband/hw/hns/hns_roce_main.c
··· 219 219 unsigned long flags; 220 220 enum ib_mtu mtu; 221 221 u32 port; 222 + int ret; 222 223 223 224 port = port_num - 1; 224 225 ··· 232 231 IB_PORT_BOOT_MGMT_SUP; 233 232 props->max_msg_sz = HNS_ROCE_MAX_MSG_LEN; 234 233 props->pkey_tbl_len = 1; 235 - props->active_width = IB_WIDTH_4X; 236 - props->active_speed = 1; 234 + ret = ib_get_eth_speed(ib_dev, port_num, &props->active_speed, 235 + &props->active_width); 236 + if (ret) 237 + ibdev_warn(ib_dev, "failed to get speed, ret = %d.\n", ret); 237 238 238 239 spin_lock_irqsave(&hr_dev->iboe.lock, flags); 239 240 ··· 515 512 sub_minor); 516 513 } 517 514 515 + #define HNS_ROCE_HW_CNT(ename, cname) \ 516 + [HNS_ROCE_HW_##ename##_CNT].name = cname 517 + 518 + static const struct rdma_stat_desc hns_roce_port_stats_descs[] = { 519 + HNS_ROCE_HW_CNT(RX_RC_PKT, "rx_rc_pkt"), 520 + HNS_ROCE_HW_CNT(RX_UC_PKT, "rx_uc_pkt"), 521 + HNS_ROCE_HW_CNT(RX_UD_PKT, "rx_ud_pkt"), 522 + HNS_ROCE_HW_CNT(RX_XRC_PKT, "rx_xrc_pkt"), 523 + HNS_ROCE_HW_CNT(RX_PKT, "rx_pkt"), 524 + HNS_ROCE_HW_CNT(RX_ERR_PKT, "rx_err_pkt"), 525 + HNS_ROCE_HW_CNT(RX_CNP_PKT, "rx_cnp_pkt"), 526 + HNS_ROCE_HW_CNT(TX_RC_PKT, "tx_rc_pkt"), 527 + HNS_ROCE_HW_CNT(TX_UC_PKT, "tx_uc_pkt"), 528 + HNS_ROCE_HW_CNT(TX_UD_PKT, "tx_ud_pkt"), 529 + HNS_ROCE_HW_CNT(TX_XRC_PKT, "tx_xrc_pkt"), 530 + HNS_ROCE_HW_CNT(TX_PKT, "tx_pkt"), 531 + HNS_ROCE_HW_CNT(TX_ERR_PKT, "tx_err_pkt"), 532 + HNS_ROCE_HW_CNT(TX_CNP_PKT, "tx_cnp_pkt"), 533 + HNS_ROCE_HW_CNT(TRP_GET_MPT_ERR_PKT, "trp_get_mpt_err_pkt"), 534 + HNS_ROCE_HW_CNT(TRP_GET_IRRL_ERR_PKT, "trp_get_irrl_err_pkt"), 535 + HNS_ROCE_HW_CNT(ECN_DB, "ecn_doorbell"), 536 + HNS_ROCE_HW_CNT(RX_BUF, "rx_buffer"), 537 + HNS_ROCE_HW_CNT(TRP_RX_SOF, "trp_rx_sof"), 538 + HNS_ROCE_HW_CNT(CQ_CQE, "cq_cqe"), 539 + HNS_ROCE_HW_CNT(CQ_POE, "cq_poe"), 540 + HNS_ROCE_HW_CNT(CQ_NOTIFY, "cq_notify"), 541 + }; 542 + 543 + static struct rdma_hw_stats *hns_roce_alloc_hw_port_stats( 544 + struct ib_device *device, u32 port_num) 545 + { 546 + struct hns_roce_dev *hr_dev = to_hr_dev(device); 547 + u32 port = port_num - 1; 548 + 549 + if (port > hr_dev->caps.num_ports) { 550 + ibdev_err(device, "invalid port num.\n"); 551 + return NULL; 552 + } 553 + 554 + if (hr_dev->pci_dev->revision <= PCI_REVISION_ID_HIP08 || 555 + hr_dev->is_vf) 556 + return NULL; 557 + 558 + return rdma_alloc_hw_stats_struct(hns_roce_port_stats_descs, 559 + ARRAY_SIZE(hns_roce_port_stats_descs), 560 + RDMA_HW_STATS_DEFAULT_LIFESPAN); 561 + } 562 + 563 + static int hns_roce_get_hw_stats(struct ib_device *device, 564 + struct rdma_hw_stats *stats, 565 + u32 port, int index) 566 + { 567 + struct hns_roce_dev *hr_dev = to_hr_dev(device); 568 + int num_counters = HNS_ROCE_HW_CNT_TOTAL; 569 + int ret; 570 + 571 + if (port == 0) 572 + return 0; 573 + 574 + if (port > hr_dev->caps.num_ports) 575 + return -EINVAL; 576 + 577 + if (hr_dev->pci_dev->revision <= PCI_REVISION_ID_HIP08 || 578 + hr_dev->is_vf) 579 + return -EOPNOTSUPP; 580 + 581 + ret = hr_dev->hw->query_hw_counter(hr_dev, stats->value, port, 582 + &num_counters); 583 + if (ret) { 584 + ibdev_err(device, "failed to query hw counter, ret = %d\n", 585 + ret); 586 + return ret; 587 + } 588 + 589 + return num_counters; 590 + } 591 + 518 592 static void hns_roce_unregister_device(struct hns_roce_dev *hr_dev) 519 593 { 520 594 struct hns_roce_ib_iboe *iboe = &hr_dev->iboe; ··· 634 554 .query_pkey = hns_roce_query_pkey, 635 555 .query_port = hns_roce_query_port, 636 556 .reg_user_mr = hns_roce_reg_user_mr, 557 + .alloc_hw_port_stats = hns_roce_alloc_hw_port_stats, 558 + .get_hw_stats = hns_roce_get_hw_stats, 637 559 638 560 INIT_RDMA_OBJ_SIZE(ib_ah, hns_roce_ah, ibah), 639 561 INIT_RDMA_OBJ_SIZE(ib_cq, hns_roce_cq, ib_cq),
+22 -6
drivers/infiniband/hw/hns/hns_roce_qp.c
··· 170 170 } 171 171 } 172 172 173 - static u8 get_least_load_bankid_for_qp(struct hns_roce_bank *bank) 173 + static u8 get_affinity_cq_bank(u8 qp_bank) 174 174 { 175 - u32 least_load = bank[0].inuse; 175 + return (qp_bank >> 1) & CQ_BANKID_MASK; 176 + } 177 + 178 + static u8 get_least_load_bankid_for_qp(struct ib_qp_init_attr *init_attr, 179 + struct hns_roce_bank *bank) 180 + { 181 + #define INVALID_LOAD_QPNUM 0xFFFFFFFF 182 + struct ib_cq *scq = init_attr->send_cq; 183 + u32 least_load = INVALID_LOAD_QPNUM; 184 + unsigned long cqn = 0; 176 185 u8 bankid = 0; 177 186 u32 bankcnt; 178 187 u8 i; 179 188 180 - for (i = 1; i < HNS_ROCE_QP_BANK_NUM; i++) { 189 + if (scq) 190 + cqn = to_hr_cq(scq)->cqn; 191 + 192 + for (i = 0; i < HNS_ROCE_QP_BANK_NUM; i++) { 193 + if (scq && (get_affinity_cq_bank(i) != (cqn & CQ_BANKID_MASK))) 194 + continue; 195 + 181 196 bankcnt = bank[i].inuse; 182 197 if (bankcnt < least_load) { 183 198 least_load = bankcnt; ··· 224 209 225 210 return 0; 226 211 } 227 - static int alloc_qpn(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp) 212 + static int alloc_qpn(struct hns_roce_dev *hr_dev, struct hns_roce_qp *hr_qp, 213 + struct ib_qp_init_attr *init_attr) 228 214 { 229 215 struct hns_roce_qp_table *qp_table = &hr_dev->qp_table; 230 216 unsigned long num = 0; ··· 236 220 num = 1; 237 221 } else { 238 222 mutex_lock(&qp_table->bank_mutex); 239 - bankid = get_least_load_bankid_for_qp(qp_table->bank); 223 + bankid = get_least_load_bankid_for_qp(init_attr, qp_table->bank); 240 224 241 225 ret = alloc_qpn_with_bankid(&qp_table->bank[bankid], bankid, 242 226 &num); ··· 1098 1082 goto err_buf; 1099 1083 } 1100 1084 1101 - ret = alloc_qpn(hr_dev, hr_qp); 1085 + ret = alloc_qpn(hr_dev, hr_qp, init_attr); 1102 1086 if (ret) { 1103 1087 ibdev_err(ibdev, "failed to alloc QPN, ret = %d.\n", ret); 1104 1088 goto err_qpn;
+3 -72
drivers/infiniband/hw/hns/hns_roce_restrack.c
··· 9 9 #include "hns_roce_device.h" 10 10 #include "hns_roce_hw_v2.h" 11 11 12 - #define MAX_ENTRY_NUM 256 13 - 14 12 int hns_roce_fill_res_cq_entry(struct sk_buff *msg, struct ib_cq *ib_cq) 15 13 { 16 14 struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq); ··· 45 47 struct hns_roce_dev *hr_dev = to_hr_dev(ib_cq->device); 46 48 struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq); 47 49 struct hns_roce_v2_cq_context context; 48 - u32 data[MAX_ENTRY_NUM] = {}; 49 - int offset = 0; 50 50 int ret; 51 51 52 52 if (!hr_dev->hw->query_cqc) ··· 54 58 if (ret) 55 59 return -EINVAL; 56 60 57 - data[offset++] = hr_reg_read(&context, CQC_CQ_ST); 58 - data[offset++] = hr_reg_read(&context, CQC_SHIFT); 59 - data[offset++] = hr_reg_read(&context, CQC_CQE_SIZE); 60 - data[offset++] = hr_reg_read(&context, CQC_CQE_CNT); 61 - data[offset++] = hr_reg_read(&context, CQC_CQ_PRODUCER_IDX); 62 - data[offset++] = hr_reg_read(&context, CQC_CQ_CONSUMER_IDX); 63 - data[offset++] = hr_reg_read(&context, CQC_DB_RECORD_EN); 64 - data[offset++] = hr_reg_read(&context, CQC_ARM_ST); 65 - data[offset++] = hr_reg_read(&context, CQC_CMD_SN); 66 - data[offset++] = hr_reg_read(&context, CQC_CEQN); 67 - data[offset++] = hr_reg_read(&context, CQC_CQ_MAX_CNT); 68 - data[offset++] = hr_reg_read(&context, CQC_CQ_PERIOD); 69 - data[offset++] = hr_reg_read(&context, CQC_CQE_HOP_NUM); 70 - data[offset++] = hr_reg_read(&context, CQC_CQE_BAR_PG_SZ); 71 - data[offset++] = hr_reg_read(&context, CQC_CQE_BUF_PG_SZ); 72 - 73 - ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, offset * sizeof(u32), data); 61 + ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, sizeof(context), &context); 74 62 75 63 return ret; 76 64 } ··· 98 118 struct hns_roce_dev *hr_dev = to_hr_dev(ib_qp->device); 99 119 struct hns_roce_qp *hr_qp = to_hr_qp(ib_qp); 100 120 struct hns_roce_v2_qp_context context; 101 - u32 data[MAX_ENTRY_NUM] = {}; 102 - int offset = 0; 103 121 int ret; 104 122 105 123 if (!hr_dev->hw->query_qpc) ··· 107 129 if (ret) 108 130 return -EINVAL; 109 131 110 - data[offset++] = hr_reg_read(&context, QPC_QP_ST); 111 - data[offset++] = hr_reg_read(&context, QPC_ERR_TYPE); 112 - data[offset++] = hr_reg_read(&context, QPC_CHECK_FLG); 113 - data[offset++] = hr_reg_read(&context, QPC_SRQ_EN); 114 - data[offset++] = hr_reg_read(&context, QPC_SRQN); 115 - data[offset++] = hr_reg_read(&context, QPC_QKEY_XRCD); 116 - data[offset++] = hr_reg_read(&context, QPC_TX_CQN); 117 - data[offset++] = hr_reg_read(&context, QPC_RX_CQN); 118 - data[offset++] = hr_reg_read(&context, QPC_SQ_PRODUCER_IDX); 119 - data[offset++] = hr_reg_read(&context, QPC_SQ_CONSUMER_IDX); 120 - data[offset++] = hr_reg_read(&context, QPC_RQ_RECORD_EN); 121 - data[offset++] = hr_reg_read(&context, QPC_RQ_PRODUCER_IDX); 122 - data[offset++] = hr_reg_read(&context, QPC_RQ_CONSUMER_IDX); 123 - data[offset++] = hr_reg_read(&context, QPC_SQ_SHIFT); 124 - data[offset++] = hr_reg_read(&context, QPC_RQWS); 125 - data[offset++] = hr_reg_read(&context, QPC_RQ_SHIFT); 126 - data[offset++] = hr_reg_read(&context, QPC_SGE_SHIFT); 127 - data[offset++] = hr_reg_read(&context, QPC_SQ_HOP_NUM); 128 - data[offset++] = hr_reg_read(&context, QPC_RQ_HOP_NUM); 129 - data[offset++] = hr_reg_read(&context, QPC_SGE_HOP_NUM); 130 - data[offset++] = hr_reg_read(&context, QPC_WQE_SGE_BA_PG_SZ); 131 - data[offset++] = hr_reg_read(&context, QPC_WQE_SGE_BUF_PG_SZ); 132 - data[offset++] = hr_reg_read(&context, QPC_RETRY_NUM_INIT); 133 - data[offset++] = hr_reg_read(&context, QPC_RETRY_CNT); 134 - data[offset++] = hr_reg_read(&context, QPC_SQ_CUR_PSN); 135 - data[offset++] = hr_reg_read(&context, QPC_SQ_MAX_PSN); 136 - data[offset++] = hr_reg_read(&context, QPC_SQ_FLUSH_IDX); 137 - data[offset++] = hr_reg_read(&context, QPC_SQ_MAX_IDX); 138 - data[offset++] = hr_reg_read(&context, QPC_SQ_TX_ERR); 139 - data[offset++] = hr_reg_read(&context, QPC_SQ_RX_ERR); 140 - data[offset++] = hr_reg_read(&context, QPC_RQ_RX_ERR); 141 - data[offset++] = hr_reg_read(&context, QPC_RQ_TX_ERR); 142 - data[offset++] = hr_reg_read(&context, QPC_RQ_CQE_IDX); 143 - data[offset++] = hr_reg_read(&context, QPC_RQ_RTY_TX_ERR); 144 - 145 - ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, offset * sizeof(u32), data); 132 + ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, sizeof(context), &context); 146 133 147 134 return ret; 148 135 } ··· 147 204 struct hns_roce_dev *hr_dev = to_hr_dev(ib_mr->device); 148 205 struct hns_roce_mr *hr_mr = to_hr_mr(ib_mr); 149 206 struct hns_roce_v2_mpt_entry context; 150 - u32 data[MAX_ENTRY_NUM] = {}; 151 - int offset = 0; 152 207 int ret; 153 208 154 209 if (!hr_dev->hw->query_mpt) ··· 156 215 if (ret) 157 216 return -EINVAL; 158 217 159 - data[offset++] = hr_reg_read(&context, MPT_ST); 160 - data[offset++] = hr_reg_read(&context, MPT_PD); 161 - data[offset++] = hr_reg_read(&context, MPT_LKEY); 162 - data[offset++] = hr_reg_read(&context, MPT_LEN_L); 163 - data[offset++] = hr_reg_read(&context, MPT_LEN_H); 164 - data[offset++] = hr_reg_read(&context, MPT_PBL_SIZE); 165 - data[offset++] = hr_reg_read(&context, MPT_PBL_HOP_NUM); 166 - data[offset++] = hr_reg_read(&context, MPT_PBL_BA_PG_SZ); 167 - data[offset++] = hr_reg_read(&context, MPT_PBL_BUF_PG_SZ); 168 - 169 - ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, offset * sizeof(u32), data); 218 + ret = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, sizeof(context), &context); 170 219 171 220 return ret; 172 221 }
+73 -17
drivers/infiniband/hw/irdma/cm.c
··· 1555 1555 return ret; 1556 1556 } 1557 1557 1558 + static u8 irdma_iw_get_vlan_prio(u32 *loc_addr, u8 prio, bool ipv4) 1559 + { 1560 + struct net_device *ndev = NULL; 1561 + 1562 + rcu_read_lock(); 1563 + if (ipv4) { 1564 + ndev = ip_dev_find(&init_net, htonl(loc_addr[0])); 1565 + } else if (IS_ENABLED(CONFIG_IPV6)) { 1566 + struct net_device *ip_dev; 1567 + struct in6_addr laddr6; 1568 + 1569 + irdma_copy_ip_htonl(laddr6.in6_u.u6_addr32, loc_addr); 1570 + 1571 + for_each_netdev_rcu (&init_net, ip_dev) { 1572 + if (ipv6_chk_addr(&init_net, &laddr6, ip_dev, 1)) { 1573 + ndev = ip_dev; 1574 + break; 1575 + } 1576 + } 1577 + } 1578 + 1579 + if (!ndev) 1580 + goto done; 1581 + if (is_vlan_dev(ndev)) 1582 + prio = (vlan_dev_get_egress_qos_mask(ndev, prio) & VLAN_PRIO_MASK) 1583 + >> VLAN_PRIO_SHIFT; 1584 + if (ipv4) 1585 + dev_put(ndev); 1586 + 1587 + done: 1588 + rcu_read_unlock(); 1589 + 1590 + return prio; 1591 + } 1592 + 1558 1593 /** 1559 - * irdma_netdev_vlan_ipv6 - Gets the netdev and mac 1594 + * irdma_get_vlan_mac_ipv6 - Gets the vlan and mac 1560 1595 * @addr: local IPv6 address 1561 1596 * @vlan_id: vlan id for the given IPv6 address 1562 1597 * @mac: mac address for the given IPv6 address 1563 1598 * 1564 - * Returns the net_device of the IPv6 address and also sets the 1565 - * vlan id and mac for that address. 1599 + * Returns the vlan id and mac for an IPv6 address. 1566 1600 */ 1567 - struct net_device *irdma_netdev_vlan_ipv6(u32 *addr, u16 *vlan_id, u8 *mac) 1601 + void irdma_get_vlan_mac_ipv6(u32 *addr, u16 *vlan_id, u8 *mac) 1568 1602 { 1569 1603 struct net_device *ip_dev = NULL; 1570 1604 struct in6_addr laddr6; 1571 1605 1572 1606 if (!IS_ENABLED(CONFIG_IPV6)) 1573 - return NULL; 1607 + return; 1574 1608 1575 1609 irdma_copy_ip_htonl(laddr6.in6_u.u6_addr32, addr); 1576 1610 if (vlan_id) ··· 1623 1589 } 1624 1590 } 1625 1591 rcu_read_unlock(); 1626 - 1627 - return ip_dev; 1628 1592 } 1629 1593 1630 1594 /** ··· 1699 1667 ifp->addr.in6_u.u6_addr32); 1700 1668 memcpy(cm_info->loc_addr, child_listen_node->loc_addr, 1701 1669 sizeof(cm_info->loc_addr)); 1670 + if (!iwdev->vsi.dscp_mode) 1671 + cm_info->user_pri = 1672 + irdma_iw_get_vlan_prio(child_listen_node->loc_addr, 1673 + cm_info->user_pri, 1674 + false); 1675 + 1702 1676 ret = irdma_manage_qhash(iwdev, cm_info, 1703 1677 IRDMA_QHASH_TYPE_TCP_SYN, 1704 1678 IRDMA_QHASH_MANAGE_TYPE_ADD, ··· 1789 1751 ntohl(ifa->ifa_address); 1790 1752 memcpy(cm_info->loc_addr, child_listen_node->loc_addr, 1791 1753 sizeof(cm_info->loc_addr)); 1754 + if (!iwdev->vsi.dscp_mode) 1755 + cm_info->user_pri = 1756 + irdma_iw_get_vlan_prio(child_listen_node->loc_addr, 1757 + cm_info->user_pri, 1758 + true); 1792 1759 ret = irdma_manage_qhash(iwdev, cm_info, 1793 1760 IRDMA_QHASH_TYPE_TCP_SYN, 1794 1761 IRDMA_QHASH_MANAGE_TYPE_ADD, ··· 2262 2219 } else { 2263 2220 cm_node->tos = max(listener->tos, cm_info->tos); 2264 2221 cm_node->user_pri = rt_tos2priority(cm_node->tos); 2222 + cm_node->user_pri = 2223 + irdma_iw_get_vlan_prio(cm_info->loc_addr, 2224 + cm_node->user_pri, 2225 + cm_info->ipv4); 2265 2226 } 2266 2227 ibdev_dbg(&iwdev->ibdev, 2267 2228 "DCB: listener: TOS:[%d] UP:[%d]\n", cm_node->tos, ··· 3624 3577 iwqp->ietf_mem.size, iwqp->ietf_mem.va, 3625 3578 iwqp->ietf_mem.pa); 3626 3579 iwqp->ietf_mem.va = NULL; 3627 - iwqp->ietf_mem.va = NULL; 3628 3580 } 3629 3581 } 3630 3582 ··· 3663 3617 cm_node->vlan_id = irdma_get_vlan_ipv4(cm_node->loc_addr); 3664 3618 } else { 3665 3619 cm_node->ipv4 = false; 3666 - irdma_netdev_vlan_ipv6(cm_node->loc_addr, &cm_node->vlan_id, 3667 - NULL); 3620 + irdma_get_vlan_mac_ipv6(cm_node->loc_addr, &cm_node->vlan_id, 3621 + NULL); 3668 3622 } 3669 3623 ibdev_dbg(&iwdev->ibdev, "CM: Accept vlan_id=%d\n", 3670 3624 cm_node->vlan_id); ··· 3872 3826 raddr6->sin6_addr.in6_u.u6_addr32); 3873 3827 cm_info.loc_port = ntohs(laddr6->sin6_port); 3874 3828 cm_info.rem_port = ntohs(raddr6->sin6_port); 3875 - irdma_netdev_vlan_ipv6(cm_info.loc_addr, &cm_info.vlan_id, 3876 - NULL); 3829 + irdma_get_vlan_mac_ipv6(cm_info.loc_addr, &cm_info.vlan_id, 3830 + NULL); 3877 3831 } 3878 3832 cm_info.cm_id = cm_id; 3879 3833 cm_info.qh_qpid = iwdev->vsi.ilq->qp_id; 3880 3834 cm_info.tos = cm_id->tos; 3881 - if (iwdev->vsi.dscp_mode) 3835 + if (iwdev->vsi.dscp_mode) { 3882 3836 cm_info.user_pri = 3883 3837 iwqp->sc_qp.vsi->dscp_map[irdma_tos2dscp(cm_info.tos)]; 3884 - else 3838 + } else { 3885 3839 cm_info.user_pri = rt_tos2priority(cm_id->tos); 3840 + cm_info.user_pri = irdma_iw_get_vlan_prio(cm_info.loc_addr, 3841 + cm_info.user_pri, 3842 + cm_info.ipv4); 3843 + } 3886 3844 3887 3845 if (iwqp->sc_qp.dev->ws_add(iwqp->sc_qp.vsi, cm_info.user_pri)) 3888 3846 return -ENOMEM; ··· 4002 3952 laddr6->sin6_addr.in6_u.u6_addr32); 4003 3953 cm_info.loc_port = ntohs(laddr6->sin6_port); 4004 3954 if (ipv6_addr_type(&laddr6->sin6_addr) != IPV6_ADDR_ANY) { 4005 - irdma_netdev_vlan_ipv6(cm_info.loc_addr, 4006 - &cm_info.vlan_id, NULL); 3955 + irdma_get_vlan_mac_ipv6(cm_info.loc_addr, 3956 + &cm_info.vlan_id, NULL); 4007 3957 } else { 4008 3958 cm_info.vlan_id = 0xFFFF; 4009 3959 wildcard = true; ··· 4030 3980 cm_listen_node->tos = cm_id->tos; 4031 3981 if (iwdev->vsi.dscp_mode) 4032 3982 cm_listen_node->user_pri = 4033 - iwdev->vsi.dscp_map[irdma_tos2dscp(cm_id->tos)]; 3983 + iwdev->vsi.dscp_map[irdma_tos2dscp(cm_id->tos)]; 4034 3984 else 4035 3985 cm_listen_node->user_pri = rt_tos2priority(cm_id->tos); 4036 3986 cm_info.user_pri = cm_listen_node->user_pri; ··· 4040 3990 if (err) 4041 3991 goto error; 4042 3992 } else { 3993 + if (!iwdev->vsi.dscp_mode) 3994 + cm_listen_node->user_pri = 3995 + irdma_iw_get_vlan_prio(cm_info.loc_addr, 3996 + cm_info.user_pri, 3997 + cm_info.ipv4); 3998 + cm_info.user_pri = cm_listen_node->user_pri; 4043 3999 err = irdma_manage_qhash(iwdev, &cm_info, 4044 4000 IRDMA_QHASH_TYPE_TCP_SYN, 4045 4001 IRDMA_QHASH_MANAGE_TYPE_ADD,
+10 -13
drivers/infiniband/hw/irdma/ctrl.c
··· 1061 1061 u64 hdr; 1062 1062 enum irdma_page_size page_size; 1063 1063 1064 + if (!info->total_len && !info->all_memory) 1065 + return -EINVAL; 1066 + 1064 1067 if (info->page_size == 0x40000000) 1065 1068 page_size = IRDMA_PAGE_SIZE_1G; 1066 1069 else if (info->page_size == 0x200000) ··· 1128 1125 bool remote_access; 1129 1126 u8 addr_type; 1130 1127 enum irdma_page_size page_size; 1128 + 1129 + if (!info->total_len && !info->all_memory) 1130 + return -EINVAL; 1131 1131 1132 1132 if (info->page_size == 0x40000000) 1133 1133 page_size = IRDMA_PAGE_SIZE_1G; ··· 1307 1301 1308 1302 sq_info.wr_id = info->wr_id; 1309 1303 sq_info.signaled = info->signaled; 1310 - sq_info.push_wqe = info->push_wqe; 1311 1304 1312 1305 wqe = irdma_qp_get_next_send_wqe(&qp->qp_uk, &wqe_idx, 1313 1306 IRDMA_QP_WQE_MIN_QUANTA, 0, &sq_info); ··· 1340 1335 FIELD_PREP(IRDMAQPSQ_HPAGESIZE, page_size) | 1341 1336 FIELD_PREP(IRDMAQPSQ_STAGRIGHTS, info->access_rights) | 1342 1337 FIELD_PREP(IRDMAQPSQ_VABASEDTO, info->addr_type) | 1343 - FIELD_PREP(IRDMAQPSQ_PUSHWQE, (sq_info.push_wqe ? 1 : 0)) | 1344 1338 FIELD_PREP(IRDMAQPSQ_READFENCE, info->read_fence) | 1345 1339 FIELD_PREP(IRDMAQPSQ_LOCALFENCE, info->local_fence) | 1346 1340 FIELD_PREP(IRDMAQPSQ_SIGCOMPL, info->signaled) | ··· 1350 1346 1351 1347 print_hex_dump_debug("WQE: FAST_REG WQE", DUMP_PREFIX_OFFSET, 16, 8, 1352 1348 wqe, IRDMA_QP_WQE_MIN_SIZE, false); 1353 - if (sq_info.push_wqe) { 1354 - irdma_qp_push_wqe(&qp->qp_uk, wqe, IRDMA_QP_WQE_MIN_QUANTA, 1355 - wqe_idx, post_sq); 1356 - } else { 1357 - if (post_sq) 1358 - irdma_uk_qp_post_wr(&qp->qp_uk); 1359 - } 1349 + 1350 + if (post_sq) 1351 + irdma_uk_qp_post_wr(&qp->qp_uk); 1360 1352 1361 1353 return 0; 1362 1354 } ··· 4007 4007 { 4008 4008 u64 temp, compl_ctx; 4009 4009 __le64 *aeqe; 4010 - u16 wqe_idx; 4011 4010 u8 ae_src; 4012 4011 u8 polarity; 4013 4012 ··· 4026 4027 aeqe, 16, false); 4027 4028 4028 4029 ae_src = (u8)FIELD_GET(IRDMA_AEQE_AESRC, temp); 4029 - wqe_idx = (u16)FIELD_GET(IRDMA_AEQE_WQDESCIDX, temp); 4030 + info->wqe_idx = (u16)FIELD_GET(IRDMA_AEQE_WQDESCIDX, temp); 4030 4031 info->qp_cq_id = (u32)FIELD_GET(IRDMA_AEQE_QPCQID_LOW, temp) | 4031 4032 ((u32)FIELD_GET(IRDMA_AEQE_QPCQID_HI, temp) << 18); 4032 4033 info->ae_id = (u16)FIELD_GET(IRDMA_AEQE_AECODE, temp); ··· 4109 4110 case IRDMA_AE_SOURCE_RQ_0011: 4110 4111 info->qp = true; 4111 4112 info->rq = true; 4112 - info->wqe_idx = wqe_idx; 4113 4113 info->compl_ctx = compl_ctx; 4114 4114 break; 4115 4115 case IRDMA_AE_SOURCE_CQ: ··· 4122 4124 case IRDMA_AE_SOURCE_SQ_0111: 4123 4125 info->qp = true; 4124 4126 info->sq = true; 4125 - info->wqe_idx = wqe_idx; 4126 4127 info->compl_ctx = compl_ctx; 4127 4128 break; 4128 4129 case IRDMA_AE_SOURCE_IN_RR_WR:
+40 -23
drivers/infiniband/hw/irdma/hw.c
··· 219 219 struct irdma_aeqe_info *info = &aeinfo; 220 220 int ret; 221 221 struct irdma_qp *iwqp = NULL; 222 - struct irdma_sc_cq *cq = NULL; 223 222 struct irdma_cq *iwcq = NULL; 224 223 struct irdma_sc_qp *qp = NULL; 225 224 struct irdma_qp_host_ctx_info *ctx_info = NULL; ··· 335 336 ibdev_err(&iwdev->ibdev, 336 337 "Processing an iWARP related AE for CQ misc = 0x%04X\n", 337 338 info->ae_id); 338 - cq = (struct irdma_sc_cq *)(unsigned long) 339 - info->compl_ctx; 340 339 341 - iwcq = cq->back_cq; 340 + spin_lock_irqsave(&rf->cqtable_lock, flags); 341 + iwcq = rf->cq_table[info->qp_cq_id]; 342 + if (!iwcq) { 343 + spin_unlock_irqrestore(&rf->cqtable_lock, 344 + flags); 345 + ibdev_dbg(to_ibdev(dev), 346 + "cq_id %d is already freed\n", info->qp_cq_id); 347 + continue; 348 + } 349 + irdma_cq_add_ref(&iwcq->ibcq); 350 + spin_unlock_irqrestore(&rf->cqtable_lock, flags); 342 351 343 352 if (iwcq->ibcq.event_handler) { 344 353 struct ib_event ibevent; ··· 357 350 iwcq->ibcq.event_handler(&ibevent, 358 351 iwcq->ibcq.cq_context); 359 352 } 353 + irdma_cq_rem_ref(&iwcq->ibcq); 360 354 break; 361 355 case IRDMA_AE_RESET_NOT_SENT: 362 356 case IRDMA_AE_LLP_DOUBT_REACHABILITY: ··· 571 563 /** 572 564 * irdma_destroy_cqp - destroy control qp 573 565 * @rf: RDMA PCI function 574 - * @free_hwcqp: 1 if hw cqp should be freed 575 566 * 576 567 * Issue destroy cqp request and 577 568 * free the resources associated with the cqp 578 569 */ 579 - static void irdma_destroy_cqp(struct irdma_pci_f *rf, bool free_hwcqp) 570 + static void irdma_destroy_cqp(struct irdma_pci_f *rf) 580 571 { 581 572 struct irdma_sc_dev *dev = &rf->sc_dev; 582 573 struct irdma_cqp *cqp = &rf->cqp; ··· 583 576 584 577 if (rf->cqp_cmpl_wq) 585 578 destroy_workqueue(rf->cqp_cmpl_wq); 586 - if (free_hwcqp) 587 - status = irdma_sc_cqp_destroy(dev->cqp); 579 + 580 + status = irdma_sc_cqp_destroy(dev->cqp); 588 581 if (status) 589 582 ibdev_dbg(to_ibdev(dev), "ERR: Destroy CQP failed %d\n", status); 590 583 ··· 928 921 929 922 cqp->scratch_array = kcalloc(sqsize, sizeof(*cqp->scratch_array), GFP_KERNEL); 930 923 if (!cqp->scratch_array) { 931 - kfree(cqp->cqp_requests); 932 - return -ENOMEM; 924 + status = -ENOMEM; 925 + goto err_scratch; 933 926 } 934 927 935 928 dev->cqp = &cqp->sc_cqp; ··· 939 932 cqp->sq.va = dma_alloc_coherent(dev->hw->device, cqp->sq.size, 940 933 &cqp->sq.pa, GFP_KERNEL); 941 934 if (!cqp->sq.va) { 942 - kfree(cqp->scratch_array); 943 - kfree(cqp->cqp_requests); 944 - return -ENOMEM; 935 + status = -ENOMEM; 936 + goto err_sq; 945 937 } 946 938 947 939 status = irdma_obj_aligned_mem(rf, &mem, sizeof(struct irdma_cqp_ctx), 948 940 IRDMA_HOST_CTX_ALIGNMENT_M); 949 941 if (status) 950 - goto exit; 942 + goto err_ctx; 951 943 952 944 dev->cqp->host_ctx_pa = mem.pa; 953 945 dev->cqp->host_ctx = mem.va; ··· 972 966 status = irdma_sc_cqp_init(dev->cqp, &cqp_init_info); 973 967 if (status) { 974 968 ibdev_dbg(to_ibdev(dev), "ERR: cqp init status %d\n", status); 975 - goto exit; 969 + goto err_ctx; 976 970 } 977 971 978 972 spin_lock_init(&cqp->req_lock); ··· 983 977 ibdev_dbg(to_ibdev(dev), 984 978 "ERR: cqp create failed - status %d maj_err %d min_err %d\n", 985 979 status, maj_err, min_err); 986 - goto exit; 980 + goto err_ctx; 987 981 } 988 982 989 983 INIT_LIST_HEAD(&cqp->cqp_avail_reqs); ··· 997 991 init_waitqueue_head(&cqp->remove_wq); 998 992 return 0; 999 993 1000 - exit: 1001 - irdma_destroy_cqp(rf, false); 994 + err_ctx: 995 + dma_free_coherent(dev->hw->device, cqp->sq.size, 996 + cqp->sq.va, cqp->sq.pa); 997 + cqp->sq.va = NULL; 998 + err_sq: 999 + kfree(cqp->scratch_array); 1000 + cqp->scratch_array = NULL; 1001 + err_scratch: 1002 + kfree(cqp->cqp_requests); 1003 + cqp->cqp_requests = NULL; 1002 1004 1003 1005 return status; 1004 1006 } ··· 1563 1549 1564 1550 kfree(dev->hmc_info->sd_table.sd_entry); 1565 1551 dev->hmc_info->sd_table.sd_entry = NULL; 1566 - kfree(rf->mem_rsrc); 1552 + vfree(rf->mem_rsrc); 1567 1553 rf->mem_rsrc = NULL; 1568 1554 dma_free_coherent(rf->hw.device, rf->obj_mem.size, rf->obj_mem.va, 1569 1555 rf->obj_mem.pa); ··· 1761 1747 rf->reset, rf->rdma_ver); 1762 1748 fallthrough; 1763 1749 case CQP_CREATED: 1764 - irdma_destroy_cqp(rf, true); 1750 + irdma_destroy_cqp(rf); 1765 1751 fallthrough; 1766 1752 case INITIAL_STATE: 1767 1753 irdma_del_init_mem(rf); ··· 1959 1945 rf->allocated_arps = &rf->allocated_mcgs[BITS_TO_LONGS(rf->max_mcg)]; 1960 1946 rf->qp_table = (struct irdma_qp **) 1961 1947 (&rf->allocated_arps[BITS_TO_LONGS(rf->arp_table_size)]); 1948 + rf->cq_table = (struct irdma_cq **)(&rf->qp_table[rf->max_qp]); 1962 1949 1963 1950 spin_lock_init(&rf->rsrc_lock); 1964 1951 spin_lock_init(&rf->arp_lock); 1965 1952 spin_lock_init(&rf->qptable_lock); 1953 + spin_lock_init(&rf->cqtable_lock); 1966 1954 spin_lock_init(&rf->qh_list_lock); 1967 1955 } 1968 1956 ··· 1985 1969 rsrc_size += sizeof(unsigned long) * BITS_TO_LONGS(rf->max_ah); 1986 1970 rsrc_size += sizeof(unsigned long) * BITS_TO_LONGS(rf->max_mcg); 1987 1971 rsrc_size += sizeof(struct irdma_qp **) * rf->max_qp; 1972 + rsrc_size += sizeof(struct irdma_cq **) * rf->max_cq; 1988 1973 1989 1974 return rsrc_size; 1990 1975 } ··· 2019 2002 rf->max_mcg = rf->max_qp; 2020 2003 2021 2004 rsrc_size = irdma_calc_mem_rsrc_size(rf); 2022 - rf->mem_rsrc = kzalloc(rsrc_size, GFP_KERNEL); 2005 + rf->mem_rsrc = vzalloc(rsrc_size); 2023 2006 if (!rf->mem_rsrc) { 2024 2007 ret = -ENOMEM; 2025 - goto mem_rsrc_kzalloc_fail; 2008 + goto mem_rsrc_vzalloc_fail; 2026 2009 } 2027 2010 2028 2011 rf->arp_table = (struct irdma_arp_entry *)rf->mem_rsrc; ··· 2050 2033 2051 2034 return 0; 2052 2035 2053 - mem_rsrc_kzalloc_fail: 2036 + mem_rsrc_vzalloc_fail: 2054 2037 bitmap_free(rf->allocated_ws_nodes); 2055 2038 rf->allocated_ws_nodes = NULL; 2056 2039
+1
drivers/infiniband/hw/irdma/i40iw_hw.c
··· 254 254 dev->hw_attrs.max_stat_idx = IRDMA_HW_STAT_INDEX_MAX_GEN_1; 255 255 dev->hw_attrs.max_hw_outbound_msg_size = I40IW_MAX_OUTBOUND_MSG_SIZE; 256 256 dev->hw_attrs.max_hw_inbound_msg_size = I40IW_MAX_INBOUND_MSG_SIZE; 257 + dev->hw_attrs.uk_attrs.min_hw_wq_size = I40IW_MIN_WQ_SIZE; 257 258 dev->hw_attrs.max_qp_wr = I40IW_MAX_QP_WRS; 258 259 }
+1 -1
drivers/infiniband/hw/irdma/i40iw_hw.h
··· 140 140 I40IW_MAX_CQ_SIZE = 1048575, 141 141 I40IW_MAX_OUTBOUND_MSG_SIZE = 2147483647, 142 142 I40IW_MAX_INBOUND_MSG_SIZE = 2147483647, 143 + I40IW_MIN_WQ_SIZE = 4 /* WQEs */, 143 144 }; 144 145 145 146 #define I40IW_QP_WQE_MIN_SIZE 32 146 147 #define I40IW_QP_WQE_MAX_SIZE 128 147 - #define I40IW_QP_SW_MIN_WQSIZE 4 148 148 #define I40IW_MAX_RQ_WQE_SHIFT 2 149 149 #define I40IW_MAX_QUANTA_PER_WR 2 150 150
+1
drivers/infiniband/hw/irdma/icrdma_hw.c
··· 195 195 dev->hw_attrs.max_stat_inst = ICRDMA_MAX_STATS_COUNT; 196 196 dev->hw_attrs.max_stat_idx = IRDMA_HW_STAT_INDEX_MAX_GEN_2; 197 197 198 + dev->hw_attrs.uk_attrs.min_hw_wq_size = ICRDMA_MIN_WQ_SIZE; 198 199 dev->hw_attrs.uk_attrs.max_hw_sq_chunk = IRDMA_MAX_QUANTA_PER_WR; 199 200 dev->hw_attrs.uk_attrs.feature_flags |= IRDMA_FEATURE_RTS_AE | 200 201 IRDMA_FEATURE_CQ_RESIZE;
+1
drivers/infiniband/hw/irdma/icrdma_hw.h
··· 64 64 65 65 ICRDMA_MAX_IRD_SIZE = 127, 66 66 ICRDMA_MAX_ORD_SIZE = 255, 67 + ICRDMA_MIN_WQ_SIZE = 8 /* WQEs */, 67 68 68 69 }; 69 70
+1
drivers/infiniband/hw/irdma/irdma.h
··· 119 119 u32 min_hw_cq_size; 120 120 u32 max_hw_cq_size; 121 121 u16 max_hw_sq_chunk; 122 + u16 min_hw_wq_size; 122 123 u8 hw_rev; 123 124 }; 124 125
+6 -2
drivers/infiniband/hw/irdma/main.h
··· 239 239 240 240 struct irdma_qvlist_info { 241 241 u32 num_vectors; 242 - struct irdma_qv_info qv_info[1]; 242 + struct irdma_qv_info qv_info[]; 243 243 }; 244 244 245 245 struct irdma_gen_ops { ··· 309 309 spinlock_t arp_lock; /*protect ARP table access*/ 310 310 spinlock_t rsrc_lock; /* protect HW resource array access */ 311 311 spinlock_t qptable_lock; /*protect QP table access*/ 312 + spinlock_t cqtable_lock; /*protect CQ table access*/ 312 313 struct irdma_qp **qp_table; 314 + struct irdma_cq **cq_table; 313 315 spinlock_t qh_list_lock; /* protect mc_qht_list */ 314 316 struct mc_table_list mc_qht_list; 315 317 struct irdma_msix_vector *iw_msixtbl; ··· 502 500 struct ib_udata *udata); 503 501 int irdma_modify_qp_roce(struct ib_qp *ibqp, struct ib_qp_attr *attr, 504 502 int attr_mask, struct ib_udata *udata); 503 + void irdma_cq_add_ref(struct ib_cq *ibcq); 504 + void irdma_cq_rem_ref(struct ib_cq *ibcq); 505 505 void irdma_cq_wq_destroy(struct irdma_pci_f *rf, struct irdma_sc_cq *cq); 506 506 507 507 void irdma_cleanup_pending_cqp_op(struct irdma_pci_f *rf); ··· 533 529 void irdma_copy_ip_ntohl(u32 *dst, __be32 *src); 534 530 void irdma_copy_ip_htonl(__be32 *dst, u32 *src); 535 531 u16 irdma_get_vlan_ipv4(u32 *addr); 536 - struct net_device *irdma_netdev_vlan_ipv6(u32 *addr, u16 *vlan_id, u8 *mac); 532 + void irdma_get_vlan_mac_ipv6(u32 *addr, u16 *vlan_id, u8 *mac); 537 533 struct ib_mr *irdma_reg_phys_mr(struct ib_pd *ib_pd, u64 addr, u64 size, 538 534 int acc, u64 *iova_start); 539 535 int irdma_upload_qp_context(struct irdma_qp *iwqp, bool freeze, bool raw);
+2 -1
drivers/infiniband/hw/irdma/type.h
··· 971 971 bool remote_access:1; 972 972 bool use_hmc_fcn_index:1; 973 973 bool use_pf_rid:1; 974 + bool all_memory:1; 974 975 u8 hmc_fcn_index; 975 976 }; 976 977 ··· 999 998 bool use_hmc_fcn_index:1; 1000 999 u8 hmc_fcn_index; 1001 1000 bool use_pf_rid:1; 1001 + bool all_memory:1; 1002 1002 }; 1003 1003 1004 1004 struct irdma_fast_reg_stag_info { ··· 1019 1017 bool local_fence:1; 1020 1018 bool read_fence:1; 1021 1019 bool signaled:1; 1022 - bool push_wqe:1; 1023 1020 bool use_hmc_fcn_index:1; 1024 1021 u8 hmc_fcn_index; 1025 1022 bool use_pf_rid:1;
+99 -119
drivers/infiniband/hw/irdma/uk.c
··· 127 127 hw_sq_tail = (u32)FIELD_GET(IRDMA_QP_DBSA_HW_SQ_TAIL, temp); 128 128 sw_sq_head = IRDMA_RING_CURRENT_HEAD(qp->sq_ring); 129 129 if (sw_sq_head != qp->initial_ring.head) { 130 - if (qp->push_dropped) { 131 - writel(qp->qp_id, qp->wqe_alloc_db); 132 - qp->push_dropped = false; 133 - } else if (sw_sq_head != hw_sq_tail) { 130 + if (sw_sq_head != hw_sq_tail) { 134 131 if (sw_sq_head > qp->initial_ring.head) { 135 132 if (hw_sq_tail >= qp->initial_ring.head && 136 133 hw_sq_tail < sw_sq_head) ··· 144 147 } 145 148 146 149 /** 147 - * irdma_qp_ring_push_db - ring qp doorbell 148 - * @qp: hw qp ptr 149 - * @wqe_idx: wqe index 150 - */ 151 - static void irdma_qp_ring_push_db(struct irdma_qp_uk *qp, u32 wqe_idx) 152 - { 153 - set_32bit_val(qp->push_db, 0, 154 - FIELD_PREP(IRDMA_WQEALLOC_WQE_DESC_INDEX, wqe_idx >> 3) | qp->qp_id); 155 - qp->initial_ring.head = qp->sq_ring.head; 156 - qp->push_mode = true; 157 - qp->push_dropped = false; 158 - } 159 - 160 - void irdma_qp_push_wqe(struct irdma_qp_uk *qp, __le64 *wqe, u16 quanta, 161 - u32 wqe_idx, bool post_sq) 162 - { 163 - __le64 *push; 164 - 165 - if (IRDMA_RING_CURRENT_HEAD(qp->initial_ring) != 166 - IRDMA_RING_CURRENT_TAIL(qp->sq_ring) && 167 - !qp->push_mode) { 168 - if (post_sq) 169 - irdma_uk_qp_post_wr(qp); 170 - } else { 171 - push = (__le64 *)((uintptr_t)qp->push_wqe + 172 - (wqe_idx & 0x7) * 0x20); 173 - memcpy(push, wqe, quanta * IRDMA_QP_WQE_MIN_SIZE); 174 - irdma_qp_ring_push_db(qp, wqe_idx); 175 - } 176 - } 177 - 178 - /** 179 150 * irdma_qp_get_next_send_wqe - pad with NOP if needed, return where next WR should go 180 151 * @qp: hw qp ptr 181 152 * @wqe_idx: return wqe index ··· 157 192 { 158 193 __le64 *wqe; 159 194 __le64 *wqe_0 = NULL; 160 - u32 nop_wqe_idx; 161 195 u16 avail_quanta; 162 196 u16 i; 163 197 ··· 173 209 IRDMA_SQ_RING_FREE_QUANTA(qp->sq_ring)) 174 210 return NULL; 175 211 176 - nop_wqe_idx = IRDMA_RING_CURRENT_HEAD(qp->sq_ring); 177 212 for (i = 0; i < avail_quanta; i++) { 178 213 irdma_nop_1(qp); 179 214 IRDMA_RING_MOVE_HEAD_NOCHECK(qp->sq_ring); 180 215 } 181 - if (qp->push_db && info->push_wqe) 182 - irdma_qp_push_wqe(qp, qp->sq_base[nop_wqe_idx].elem, 183 - avail_quanta, nop_wqe_idx, true); 184 216 } 185 217 186 218 *wqe_idx = IRDMA_RING_CURRENT_HEAD(qp->sq_ring); ··· 242 282 bool read_fence = false; 243 283 u16 quanta; 244 284 245 - info->push_wqe = qp->push_db ? true : false; 246 - 247 285 op_info = &info->op.rdma_write; 248 286 if (op_info->num_lo_sges > qp->max_sq_frag_cnt) 249 287 return -EINVAL; ··· 302 344 FIELD_PREP(IRDMAQPSQ_IMMDATAFLAG, info->imm_data_valid) | 303 345 FIELD_PREP(IRDMAQPSQ_REPORTRTT, info->report_rtt) | 304 346 FIELD_PREP(IRDMAQPSQ_ADDFRAGCNT, addl_frag_cnt) | 305 - FIELD_PREP(IRDMAQPSQ_PUSHWQE, info->push_wqe) | 306 347 FIELD_PREP(IRDMAQPSQ_READFENCE, read_fence) | 307 348 FIELD_PREP(IRDMAQPSQ_LOCALFENCE, info->local_fence) | 308 349 FIELD_PREP(IRDMAQPSQ_SIGCOMPL, info->signaled) | ··· 310 353 dma_wmb(); /* make sure WQE is populated before valid bit is set */ 311 354 312 355 set_64bit_val(wqe, 24, hdr); 313 - if (info->push_wqe) { 314 - irdma_qp_push_wqe(qp, wqe, quanta, wqe_idx, post_sq); 315 - } else { 316 - if (post_sq) 317 - irdma_uk_qp_post_wr(qp); 318 - } 356 + 357 + if (post_sq) 358 + irdma_uk_qp_post_wr(qp); 319 359 320 360 return 0; 321 361 } ··· 336 382 u32 wqe_idx; 337 383 u16 quanta; 338 384 u64 hdr; 339 - 340 - info->push_wqe = qp->push_db ? true : false; 341 385 342 386 op_info = &info->op.rdma_read; 343 387 if (qp->max_sq_frag_cnt < op_info->num_lo_sges) ··· 383 431 FIELD_PREP(IRDMAQPSQ_ADDFRAGCNT, addl_frag_cnt) | 384 432 FIELD_PREP(IRDMAQPSQ_OPCODE, 385 433 (inv_stag ? IRDMAQP_OP_RDMA_READ_LOC_INV : IRDMAQP_OP_RDMA_READ)) | 386 - FIELD_PREP(IRDMAQPSQ_PUSHWQE, info->push_wqe) | 387 434 FIELD_PREP(IRDMAQPSQ_READFENCE, info->read_fence) | 388 435 FIELD_PREP(IRDMAQPSQ_LOCALFENCE, local_fence) | 389 436 FIELD_PREP(IRDMAQPSQ_SIGCOMPL, info->signaled) | ··· 391 440 dma_wmb(); /* make sure WQE is populated before valid bit is set */ 392 441 393 442 set_64bit_val(wqe, 24, hdr); 394 - if (info->push_wqe) { 395 - irdma_qp_push_wqe(qp, wqe, quanta, wqe_idx, post_sq); 396 - } else { 397 - if (post_sq) 398 - irdma_uk_qp_post_wr(qp); 399 - } 443 + 444 + if (post_sq) 445 + irdma_uk_qp_post_wr(qp); 400 446 401 447 return 0; 402 448 } ··· 415 467 u32 frag_cnt, addl_frag_cnt; 416 468 bool read_fence = false; 417 469 u16 quanta; 418 - 419 - info->push_wqe = qp->push_db ? true : false; 420 470 421 471 op_info = &info->op.send; 422 472 if (qp->max_sq_frag_cnt < op_info->num_sges) ··· 476 530 FIELD_PREP(IRDMAQPSQ_REPORTRTT, (info->report_rtt ? 1 : 0)) | 477 531 FIELD_PREP(IRDMAQPSQ_OPCODE, info->op_type) | 478 532 FIELD_PREP(IRDMAQPSQ_ADDFRAGCNT, addl_frag_cnt) | 479 - FIELD_PREP(IRDMAQPSQ_PUSHWQE, info->push_wqe) | 480 533 FIELD_PREP(IRDMAQPSQ_READFENCE, read_fence) | 481 534 FIELD_PREP(IRDMAQPSQ_LOCALFENCE, info->local_fence) | 482 535 FIELD_PREP(IRDMAQPSQ_SIGCOMPL, info->signaled) | ··· 486 541 dma_wmb(); /* make sure WQE is populated before valid bit is set */ 487 542 488 543 set_64bit_val(wqe, 24, hdr); 489 - if (info->push_wqe) { 490 - irdma_qp_push_wqe(qp, wqe, quanta, wqe_idx, post_sq); 491 - } else { 492 - if (post_sq) 493 - irdma_uk_qp_post_wr(qp); 494 - } 544 + 545 + if (post_sq) 546 + irdma_uk_qp_post_wr(qp); 495 547 496 548 return 0; 497 549 } ··· 662 720 u32 i, total_size = 0; 663 721 u16 quanta; 664 722 665 - info->push_wqe = qp->push_db ? true : false; 666 723 op_info = &info->op.rdma_write; 667 724 668 725 if (unlikely(qp->max_sq_frag_cnt < op_info->num_lo_sges)) ··· 691 750 FIELD_PREP(IRDMAQPSQ_REPORTRTT, info->report_rtt ? 1 : 0) | 692 751 FIELD_PREP(IRDMAQPSQ_INLINEDATAFLAG, 1) | 693 752 FIELD_PREP(IRDMAQPSQ_IMMDATAFLAG, info->imm_data_valid ? 1 : 0) | 694 - FIELD_PREP(IRDMAQPSQ_PUSHWQE, info->push_wqe ? 1 : 0) | 695 753 FIELD_PREP(IRDMAQPSQ_READFENCE, read_fence) | 696 754 FIELD_PREP(IRDMAQPSQ_LOCALFENCE, info->local_fence) | 697 755 FIELD_PREP(IRDMAQPSQ_SIGCOMPL, info->signaled) | ··· 707 767 708 768 set_64bit_val(wqe, 24, hdr); 709 769 710 - if (info->push_wqe) { 711 - irdma_qp_push_wqe(qp, wqe, quanta, wqe_idx, post_sq); 712 - } else { 713 - if (post_sq) 714 - irdma_uk_qp_post_wr(qp); 715 - } 770 + if (post_sq) 771 + irdma_uk_qp_post_wr(qp); 716 772 717 773 return 0; 718 774 } ··· 730 794 u32 i, total_size = 0; 731 795 u16 quanta; 732 796 733 - info->push_wqe = qp->push_db ? true : false; 734 797 op_info = &info->op.send; 735 798 736 799 if (unlikely(qp->max_sq_frag_cnt < op_info->num_sges)) ··· 762 827 (info->imm_data_valid ? 1 : 0)) | 763 828 FIELD_PREP(IRDMAQPSQ_REPORTRTT, (info->report_rtt ? 1 : 0)) | 764 829 FIELD_PREP(IRDMAQPSQ_INLINEDATAFLAG, 1) | 765 - FIELD_PREP(IRDMAQPSQ_PUSHWQE, info->push_wqe) | 766 830 FIELD_PREP(IRDMAQPSQ_READFENCE, read_fence) | 767 831 FIELD_PREP(IRDMAQPSQ_LOCALFENCE, info->local_fence) | 768 832 FIELD_PREP(IRDMAQPSQ_SIGCOMPL, info->signaled) | ··· 779 845 780 846 set_64bit_val(wqe, 24, hdr); 781 847 782 - if (info->push_wqe) { 783 - irdma_qp_push_wqe(qp, wqe, quanta, wqe_idx, post_sq); 784 - } else { 785 - if (post_sq) 786 - irdma_uk_qp_post_wr(qp); 787 - } 848 + if (post_sq) 849 + irdma_uk_qp_post_wr(qp); 788 850 789 851 return 0; 790 852 } ··· 802 872 bool local_fence = false; 803 873 struct ib_sge sge = {}; 804 874 805 - info->push_wqe = qp->push_db ? true : false; 806 875 op_info = &info->op.inv_local_stag; 807 876 local_fence = info->local_fence; 808 877 ··· 818 889 set_64bit_val(wqe, 16, 0); 819 890 820 891 hdr = FIELD_PREP(IRDMAQPSQ_OPCODE, IRDMA_OP_TYPE_INV_STAG) | 821 - FIELD_PREP(IRDMAQPSQ_PUSHWQE, info->push_wqe) | 822 892 FIELD_PREP(IRDMAQPSQ_READFENCE, info->read_fence) | 823 893 FIELD_PREP(IRDMAQPSQ_LOCALFENCE, local_fence) | 824 894 FIELD_PREP(IRDMAQPSQ_SIGCOMPL, info->signaled) | ··· 827 899 828 900 set_64bit_val(wqe, 24, hdr); 829 901 830 - if (info->push_wqe) { 831 - irdma_qp_push_wqe(qp, wqe, IRDMA_QP_WQE_MIN_QUANTA, wqe_idx, 832 - post_sq); 833 - } else { 834 - if (post_sq) 835 - irdma_uk_qp_post_wr(qp); 836 - } 902 + if (post_sq) 903 + irdma_uk_qp_post_wr(qp); 837 904 838 905 return 0; 839 906 } ··· 1047 1124 1048 1125 info->q_type = (u8)FIELD_GET(IRDMA_CQ_SQ, qword3); 1049 1126 info->error = (bool)FIELD_GET(IRDMA_CQ_ERROR, qword3); 1050 - info->push_dropped = (bool)FIELD_GET(IRDMACQ_PSHDROP, qword3); 1051 1127 info->ipv4 = (bool)FIELD_GET(IRDMACQ_IPV4, qword3); 1052 1128 if (info->error) { 1053 1129 info->major_err = FIELD_GET(IRDMA_CQ_MAJERR, qword3); ··· 1134 1212 sizeof(struct irdma_cq_poll_info)); 1135 1213 return irdma_uk_cq_poll_cmpl(cq, info); 1136 1214 } 1137 - } 1138 - /*cease posting push mode on push drop*/ 1139 - if (info->push_dropped) { 1140 - qp->push_mode = false; 1141 - qp->push_dropped = true; 1142 1215 } 1143 1216 if (info->comp_status != IRDMA_COMPL_STATUS_FLUSHED) { 1144 1217 info->wr_id = qp->sq_wrtrk_array[wqe_idx].wrid; ··· 1266 1349 int irdma_get_sqdepth(struct irdma_uk_attrs *uk_attrs, u32 sq_size, u8 shift, 1267 1350 u32 *sqdepth) 1268 1351 { 1352 + u32 min_size = (u32)uk_attrs->min_hw_wq_size << shift; 1353 + 1269 1354 *sqdepth = irdma_qp_round_up((sq_size << shift) + IRDMA_SQ_RSVD); 1270 1355 1271 - if (*sqdepth < (IRDMA_QP_SW_MIN_WQSIZE << shift)) 1272 - *sqdepth = IRDMA_QP_SW_MIN_WQSIZE << shift; 1356 + if (*sqdepth < min_size) 1357 + *sqdepth = min_size; 1273 1358 else if (*sqdepth > uk_attrs->max_hw_wq_quanta) 1274 1359 return -EINVAL; 1275 1360 ··· 1288 1369 int irdma_get_rqdepth(struct irdma_uk_attrs *uk_attrs, u32 rq_size, u8 shift, 1289 1370 u32 *rqdepth) 1290 1371 { 1372 + u32 min_size = (u32)uk_attrs->min_hw_wq_size << shift; 1373 + 1291 1374 *rqdepth = irdma_qp_round_up((rq_size << shift) + IRDMA_RQ_RSVD); 1292 1375 1293 - if (*rqdepth < (IRDMA_QP_SW_MIN_WQSIZE << shift)) 1294 - *rqdepth = IRDMA_QP_SW_MIN_WQSIZE << shift; 1376 + if (*rqdepth < min_size) 1377 + *rqdepth = min_size; 1295 1378 else if (*rqdepth > uk_attrs->max_hw_rq_quanta) 1296 1379 return -EINVAL; 1297 1380 ··· 1336 1415 } 1337 1416 1338 1417 /** 1418 + * irdma_uk_calc_shift_wq - calculate WQE shift for both SQ and RQ 1419 + * @ukinfo: qp initialization info 1420 + * @sq_shift: Returns shift of SQ 1421 + * @rq_shift: Returns shift of RQ 1422 + */ 1423 + void irdma_uk_calc_shift_wq(struct irdma_qp_uk_init_info *ukinfo, u8 *sq_shift, 1424 + u8 *rq_shift) 1425 + { 1426 + bool imm_support = ukinfo->uk_attrs->hw_rev >= IRDMA_GEN_2; 1427 + 1428 + irdma_get_wqe_shift(ukinfo->uk_attrs, 1429 + imm_support ? ukinfo->max_sq_frag_cnt + 1 : 1430 + ukinfo->max_sq_frag_cnt, 1431 + ukinfo->max_inline_data, sq_shift); 1432 + 1433 + irdma_get_wqe_shift(ukinfo->uk_attrs, ukinfo->max_rq_frag_cnt, 0, 1434 + rq_shift); 1435 + 1436 + if (ukinfo->uk_attrs->hw_rev == IRDMA_GEN_1) { 1437 + if (ukinfo->abi_ver > 4) 1438 + *rq_shift = IRDMA_MAX_RQ_WQE_SHIFT_GEN1; 1439 + } 1440 + } 1441 + 1442 + /** 1443 + * irdma_uk_calc_depth_shift_sq - calculate depth and shift for SQ size. 1444 + * @ukinfo: qp initialization info 1445 + * @sq_depth: Returns depth of SQ 1446 + * @sq_shift: Returns shift of SQ 1447 + */ 1448 + int irdma_uk_calc_depth_shift_sq(struct irdma_qp_uk_init_info *ukinfo, 1449 + u32 *sq_depth, u8 *sq_shift) 1450 + { 1451 + bool imm_support = ukinfo->uk_attrs->hw_rev >= IRDMA_GEN_2; 1452 + int status; 1453 + 1454 + irdma_get_wqe_shift(ukinfo->uk_attrs, 1455 + imm_support ? ukinfo->max_sq_frag_cnt + 1 : 1456 + ukinfo->max_sq_frag_cnt, 1457 + ukinfo->max_inline_data, sq_shift); 1458 + status = irdma_get_sqdepth(ukinfo->uk_attrs, ukinfo->sq_size, 1459 + *sq_shift, sq_depth); 1460 + 1461 + return status; 1462 + } 1463 + 1464 + /** 1465 + * irdma_uk_calc_depth_shift_rq - calculate depth and shift for RQ size. 1466 + * @ukinfo: qp initialization info 1467 + * @rq_depth: Returns depth of RQ 1468 + * @rq_shift: Returns shift of RQ 1469 + */ 1470 + int irdma_uk_calc_depth_shift_rq(struct irdma_qp_uk_init_info *ukinfo, 1471 + u32 *rq_depth, u8 *rq_shift) 1472 + { 1473 + int status; 1474 + 1475 + irdma_get_wqe_shift(ukinfo->uk_attrs, ukinfo->max_rq_frag_cnt, 0, 1476 + rq_shift); 1477 + 1478 + if (ukinfo->uk_attrs->hw_rev == IRDMA_GEN_1) { 1479 + if (ukinfo->abi_ver > 4) 1480 + *rq_shift = IRDMA_MAX_RQ_WQE_SHIFT_GEN1; 1481 + } 1482 + 1483 + status = irdma_get_rqdepth(ukinfo->uk_attrs, ukinfo->rq_size, 1484 + *rq_shift, rq_depth); 1485 + 1486 + return status; 1487 + } 1488 + 1489 + /** 1339 1490 * irdma_uk_qp_init - initialize shared qp 1340 1491 * @qp: hw qp (user and kernel) 1341 1492 * @info: qp initialization info ··· 1421 1428 { 1422 1429 int ret_code = 0; 1423 1430 u32 sq_ring_size; 1424 - u8 sqshift, rqshift; 1425 1431 1426 1432 qp->uk_attrs = info->uk_attrs; 1427 1433 if (info->max_sq_frag_cnt > qp->uk_attrs->max_hw_wq_frags || 1428 1434 info->max_rq_frag_cnt > qp->uk_attrs->max_hw_wq_frags) 1429 1435 return -EINVAL; 1430 1436 1431 - irdma_get_wqe_shift(qp->uk_attrs, info->max_rq_frag_cnt, 0, &rqshift); 1432 - if (qp->uk_attrs->hw_rev == IRDMA_GEN_1) { 1433 - irdma_get_wqe_shift(qp->uk_attrs, info->max_sq_frag_cnt, 1434 - info->max_inline_data, &sqshift); 1435 - if (info->abi_ver > 4) 1436 - rqshift = IRDMA_MAX_RQ_WQE_SHIFT_GEN1; 1437 - } else { 1438 - irdma_get_wqe_shift(qp->uk_attrs, info->max_sq_frag_cnt + 1, 1439 - info->max_inline_data, &sqshift); 1440 - } 1441 1437 qp->qp_caps = info->qp_caps; 1442 1438 qp->sq_base = info->sq; 1443 1439 qp->rq_base = info->rq; ··· 1438 1456 qp->wqe_alloc_db = info->wqe_alloc_db; 1439 1457 qp->qp_id = info->qp_id; 1440 1458 qp->sq_size = info->sq_size; 1441 - qp->push_mode = false; 1442 1459 qp->max_sq_frag_cnt = info->max_sq_frag_cnt; 1443 - sq_ring_size = qp->sq_size << sqshift; 1460 + sq_ring_size = qp->sq_size << info->sq_shift; 1444 1461 IRDMA_RING_INIT(qp->sq_ring, sq_ring_size); 1445 1462 IRDMA_RING_INIT(qp->initial_ring, sq_ring_size); 1446 1463 if (info->first_sq_wq) { ··· 1454 1473 qp->rq_size = info->rq_size; 1455 1474 qp->max_rq_frag_cnt = info->max_rq_frag_cnt; 1456 1475 qp->max_inline_data = info->max_inline_data; 1457 - qp->rq_wqe_size = rqshift; 1476 + qp->rq_wqe_size = info->rq_shift; 1458 1477 IRDMA_RING_INIT(qp->rq_ring, qp->rq_size); 1459 - qp->rq_wqe_size_multiplier = 1 << rqshift; 1478 + qp->rq_wqe_size_multiplier = 1 << info->rq_shift; 1460 1479 if (qp->uk_attrs->hw_rev == IRDMA_GEN_1) 1461 1480 qp->wqe_ops = iw_wqe_uk_ops_gen_1; 1462 1481 else ··· 1535 1554 u32 wqe_idx; 1536 1555 struct irdma_post_sq_info info = {}; 1537 1556 1538 - info.push_wqe = false; 1539 1557 info.wr_id = wr_id; 1540 1558 wqe = irdma_qp_get_next_send_wqe(qp, &wqe_idx, IRDMA_QP_WQE_MIN_QUANTA, 1541 1559 0, &info);
+11 -8
drivers/infiniband/hw/irdma/user.h
··· 85 85 IRDMA_Q2_BUF_SIZE = 256, 86 86 IRDMA_QP_CTX_SIZE = 256, 87 87 IRDMA_MAX_PDS = 262144, 88 + IRDMA_MIN_WQ_SIZE_GEN2 = 8, 88 89 }; 89 90 90 91 enum irdma_addressing_type { ··· 216 215 bool local_fence:1; 217 216 bool inline_data:1; 218 217 bool imm_data_valid:1; 219 - bool push_wqe:1; 220 218 bool report_rtt:1; 221 219 bool udp_hdr:1; 222 220 bool defer_flag:1; ··· 247 247 u8 op_type; 248 248 u8 q_type; 249 249 bool stag_invalid_set:1; /* or L_R_Key set */ 250 - bool push_dropped:1; 251 250 bool error:1; 252 251 bool solicited_event:1; 253 252 bool ipv4:1; ··· 294 295 struct irdma_cq_uk_init_info *info); 295 296 int irdma_uk_qp_init(struct irdma_qp_uk *qp, 296 297 struct irdma_qp_uk_init_info *info); 298 + void irdma_uk_calc_shift_wq(struct irdma_qp_uk_init_info *ukinfo, u8 *sq_shift, 299 + u8 *rq_shift); 300 + int irdma_uk_calc_depth_shift_sq(struct irdma_qp_uk_init_info *ukinfo, 301 + u32 *sq_depth, u8 *sq_shift); 302 + int irdma_uk_calc_depth_shift_rq(struct irdma_qp_uk_init_info *ukinfo, 303 + u32 *rq_depth, u8 *rq_shift); 297 304 struct irdma_sq_uk_wr_trk_info { 298 305 u64 wrid; 299 306 u32 wr_len; ··· 319 314 struct irdma_sq_uk_wr_trk_info *sq_wrtrk_array; 320 315 u64 *rq_wrid_array; 321 316 __le64 *shadow_area; 322 - __le32 *push_db; 323 - __le64 *push_wqe; 324 317 struct irdma_ring sq_ring; 325 318 struct irdma_ring rq_ring; 326 319 struct irdma_ring initial_ring; ··· 338 335 u8 rq_wqe_size; 339 336 u8 rq_wqe_size_multiplier; 340 337 bool deferred_flag:1; 341 - bool push_mode:1; /* whether the last post wqe was pushed */ 342 - bool push_dropped:1; 343 338 bool first_sq_wq:1; 344 339 bool sq_flush_complete:1; /* Indicates flush was seen and SQ was empty after the flush */ 345 340 bool rq_flush_complete:1; /* Indicates flush was seen and RQ was empty after the flush */ ··· 375 374 u32 max_sq_frag_cnt; 376 375 u32 max_rq_frag_cnt; 377 376 u32 max_inline_data; 377 + u32 sq_depth; 378 + u32 rq_depth; 378 379 u8 first_sq_wq; 379 380 u8 type; 381 + u8 sq_shift; 382 + u8 rq_shift; 380 383 int abi_ver; 381 384 bool legacy_mode; 382 385 }; ··· 409 404 u32 *wqdepth); 410 405 int irdma_get_rqdepth(struct irdma_uk_attrs *uk_attrs, u32 rq_size, u8 shift, 411 406 u32 *wqdepth); 412 - void irdma_qp_push_wqe(struct irdma_qp_uk *qp, __le64 *wqe, u16 quanta, 413 - u32 wqe_idx, bool post_sq); 414 407 void irdma_clr_wqes(struct irdma_qp_uk *qp, u32 qp_wqe_idx); 415 408 #endif /* IRDMA_USER_H */
+25
drivers/infiniband/hw/irdma/utils.c
··· 760 760 complete(&iwqp->free_qp); 761 761 } 762 762 763 + void irdma_cq_add_ref(struct ib_cq *ibcq) 764 + { 765 + struct irdma_cq *iwcq = to_iwcq(ibcq); 766 + 767 + refcount_inc(&iwcq->refcnt); 768 + } 769 + 770 + void irdma_cq_rem_ref(struct ib_cq *ibcq) 771 + { 772 + struct ib_device *ibdev = ibcq->device; 773 + struct irdma_device *iwdev = to_iwdev(ibdev); 774 + struct irdma_cq *iwcq = to_iwcq(ibcq); 775 + unsigned long flags; 776 + 777 + spin_lock_irqsave(&iwdev->rf->cqtable_lock, flags); 778 + if (!refcount_dec_and_test(&iwcq->refcnt)) { 779 + spin_unlock_irqrestore(&iwdev->rf->cqtable_lock, flags); 780 + return; 781 + } 782 + 783 + iwdev->rf->cq_table[iwcq->cq_num] = NULL; 784 + spin_unlock_irqrestore(&iwdev->rf->cqtable_lock, flags); 785 + complete(&iwcq->free_cq); 786 + } 787 + 763 788 struct ib_device *to_ibdev(struct irdma_sc_dev *dev) 764 789 { 765 790 return &(container_of(dev, struct irdma_pci_f, sc_dev))->iwdev->ibdev;
+169 -90
drivers/infiniband/hw/irdma/verbs.c
··· 277 277 struct irdma_alloc_ucontext_req req = {}; 278 278 struct irdma_alloc_ucontext_resp uresp = {}; 279 279 struct irdma_ucontext *ucontext = to_ucontext(uctx); 280 - struct irdma_uk_attrs *uk_attrs; 280 + struct irdma_uk_attrs *uk_attrs = &iwdev->rf->sc_dev.hw_attrs.uk_attrs; 281 281 282 282 if (udata->inlen < IRDMA_ALLOC_UCTX_MIN_REQ_LEN || 283 283 udata->outlen < IRDMA_ALLOC_UCTX_MIN_RESP_LEN) ··· 292 292 ucontext->iwdev = iwdev; 293 293 ucontext->abi_ver = req.userspace_ver; 294 294 295 - uk_attrs = &iwdev->rf->sc_dev.hw_attrs.uk_attrs; 295 + if (req.comp_mask & IRDMA_ALLOC_UCTX_USE_RAW_ATTR) 296 + ucontext->use_raw_attrs = true; 297 + 296 298 /* GEN_1 legacy support with libi40iw */ 297 299 if (udata->outlen == IRDMA_ALLOC_UCTX_MIN_RESP_LEN) { 298 300 if (uk_attrs->hw_rev != IRDMA_GEN_1) ··· 329 327 uresp.max_hw_cq_size = uk_attrs->max_hw_cq_size; 330 328 uresp.min_hw_cq_size = uk_attrs->min_hw_cq_size; 331 329 uresp.hw_rev = uk_attrs->hw_rev; 330 + uresp.comp_mask |= IRDMA_ALLOC_UCTX_USE_RAW_ATTR; 331 + uresp.min_hw_wq_size = uk_attrs->min_hw_wq_size; 332 + uresp.comp_mask |= IRDMA_ALLOC_UCTX_MIN_HW_WQ_SIZE; 332 333 if (ib_copy_to_udata(udata, &uresp, 333 334 min(sizeof(uresp), udata->outlen))) { 334 335 rdma_user_mmap_entry_remove(ucontext->db_mmap_entry); ··· 572 567 } 573 568 574 569 /** 570 + * irdma_setup_umode_qp - setup sq and rq size in user mode qp 571 + * @udata: udata 572 + * @iwdev: iwarp device 573 + * @iwqp: qp ptr (user or kernel) 574 + * @info: initialize info to return 575 + * @init_attr: Initial QP create attributes 576 + */ 577 + static int irdma_setup_umode_qp(struct ib_udata *udata, 578 + struct irdma_device *iwdev, 579 + struct irdma_qp *iwqp, 580 + struct irdma_qp_init_info *info, 581 + struct ib_qp_init_attr *init_attr) 582 + { 583 + struct irdma_ucontext *ucontext = rdma_udata_to_drv_context(udata, 584 + struct irdma_ucontext, ibucontext); 585 + struct irdma_qp_uk_init_info *ukinfo = &info->qp_uk_init_info; 586 + struct irdma_create_qp_req req; 587 + unsigned long flags; 588 + int ret; 589 + 590 + ret = ib_copy_from_udata(&req, udata, 591 + min(sizeof(req), udata->inlen)); 592 + if (ret) { 593 + ibdev_dbg(&iwdev->ibdev, "VERBS: ib_copy_from_data fail\n"); 594 + return ret; 595 + } 596 + 597 + iwqp->ctx_info.qp_compl_ctx = req.user_compl_ctx; 598 + iwqp->user_mode = 1; 599 + if (req.user_wqe_bufs) { 600 + info->qp_uk_init_info.legacy_mode = ucontext->legacy_mode; 601 + spin_lock_irqsave(&ucontext->qp_reg_mem_list_lock, flags); 602 + iwqp->iwpbl = irdma_get_pbl((unsigned long)req.user_wqe_bufs, 603 + &ucontext->qp_reg_mem_list); 604 + spin_unlock_irqrestore(&ucontext->qp_reg_mem_list_lock, flags); 605 + 606 + if (!iwqp->iwpbl) { 607 + ret = -ENODATA; 608 + ibdev_dbg(&iwdev->ibdev, "VERBS: no pbl info\n"); 609 + return ret; 610 + } 611 + } 612 + 613 + if (!ucontext->use_raw_attrs) { 614 + /** 615 + * Maintain backward compat with older ABI which passes sq and 616 + * rq depth in quanta in cap.max_send_wr and cap.max_recv_wr. 617 + * There is no way to compute the correct value of 618 + * iwqp->max_send_wr/max_recv_wr in the kernel. 619 + */ 620 + iwqp->max_send_wr = init_attr->cap.max_send_wr; 621 + iwqp->max_recv_wr = init_attr->cap.max_recv_wr; 622 + ukinfo->sq_size = init_attr->cap.max_send_wr; 623 + ukinfo->rq_size = init_attr->cap.max_recv_wr; 624 + irdma_uk_calc_shift_wq(ukinfo, &ukinfo->sq_shift, 625 + &ukinfo->rq_shift); 626 + } else { 627 + ret = irdma_uk_calc_depth_shift_sq(ukinfo, &ukinfo->sq_depth, 628 + &ukinfo->sq_shift); 629 + if (ret) 630 + return ret; 631 + 632 + ret = irdma_uk_calc_depth_shift_rq(ukinfo, &ukinfo->rq_depth, 633 + &ukinfo->rq_shift); 634 + if (ret) 635 + return ret; 636 + 637 + iwqp->max_send_wr = 638 + (ukinfo->sq_depth - IRDMA_SQ_RSVD) >> ukinfo->sq_shift; 639 + iwqp->max_recv_wr = 640 + (ukinfo->rq_depth - IRDMA_RQ_RSVD) >> ukinfo->rq_shift; 641 + ukinfo->sq_size = ukinfo->sq_depth >> ukinfo->sq_shift; 642 + ukinfo->rq_size = ukinfo->rq_depth >> ukinfo->rq_shift; 643 + } 644 + 645 + irdma_setup_virt_qp(iwdev, iwqp, info); 646 + 647 + return 0; 648 + } 649 + 650 + /** 575 651 * irdma_setup_kmode_qp - setup initialization for kernel mode qp 576 652 * @iwdev: iwarp device 577 653 * @iwqp: qp ptr (user or kernel) ··· 665 579 struct ib_qp_init_attr *init_attr) 666 580 { 667 581 struct irdma_dma_mem *mem = &iwqp->kqp.dma_mem; 668 - u32 sqdepth, rqdepth; 669 - u8 sqshift, rqshift; 670 582 u32 size; 671 583 int status; 672 584 struct irdma_qp_uk_init_info *ukinfo = &info->qp_uk_init_info; 673 - struct irdma_uk_attrs *uk_attrs = &iwdev->rf->sc_dev.hw_attrs.uk_attrs; 674 585 675 - irdma_get_wqe_shift(uk_attrs, 676 - uk_attrs->hw_rev >= IRDMA_GEN_2 ? ukinfo->max_sq_frag_cnt + 1 : 677 - ukinfo->max_sq_frag_cnt, 678 - ukinfo->max_inline_data, &sqshift); 679 - status = irdma_get_sqdepth(uk_attrs, ukinfo->sq_size, sqshift, 680 - &sqdepth); 586 + status = irdma_uk_calc_depth_shift_sq(ukinfo, &ukinfo->sq_depth, 587 + &ukinfo->sq_shift); 681 588 if (status) 682 589 return status; 683 590 684 - if (uk_attrs->hw_rev == IRDMA_GEN_1) 685 - rqshift = IRDMA_MAX_RQ_WQE_SHIFT_GEN1; 686 - else 687 - irdma_get_wqe_shift(uk_attrs, ukinfo->max_rq_frag_cnt, 0, 688 - &rqshift); 689 - 690 - status = irdma_get_rqdepth(uk_attrs, ukinfo->rq_size, rqshift, 691 - &rqdepth); 591 + status = irdma_uk_calc_depth_shift_rq(ukinfo, &ukinfo->rq_depth, 592 + &ukinfo->rq_shift); 692 593 if (status) 693 594 return status; 694 595 695 596 iwqp->kqp.sq_wrid_mem = 696 - kcalloc(sqdepth, sizeof(*iwqp->kqp.sq_wrid_mem), GFP_KERNEL); 597 + kcalloc(ukinfo->sq_depth, sizeof(*iwqp->kqp.sq_wrid_mem), GFP_KERNEL); 697 598 if (!iwqp->kqp.sq_wrid_mem) 698 599 return -ENOMEM; 699 600 700 601 iwqp->kqp.rq_wrid_mem = 701 - kcalloc(rqdepth, sizeof(*iwqp->kqp.rq_wrid_mem), GFP_KERNEL); 602 + kcalloc(ukinfo->rq_depth, sizeof(*iwqp->kqp.rq_wrid_mem), GFP_KERNEL); 603 + 702 604 if (!iwqp->kqp.rq_wrid_mem) { 703 605 kfree(iwqp->kqp.sq_wrid_mem); 704 606 iwqp->kqp.sq_wrid_mem = NULL; ··· 696 622 ukinfo->sq_wrtrk_array = iwqp->kqp.sq_wrid_mem; 697 623 ukinfo->rq_wrid_array = iwqp->kqp.rq_wrid_mem; 698 624 699 - size = (sqdepth + rqdepth) * IRDMA_QP_WQE_MIN_SIZE; 625 + size = (ukinfo->sq_depth + ukinfo->rq_depth) * IRDMA_QP_WQE_MIN_SIZE; 700 626 size += (IRDMA_SHADOW_AREA_SIZE << 3); 701 627 702 628 mem->size = ALIGN(size, 256); ··· 712 638 713 639 ukinfo->sq = mem->va; 714 640 info->sq_pa = mem->pa; 715 - ukinfo->rq = &ukinfo->sq[sqdepth]; 716 - info->rq_pa = info->sq_pa + (sqdepth * IRDMA_QP_WQE_MIN_SIZE); 717 - ukinfo->shadow_area = ukinfo->rq[rqdepth].elem; 718 - info->shadow_area_pa = info->rq_pa + (rqdepth * IRDMA_QP_WQE_MIN_SIZE); 719 - ukinfo->sq_size = sqdepth >> sqshift; 720 - ukinfo->rq_size = rqdepth >> rqshift; 641 + ukinfo->rq = &ukinfo->sq[ukinfo->sq_depth]; 642 + info->rq_pa = info->sq_pa + (ukinfo->sq_depth * IRDMA_QP_WQE_MIN_SIZE); 643 + ukinfo->shadow_area = ukinfo->rq[ukinfo->rq_depth].elem; 644 + info->shadow_area_pa = 645 + info->rq_pa + (ukinfo->rq_depth * IRDMA_QP_WQE_MIN_SIZE); 646 + ukinfo->sq_size = ukinfo->sq_depth >> ukinfo->sq_shift; 647 + ukinfo->rq_size = ukinfo->rq_depth >> ukinfo->rq_shift; 721 648 ukinfo->qp_id = iwqp->ibqp.qp_num; 722 649 723 - init_attr->cap.max_send_wr = (sqdepth - IRDMA_SQ_RSVD) >> sqshift; 724 - init_attr->cap.max_recv_wr = (rqdepth - IRDMA_RQ_RSVD) >> rqshift; 650 + iwqp->max_send_wr = (ukinfo->sq_depth - IRDMA_SQ_RSVD) >> ukinfo->sq_shift; 651 + iwqp->max_recv_wr = (ukinfo->rq_depth - IRDMA_RQ_RSVD) >> ukinfo->rq_shift; 652 + init_attr->cap.max_send_wr = iwqp->max_send_wr; 653 + init_attr->cap.max_recv_wr = iwqp->max_recv_wr; 725 654 726 655 return 0; 727 656 } ··· 880 803 struct irdma_device *iwdev = to_iwdev(ibpd->device); 881 804 struct irdma_pci_f *rf = iwdev->rf; 882 805 struct irdma_qp *iwqp = to_iwqp(ibqp); 883 - struct irdma_create_qp_req req = {}; 884 806 struct irdma_create_qp_resp uresp = {}; 885 807 u32 qp_num = 0; 886 808 int err_code; 887 - int sq_size; 888 - int rq_size; 889 809 struct irdma_sc_qp *qp; 890 810 struct irdma_sc_dev *dev = &rf->sc_dev; 891 811 struct irdma_uk_attrs *uk_attrs = &dev->hw_attrs.uk_attrs; 892 812 struct irdma_qp_init_info init_info = {}; 893 813 struct irdma_qp_host_ctx_info *ctx_info; 894 - unsigned long flags; 895 814 896 815 err_code = irdma_validate_qp_attrs(init_attr, iwdev); 897 816 if (err_code) ··· 897 824 udata->outlen < IRDMA_CREATE_QP_MIN_RESP_LEN)) 898 825 return -EINVAL; 899 826 900 - sq_size = init_attr->cap.max_send_wr; 901 - rq_size = init_attr->cap.max_recv_wr; 902 - 903 827 init_info.vsi = &iwdev->vsi; 904 828 init_info.qp_uk_init_info.uk_attrs = uk_attrs; 905 - init_info.qp_uk_init_info.sq_size = sq_size; 906 - init_info.qp_uk_init_info.rq_size = rq_size; 829 + init_info.qp_uk_init_info.sq_size = init_attr->cap.max_send_wr; 830 + init_info.qp_uk_init_info.rq_size = init_attr->cap.max_recv_wr; 907 831 init_info.qp_uk_init_info.max_sq_frag_cnt = init_attr->cap.max_send_sge; 908 832 init_info.qp_uk_init_info.max_rq_frag_cnt = init_attr->cap.max_recv_sge; 909 833 init_info.qp_uk_init_info.max_inline_data = init_attr->cap.max_inline_data; ··· 950 880 init_waitqueue_head(&iwqp->mod_qp_waitq); 951 881 952 882 if (udata) { 953 - err_code = ib_copy_from_udata(&req, udata, 954 - min(sizeof(req), udata->inlen)); 955 - if (err_code) { 956 - ibdev_dbg(&iwdev->ibdev, 957 - "VERBS: ib_copy_from_data fail\n"); 958 - goto error; 959 - } 960 - 961 - iwqp->ctx_info.qp_compl_ctx = req.user_compl_ctx; 962 - iwqp->user_mode = 1; 963 - if (req.user_wqe_bufs) { 964 - struct irdma_ucontext *ucontext = 965 - rdma_udata_to_drv_context(udata, 966 - struct irdma_ucontext, 967 - ibucontext); 968 - 969 - init_info.qp_uk_init_info.legacy_mode = ucontext->legacy_mode; 970 - spin_lock_irqsave(&ucontext->qp_reg_mem_list_lock, flags); 971 - iwqp->iwpbl = irdma_get_pbl((unsigned long)req.user_wqe_bufs, 972 - &ucontext->qp_reg_mem_list); 973 - spin_unlock_irqrestore(&ucontext->qp_reg_mem_list_lock, flags); 974 - 975 - if (!iwqp->iwpbl) { 976 - err_code = -ENODATA; 977 - ibdev_dbg(&iwdev->ibdev, "VERBS: no pbl info\n"); 978 - goto error; 979 - } 980 - } 981 883 init_info.qp_uk_init_info.abi_ver = iwpd->sc_pd.abi_ver; 982 - irdma_setup_virt_qp(iwdev, iwqp, &init_info); 884 + err_code = irdma_setup_umode_qp(udata, iwdev, iwqp, &init_info, 885 + init_attr); 983 886 } else { 984 887 INIT_DELAYED_WORK(&iwqp->dwork_flush, irdma_flush_worker); 985 888 init_info.qp_uk_init_info.abi_ver = IRDMA_ABI_VER; ··· 1005 962 refcount_set(&iwqp->refcnt, 1); 1006 963 spin_lock_init(&iwqp->lock); 1007 964 spin_lock_init(&iwqp->sc_qp.pfpdu.lock); 1008 - iwqp->sig_all = (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR) ? 1 : 0; 965 + iwqp->sig_all = init_attr->sq_sig_type == IB_SIGNAL_ALL_WR; 1009 966 rf->qp_table[qp_num] = iwqp; 1010 - iwqp->max_send_wr = sq_size; 1011 - iwqp->max_recv_wr = rq_size; 1012 967 1013 968 if (rdma_protocol_roce(&iwdev->ibdev, 1)) { 1014 969 if (dev->ws_add(&iwdev->vsi, 0)) { ··· 1027 986 if (rdma_protocol_iwarp(&iwdev->ibdev, 1)) 1028 987 uresp.lsmm = 1; 1029 988 } 1030 - uresp.actual_sq_size = sq_size; 1031 - uresp.actual_rq_size = rq_size; 989 + uresp.actual_sq_size = init_info.qp_uk_init_info.sq_size; 990 + uresp.actual_rq_size = init_info.qp_uk_init_info.rq_size; 1032 991 uresp.qp_id = qp_num; 1033 992 uresp.qp_caps = qp->qp_uk.qp_caps; 1034 993 ··· 1139 1098 return 0; 1140 1099 } 1141 1100 1101 + static u8 irdma_roce_get_vlan_prio(const struct ib_gid_attr *attr, u8 prio) 1102 + { 1103 + struct net_device *ndev; 1104 + 1105 + rcu_read_lock(); 1106 + ndev = rcu_dereference(attr->ndev); 1107 + if (!ndev) 1108 + goto exit; 1109 + if (is_vlan_dev(ndev)) { 1110 + u16 vlan_qos = vlan_dev_get_egress_qos_mask(ndev, prio); 1111 + 1112 + prio = (vlan_qos & VLAN_PRIO_MASK) >> VLAN_PRIO_SHIFT; 1113 + } 1114 + exit: 1115 + rcu_read_unlock(); 1116 + return prio; 1117 + } 1118 + 1142 1119 /** 1143 1120 * irdma_modify_qp_roce - modify qp request 1144 1121 * @ibqp: qp's pointer for modify ··· 1233 1174 1234 1175 if (attr_mask & IB_QP_AV) { 1235 1176 struct irdma_av *av = &iwqp->roce_ah.av; 1236 - const struct ib_gid_attr *sgid_attr; 1177 + const struct ib_gid_attr *sgid_attr = 1178 + attr->ah_attr.grh.sgid_attr; 1237 1179 u16 vlan_id = VLAN_N_VID; 1238 1180 u32 local_ip[4]; 1239 1181 ··· 1249 1189 roce_info->dest_qp); 1250 1190 irdma_qp_rem_qos(&iwqp->sc_qp); 1251 1191 dev->ws_remove(iwqp->sc_qp.vsi, ctx_info->user_pri); 1252 - ctx_info->user_pri = rt_tos2priority(udp_info->tos); 1253 - iwqp->sc_qp.user_pri = ctx_info->user_pri; 1254 - if (dev->ws_add(iwqp->sc_qp.vsi, ctx_info->user_pri)) 1255 - return -ENOMEM; 1256 - irdma_qp_add_qos(&iwqp->sc_qp); 1192 + if (iwqp->sc_qp.vsi->dscp_mode) 1193 + ctx_info->user_pri = 1194 + iwqp->sc_qp.vsi->dscp_map[irdma_tos2dscp(udp_info->tos)]; 1195 + else 1196 + ctx_info->user_pri = rt_tos2priority(udp_info->tos); 1257 1197 } 1258 - sgid_attr = attr->ah_attr.grh.sgid_attr; 1259 1198 ret = rdma_read_gid_l2_fields(sgid_attr, &vlan_id, 1260 1199 ctx_info->roce_info->mac_addr); 1261 1200 if (ret) 1262 1201 return ret; 1202 + ctx_info->user_pri = irdma_roce_get_vlan_prio(sgid_attr, 1203 + ctx_info->user_pri); 1204 + if (dev->ws_add(iwqp->sc_qp.vsi, ctx_info->user_pri)) 1205 + return -ENOMEM; 1206 + iwqp->sc_qp.user_pri = ctx_info->user_pri; 1207 + irdma_qp_add_qos(&iwqp->sc_qp); 1263 1208 1264 1209 if (vlan_id >= VLAN_N_VID && iwdev->dcb_vlan_mode) 1265 1210 vlan_id = 0; ··· 1846 1781 irdma_process_resize_list(iwcq, iwdev, NULL); 1847 1782 spin_unlock_irqrestore(&iwcq->lock, flags); 1848 1783 1784 + irdma_cq_rem_ref(ib_cq); 1785 + wait_for_completion(&iwcq->free_cq); 1786 + 1849 1787 irdma_cq_wq_destroy(iwdev->rf, cq); 1850 1788 1851 1789 spin_lock_irqsave(&iwceq->ce_lock, flags); ··· 2058 1990 2059 1991 cq = &iwcq->sc_cq; 2060 1992 cq->back_cq = iwcq; 1993 + refcount_set(&iwcq->refcnt, 1); 2061 1994 spin_lock_init(&iwcq->lock); 2062 1995 INIT_LIST_HEAD(&iwcq->resize_list); 2063 1996 INIT_LIST_HEAD(&iwcq->cmpl_generated); ··· 2210 2141 goto cq_destroy; 2211 2142 } 2212 2143 } 2144 + rf->cq_table[cq_num] = iwcq; 2145 + init_completion(&iwcq->free_cq); 2146 + 2213 2147 return 0; 2214 2148 cq_destroy: 2215 2149 irdma_cq_wq_destroy(rf, cq); ··· 2624 2552 struct irdma_mr *iwmr) 2625 2553 { 2626 2554 struct irdma_allocate_stag_info *info; 2627 - struct irdma_pd *iwpd = to_iwpd(iwmr->ibmr.pd); 2555 + struct ib_pd *pd = iwmr->ibmr.pd; 2556 + struct irdma_pd *iwpd = to_iwpd(pd); 2628 2557 int status; 2629 2558 struct irdma_cqp_request *cqp_request; 2630 2559 struct cqp_cmds_info *cqp_info; ··· 2641 2568 info->stag_idx = iwmr->stag >> IRDMA_CQPSQ_STAG_IDX_S; 2642 2569 info->pd_id = iwpd->sc_pd.pd_id; 2643 2570 info->total_len = iwmr->len; 2571 + info->all_memory = pd->flags & IB_PD_UNSAFE_GLOBAL_RKEY; 2644 2572 info->remote_access = true; 2645 2573 cqp_info->cqp_cmd = IRDMA_OP_ALLOC_STAG; 2646 2574 cqp_info->post_sq = 1; ··· 2689 2615 iwmr->type = IRDMA_MEMREG_TYPE_MEM; 2690 2616 palloc = &iwpbl->pble_alloc; 2691 2617 iwmr->page_cnt = max_num_sg; 2618 + /* Use system PAGE_SIZE as the sg page sizes are unknown at this point */ 2619 + iwmr->len = max_num_sg * PAGE_SIZE; 2692 2620 err_code = irdma_get_pble(iwdev->rf->pble_rsrc, palloc, iwmr->page_cnt, 2693 2621 false); 2694 2622 if (err_code) ··· 2770 2694 { 2771 2695 struct irdma_pbl *iwpbl = &iwmr->iwpbl; 2772 2696 struct irdma_reg_ns_stag_info *stag_info; 2773 - struct irdma_pd *iwpd = to_iwpd(iwmr->ibmr.pd); 2697 + struct ib_pd *pd = iwmr->ibmr.pd; 2698 + struct irdma_pd *iwpd = to_iwpd(pd); 2774 2699 struct irdma_pble_alloc *palloc = &iwpbl->pble_alloc; 2775 2700 struct irdma_cqp_request *cqp_request; 2776 2701 struct cqp_cmds_info *cqp_info; ··· 2790 2713 stag_info->total_len = iwmr->len; 2791 2714 stag_info->access_rights = irdma_get_mr_access(access); 2792 2715 stag_info->pd_id = iwpd->sc_pd.pd_id; 2716 + stag_info->all_memory = pd->flags & IB_PD_UNSAFE_GLOBAL_RKEY; 2793 2717 if (stag_info->access_rights & IRDMA_ACCESS_FLAGS_ZERO_BASED) 2794 2718 stag_info->addr_type = IRDMA_ADDR_TYPE_ZERO_BASED; 2795 2719 else ··· 2872 2794 enum irdma_memreg_type reg_type) 2873 2795 { 2874 2796 struct irdma_device *iwdev = to_iwdev(pd->device); 2875 - struct irdma_pbl *iwpbl = NULL; 2876 - struct irdma_mr *iwmr = NULL; 2797 + struct irdma_pbl *iwpbl; 2798 + struct irdma_mr *iwmr; 2877 2799 unsigned long pgsz_bitmap; 2878 2800 2879 2801 iwmr = kzalloc(sizeof(*iwmr), GFP_KERNEL); ··· 3554 3476 set_ib_wc_op_sq(cq_poll_info, entry); 3555 3477 } else { 3556 3478 set_ib_wc_op_rq(cq_poll_info, entry, 3557 - qp->qp_uk.qp_caps & IRDMA_SEND_WITH_IMM ? 3558 - true : false); 3479 + qp->qp_uk.qp_caps & IRDMA_SEND_WITH_IMM); 3559 3480 if (qp->qp_uk.qp_type != IRDMA_QP_TYPE_ROCE_UD && 3560 3481 cq_poll_info->stag_invalid_set) { 3561 3482 entry->ex.invalidate_rkey = cq_poll_info->inv_stag; ··· 4040 3963 if (!ipv6_addr_v4mapped((struct in6_addr *)ibgid)) { 4041 3964 irdma_copy_ip_ntohl(ip_addr, 4042 3965 sgid_addr.saddr_in6.sin6_addr.in6_u.u6_addr32); 4043 - irdma_netdev_vlan_ipv6(ip_addr, &vlan_id, NULL); 3966 + irdma_get_vlan_mac_ipv6(ip_addr, &vlan_id, NULL); 4044 3967 ipv4 = false; 4045 3968 ibdev_dbg(&iwdev->ibdev, 4046 3969 "VERBS: qp_id=%d, IP6address=%pI6\n", ibqp->qp_num, ··· 4338 4261 ah_info->vlan_tag = 0; 4339 4262 4340 4263 if (ah_info->vlan_tag < VLAN_N_VID) { 4264 + u8 prio = rt_tos2priority(ah_info->tc_tos); 4265 + 4266 + prio = irdma_roce_get_vlan_prio(sgid_attr, prio); 4267 + 4268 + ah_info->vlan_tag |= (u16)prio << VLAN_PRIO_SHIFT; 4341 4269 ah_info->insert_vlan_tag = true; 4342 - ah_info->vlan_tag |= 4343 - rt_tos2priority(ah_info->tc_tos) << VLAN_PRIO_SHIFT; 4344 4270 } 4345 4271 4346 4272 return 0; ··· 4503 4423 ah_attr->grh.flow_label = ah->sc_ah.ah_info.flow_label; 4504 4424 ah_attr->grh.traffic_class = ah->sc_ah.ah_info.tc_tos; 4505 4425 ah_attr->grh.hop_limit = ah->sc_ah.ah_info.hop_ttl; 4506 - ah_attr->grh.sgid_index = ah->sgid_index; 4507 4426 ah_attr->grh.sgid_index = ah->sgid_index; 4508 4427 memcpy(&ah_attr->grh.dgid, &ah->dgid, 4509 4428 sizeof(ah_attr->grh.dgid));
+4 -1
drivers/infiniband/hw/irdma/verbs.h
··· 18 18 struct list_head qp_reg_mem_list; 19 19 spinlock_t qp_reg_mem_list_lock; /* protect QP memory list */ 20 20 int abi_ver; 21 - bool legacy_mode; 21 + u8 legacy_mode : 1; 22 + u8 use_raw_attrs : 1; 22 23 }; 23 24 24 25 struct irdma_pd { ··· 123 122 u32 cq_mem_size; 124 123 struct irdma_dma_mem kmem; 125 124 struct irdma_dma_mem kmem_shadow; 125 + struct completion free_cq; 126 + refcount_t refcnt; 126 127 spinlock_t lock; /* for poll cq */ 127 128 struct irdma_pbl *iwpbl; 128 129 struct irdma_pbl *iwpbl_shadow;
+23 -24
drivers/infiniband/hw/mlx4/main.c
··· 136 136 continue; 137 137 138 138 if (mlx4_is_bonded(ibdev->dev)) { 139 - struct net_device *upper = NULL; 139 + struct net_device *upper; 140 140 141 141 upper = netdev_master_upper_dev_get_rcu(dev); 142 142 if (upper) { ··· 261 261 int ret = 0; 262 262 int hw_update = 0; 263 263 int i; 264 - struct gid_entry *gids = NULL; 264 + struct gid_entry *gids; 265 265 u16 vlan_id = 0xffff; 266 266 u8 mac[ETH_ALEN]; 267 267 ··· 300 300 ret = -ENOMEM; 301 301 } else { 302 302 *context = port_gid_table->gids[free].ctx; 303 - memcpy(&port_gid_table->gids[free].gid, 304 - &attr->gid, sizeof(attr->gid)); 303 + port_gid_table->gids[free].gid = attr->gid; 305 304 port_gid_table->gids[free].gid_type = attr->gid_type; 306 305 port_gid_table->gids[free].vlan_id = vlan_id; 307 306 port_gid_table->gids[free].ctx->real_index = free; ··· 351 352 struct mlx4_port_gid_table *port_gid_table; 352 353 int ret = 0; 353 354 int hw_update = 0; 354 - struct gid_entry *gids = NULL; 355 + struct gid_entry *gids; 355 356 356 357 if (!rdma_cap_roce_gid_table(attr->device, attr->port_num)) 357 358 return -EINVAL; ··· 437 438 struct ib_udata *uhw) 438 439 { 439 440 struct mlx4_ib_dev *dev = to_mdev(ibdev); 440 - struct ib_smp *in_mad = NULL; 441 - struct ib_smp *out_mad = NULL; 441 + struct ib_smp *in_mad; 442 + struct ib_smp *out_mad; 442 443 int err; 443 444 int have_ib_ports; 444 445 struct mlx4_uverbs_ex_query_device cmd; ··· 655 656 static int ib_link_query_port(struct ib_device *ibdev, u32 port, 656 657 struct ib_port_attr *props, int netw_view) 657 658 { 658 - struct ib_smp *in_mad = NULL; 659 - struct ib_smp *out_mad = NULL; 659 + struct ib_smp *in_mad; 660 + struct ib_smp *out_mad; 660 661 int ext_active_speed; 661 662 int mad_ifc_flags = MLX4_MAD_IFC_IGNORE_KEYS; 662 663 int err = -ENOMEM; ··· 833 834 int __mlx4_ib_query_gid(struct ib_device *ibdev, u32 port, int index, 834 835 union ib_gid *gid, int netw_view) 835 836 { 836 - struct ib_smp *in_mad = NULL; 837 - struct ib_smp *out_mad = NULL; 837 + struct ib_smp *in_mad; 838 + struct ib_smp *out_mad; 838 839 int err = -ENOMEM; 839 840 struct mlx4_ib_dev *dev = to_mdev(ibdev); 840 841 int clear = 0; ··· 898 899 u64 *sl2vl_tbl) 899 900 { 900 901 union sl2vl_tbl_to_u64 sl2vl64; 901 - struct ib_smp *in_mad = NULL; 902 - struct ib_smp *out_mad = NULL; 902 + struct ib_smp *in_mad; 903 + struct ib_smp *out_mad; 903 904 int mad_ifc_flags = MLX4_MAD_IFC_IGNORE_KEYS; 904 905 int err = -ENOMEM; 905 906 int jj; ··· 958 959 int __mlx4_ib_query_pkey(struct ib_device *ibdev, u32 port, u16 index, 959 960 u16 *pkey, int netw_view) 960 961 { 961 - struct ib_smp *in_mad = NULL; 962 - struct ib_smp *out_mad = NULL; 962 + struct ib_smp *in_mad; 963 + struct ib_smp *out_mad; 963 964 int mad_ifc_flags = MLX4_MAD_IFC_IGNORE_KEYS; 964 965 int err = -ENOMEM; 965 966 ··· 1974 1975 1975 1976 static int init_node_data(struct mlx4_ib_dev *dev) 1976 1977 { 1977 - struct ib_smp *in_mad = NULL; 1978 - struct ib_smp *out_mad = NULL; 1978 + struct ib_smp *in_mad; 1979 + struct ib_smp *out_mad; 1979 1980 int mad_ifc_flags = MLX4_MAD_IFC_IGNORE_KEYS; 1980 1981 int err = -ENOMEM; 1981 1982 ··· 2622 2623 int num_req_counters; 2623 2624 int allocated; 2624 2625 u32 counter_index; 2625 - struct counter_index *new_counter_index = NULL; 2626 + struct counter_index *new_counter_index; 2626 2627 2627 2628 pr_info_once("%s", mlx4_ib_version); 2628 2629 ··· 2945 2946 { 2946 2947 int err; 2947 2948 size_t flow_size; 2948 - struct ib_flow_attr *flow = NULL; 2949 + struct ib_flow_attr *flow; 2949 2950 struct ib_flow_spec_ib *ib_spec; 2950 2951 2951 2952 if (is_attach) { ··· 2965 2966 2966 2967 err = __mlx4_ib_create_flow(&mqp->ibqp, flow, MLX4_DOMAIN_NIC, 2967 2968 MLX4_FS_REGULAR, &mqp->reg_id); 2968 - } else { 2969 - err = __mlx4_ib_destroy_flow(mdev->dev, mqp->reg_id); 2969 + kfree(flow); 2970 + return err; 2970 2971 } 2971 - kfree(flow); 2972 - return err; 2972 + 2973 + return __mlx4_ib_destroy_flow(mdev->dev, mqp->reg_id); 2973 2974 } 2974 2975 2975 2976 static void mlx4_ib_remove(struct auxiliary_device *adev) ··· 3018 3019 3019 3020 static void do_slave_init(struct mlx4_ib_dev *ibdev, int slave, int do_init) 3020 3021 { 3021 - struct mlx4_ib_demux_work **dm = NULL; 3022 + struct mlx4_ib_demux_work **dm; 3022 3023 struct mlx4_dev *dev = ibdev->dev; 3023 3024 int i; 3024 3025 unsigned long flags;
+2
drivers/infiniband/hw/mlx5/counters.c
··· 27 27 INIT_Q_COUNTER(rx_write_requests), 28 28 INIT_Q_COUNTER(rx_read_requests), 29 29 INIT_Q_COUNTER(rx_atomic_requests), 30 + INIT_Q_COUNTER(rx_dct_connect), 30 31 INIT_Q_COUNTER(out_of_buffer), 31 32 }; 32 33 ··· 47 46 INIT_VPORT_Q_COUNTER(rx_write_requests), 48 47 INIT_VPORT_Q_COUNTER(rx_read_requests), 49 48 INIT_VPORT_Q_COUNTER(rx_atomic_requests), 49 + INIT_VPORT_Q_COUNTER(rx_dct_connect), 50 50 INIT_VPORT_Q_COUNTER(out_of_buffer), 51 51 }; 52 52
+20 -20
drivers/infiniband/hw/mlx5/mad.c
··· 308 308 309 309 int mlx5_query_ext_port_caps(struct mlx5_ib_dev *dev, unsigned int port) 310 310 { 311 - struct ib_smp *in_mad = NULL; 312 - struct ib_smp *out_mad = NULL; 311 + struct ib_smp *in_mad; 312 + struct ib_smp *out_mad; 313 313 int err = -ENOMEM; 314 314 u16 packet_error; 315 315 ··· 338 338 static int mlx5_query_mad_ifc_smp_attr_node_info(struct ib_device *ibdev, 339 339 struct ib_smp *out_mad) 340 340 { 341 - struct ib_smp *in_mad = NULL; 342 - int err = -ENOMEM; 341 + struct ib_smp *in_mad; 342 + int err; 343 343 344 344 in_mad = kzalloc(sizeof(*in_mad), GFP_KERNEL); 345 345 if (!in_mad) ··· 358 358 int mlx5_query_mad_ifc_system_image_guid(struct ib_device *ibdev, 359 359 __be64 *sys_image_guid) 360 360 { 361 - struct ib_smp *out_mad = NULL; 362 - int err = -ENOMEM; 361 + struct ib_smp *out_mad; 362 + int err; 363 363 364 364 out_mad = kmalloc(sizeof(*out_mad), GFP_KERNEL); 365 365 if (!out_mad) ··· 380 380 int mlx5_query_mad_ifc_max_pkeys(struct ib_device *ibdev, 381 381 u16 *max_pkeys) 382 382 { 383 - struct ib_smp *out_mad = NULL; 384 - int err = -ENOMEM; 383 + struct ib_smp *out_mad; 384 + int err; 385 385 386 386 out_mad = kmalloc(sizeof(*out_mad), GFP_KERNEL); 387 387 if (!out_mad) ··· 402 402 int mlx5_query_mad_ifc_vendor_id(struct ib_device *ibdev, 403 403 u32 *vendor_id) 404 404 { 405 - struct ib_smp *out_mad = NULL; 406 - int err = -ENOMEM; 405 + struct ib_smp *out_mad; 406 + int err; 407 407 408 408 out_mad = kmalloc(sizeof(*out_mad), GFP_KERNEL); 409 409 if (!out_mad) ··· 423 423 424 424 int mlx5_query_mad_ifc_node_desc(struct mlx5_ib_dev *dev, char *node_desc) 425 425 { 426 - struct ib_smp *in_mad = NULL; 427 - struct ib_smp *out_mad = NULL; 426 + struct ib_smp *in_mad; 427 + struct ib_smp *out_mad; 428 428 int err = -ENOMEM; 429 429 430 430 in_mad = kzalloc(sizeof(*in_mad), GFP_KERNEL); ··· 448 448 449 449 int mlx5_query_mad_ifc_node_guid(struct mlx5_ib_dev *dev, __be64 *node_guid) 450 450 { 451 - struct ib_smp *in_mad = NULL; 452 - struct ib_smp *out_mad = NULL; 451 + struct ib_smp *in_mad; 452 + struct ib_smp *out_mad; 453 453 int err = -ENOMEM; 454 454 455 455 in_mad = kzalloc(sizeof(*in_mad), GFP_KERNEL); ··· 474 474 int mlx5_query_mad_ifc_pkey(struct ib_device *ibdev, u32 port, u16 index, 475 475 u16 *pkey) 476 476 { 477 - struct ib_smp *in_mad = NULL; 478 - struct ib_smp *out_mad = NULL; 477 + struct ib_smp *in_mad; 478 + struct ib_smp *out_mad; 479 479 int err = -ENOMEM; 480 480 481 481 in_mad = kzalloc(sizeof(*in_mad), GFP_KERNEL); ··· 503 503 int mlx5_query_mad_ifc_gids(struct ib_device *ibdev, u32 port, int index, 504 504 union ib_gid *gid) 505 505 { 506 - struct ib_smp *in_mad = NULL; 507 - struct ib_smp *out_mad = NULL; 506 + struct ib_smp *in_mad; 507 + struct ib_smp *out_mad; 508 508 int err = -ENOMEM; 509 509 510 510 in_mad = kzalloc(sizeof(*in_mad), GFP_KERNEL); ··· 545 545 { 546 546 struct mlx5_ib_dev *dev = to_mdev(ibdev); 547 547 struct mlx5_core_dev *mdev = dev->mdev; 548 - struct ib_smp *in_mad = NULL; 549 - struct ib_smp *out_mad = NULL; 548 + struct ib_smp *in_mad; 549 + struct ib_smp *out_mad; 550 550 int ext_active_speed; 551 551 int err = -ENOMEM; 552 552
+7 -1
drivers/infiniband/hw/mlx5/mr.c
··· 1235 1235 } 1236 1236 1237 1237 /* The pg_access bit allows setting the access flags 1238 - * in the page list submitted with the command. */ 1238 + * in the page list submitted with the command. 1239 + */ 1239 1240 MLX5_SET(create_mkey_in, in, pg_access, !!(pg_cap)); 1240 1241 1241 1242 mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry); ··· 1767 1766 int ret; 1768 1767 1769 1768 add_size = max_t(int, MLX5_UMR_ALIGN - ARCH_KMALLOC_MINALIGN, 0); 1769 + if (is_power_of_2(MLX5_UMR_ALIGN) && add_size) { 1770 + int end = max_t(int, MLX5_UMR_ALIGN, roundup_pow_of_two(size)); 1771 + 1772 + add_size = min_t(int, end - size, add_size); 1773 + } 1770 1774 1771 1775 mr->descs_alloc = kzalloc(size + add_size, GFP_KERNEL); 1772 1776 if (!mr->descs_alloc)
+10 -10
drivers/infiniband/hw/mthca/mthca_provider.c
··· 53 53 static int mthca_query_device(struct ib_device *ibdev, struct ib_device_attr *props, 54 54 struct ib_udata *uhw) 55 55 { 56 - struct ib_smp *in_mad = NULL; 57 - struct ib_smp *out_mad = NULL; 56 + struct ib_smp *in_mad; 57 + struct ib_smp *out_mad; 58 58 int err = -ENOMEM; 59 59 struct mthca_dev *mdev = to_mdev(ibdev); 60 60 ··· 121 121 static int mthca_query_port(struct ib_device *ibdev, 122 122 u32 port, struct ib_port_attr *props) 123 123 { 124 - struct ib_smp *in_mad = NULL; 125 - struct ib_smp *out_mad = NULL; 124 + struct ib_smp *in_mad; 125 + struct ib_smp *out_mad; 126 126 int err = -ENOMEM; 127 127 128 128 in_mad = kzalloc(sizeof *in_mad, GFP_KERNEL); ··· 217 217 static int mthca_query_pkey(struct ib_device *ibdev, 218 218 u32 port, u16 index, u16 *pkey) 219 219 { 220 - struct ib_smp *in_mad = NULL; 221 - struct ib_smp *out_mad = NULL; 220 + struct ib_smp *in_mad; 221 + struct ib_smp *out_mad; 222 222 int err = -ENOMEM; 223 223 224 224 in_mad = kzalloc(sizeof *in_mad, GFP_KERNEL); ··· 246 246 static int mthca_query_gid(struct ib_device *ibdev, u32 port, 247 247 int index, union ib_gid *gid) 248 248 { 249 - struct ib_smp *in_mad = NULL; 250 - struct ib_smp *out_mad = NULL; 249 + struct ib_smp *in_mad; 250 + struct ib_smp *out_mad; 251 251 int err = -ENOMEM; 252 252 253 253 in_mad = kzalloc(sizeof *in_mad, GFP_KERNEL); ··· 989 989 990 990 static int mthca_init_node_data(struct mthca_dev *dev) 991 991 { 992 - struct ib_smp *in_mad = NULL; 993 - struct ib_smp *out_mad = NULL; 992 + struct ib_smp *in_mad; 993 + struct ib_smp *out_mad; 994 994 int err = -ENOMEM; 995 995 996 996 in_mad = kzalloc(sizeof *in_mad, GFP_KERNEL);
+1 -1
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
··· 1277 1277 qp->sq.max_sges = attrs->cap.max_send_sge; 1278 1278 qp->rq.max_sges = attrs->cap.max_recv_sge; 1279 1279 qp->state = OCRDMA_QPS_RST; 1280 - qp->signaled = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR) ? true : false; 1280 + qp->signaled = attrs->sq_sig_type == IB_SIGNAL_ALL_WR; 1281 1281 } 1282 1282 1283 1283 static void ocrdma_store_gsi_qp_cq(struct ocrdma_dev *dev,
-1
drivers/infiniband/hw/qedr/qedr_roce_cm.c
··· 354 354 /* the GSI CQ is handled by the driver so remove it from the FW */ 355 355 qedr_destroy_gsi_cq(dev, attrs); 356 356 dev->gsi_rqcq->cq_type = QEDR_CQ_TYPE_GSI; 357 - dev->gsi_rqcq->cq_type = QEDR_CQ_TYPE_GSI; 358 357 359 358 DP_DEBUG(dev, QEDR_MSG_GSI, "created GSI QP %p\n", qp); 360 359
+1 -1
drivers/infiniband/hw/qedr/verbs.c
··· 1358 1358 1359 1359 qp->prev_wqe_size = 0; 1360 1360 1361 - qp->signaled = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR) ? true : false; 1361 + qp->signaled = attrs->sq_sig_type == IB_SIGNAL_ALL_WR; 1362 1362 qp->dev = dev; 1363 1363 if (qedr_qp_has_sq(qp)) { 1364 1364 qedr_reset_qp_hwq_info(&qp->sq);
+8 -9
drivers/infiniband/hw/qib/qib_file_ops.c
··· 2250 2250 return qib_user_sdma_writev(rcd, pq, iter_iov(from), from->nr_segs); 2251 2251 } 2252 2252 2253 - static struct class *qib_class; 2253 + static const struct class qib_class = { 2254 + .name = "ipath", 2255 + }; 2254 2256 static dev_t qib_dev; 2255 2257 2256 2258 int qib_cdev_init(int minor, const char *name, ··· 2283 2281 goto err_cdev; 2284 2282 } 2285 2283 2286 - device = device_create(qib_class, NULL, dev, NULL, "%s", name); 2284 + device = device_create(&qib_class, NULL, dev, NULL, "%s", name); 2287 2285 if (!IS_ERR(device)) 2288 2286 goto done; 2289 2287 ret = PTR_ERR(device); ··· 2327 2325 goto done; 2328 2326 } 2329 2327 2330 - qib_class = class_create("ipath"); 2331 - if (IS_ERR(qib_class)) { 2332 - ret = PTR_ERR(qib_class); 2328 + ret = class_register(&qib_class); 2329 + if (ret) { 2333 2330 pr_err("Could not create device class (err %d)\n", -ret); 2334 2331 unregister_chrdev_region(qib_dev, QIB_NMINORS); 2335 2332 } ··· 2339 2338 2340 2339 void qib_dev_cleanup(void) 2341 2340 { 2342 - if (qib_class) { 2343 - class_destroy(qib_class); 2344 - qib_class = NULL; 2345 - } 2341 + if (class_is_registered(&qib_class)) 2342 + class_unregister(&qib_class); 2346 2343 2347 2344 unregister_chrdev_region(qib_dev, QIB_NMINORS); 2348 2345 }
+4
drivers/infiniband/sw/rxe/rxe_comp.c
··· 597 597 struct rxe_queue *q = qp->sq.queue; 598 598 int err; 599 599 600 + /* send queue never got created. nothing to do. */ 601 + if (!qp->sq.queue) 602 + return; 603 + 600 604 while ((wqe = queue_head(q, q->type))) { 601 605 if (notify) { 602 606 err = flush_send_wqe(qp, wqe);
-6
drivers/infiniband/sw/rxe/rxe_loc.h
··· 136 136 return IB_MTU_4096; 137 137 } 138 138 139 - static inline int rcv_wqe_size(int max_sge) 140 - { 141 - return sizeof(struct rxe_recv_wqe) + 142 - max_sge * sizeof(struct ib_sge); 143 - } 144 - 145 139 void free_rd_atomic_resource(struct resp_res *res); 146 140 147 141 static inline void rxe_advance_resp_resource(struct rxe_qp *qp)
+108 -51
drivers/infiniband/sw/rxe/rxe_qp.c
··· 183 183 atomic_set(&qp->skb_out, 0); 184 184 } 185 185 186 + static int rxe_init_sq(struct rxe_qp *qp, struct ib_qp_init_attr *init, 187 + struct ib_udata *udata, 188 + struct rxe_create_qp_resp __user *uresp) 189 + { 190 + struct rxe_dev *rxe = to_rdev(qp->ibqp.device); 191 + int wqe_size; 192 + int err; 193 + 194 + qp->sq.max_wr = init->cap.max_send_wr; 195 + wqe_size = max_t(int, init->cap.max_send_sge * sizeof(struct ib_sge), 196 + init->cap.max_inline_data); 197 + qp->sq.max_sge = wqe_size / sizeof(struct ib_sge); 198 + qp->sq.max_inline = wqe_size; 199 + wqe_size += sizeof(struct rxe_send_wqe); 200 + 201 + qp->sq.queue = rxe_queue_init(rxe, &qp->sq.max_wr, wqe_size, 202 + QUEUE_TYPE_FROM_CLIENT); 203 + if (!qp->sq.queue) { 204 + rxe_err_qp(qp, "Unable to allocate send queue"); 205 + err = -ENOMEM; 206 + goto err_out; 207 + } 208 + 209 + /* prepare info for caller to mmap send queue if user space qp */ 210 + err = do_mmap_info(rxe, uresp ? &uresp->sq_mi : NULL, udata, 211 + qp->sq.queue->buf, qp->sq.queue->buf_size, 212 + &qp->sq.queue->ip); 213 + if (err) { 214 + rxe_err_qp(qp, "do_mmap_info failed, err = %d", err); 215 + goto err_free; 216 + } 217 + 218 + /* return actual capabilities to caller which may be larger 219 + * than requested 220 + */ 221 + init->cap.max_send_wr = qp->sq.max_wr; 222 + init->cap.max_send_sge = qp->sq.max_sge; 223 + init->cap.max_inline_data = qp->sq.max_inline; 224 + 225 + return 0; 226 + 227 + err_free: 228 + vfree(qp->sq.queue->buf); 229 + kfree(qp->sq.queue); 230 + qp->sq.queue = NULL; 231 + err_out: 232 + return err; 233 + } 234 + 186 235 static int rxe_qp_init_req(struct rxe_dev *rxe, struct rxe_qp *qp, 187 236 struct ib_qp_init_attr *init, struct ib_udata *udata, 188 237 struct rxe_create_qp_resp __user *uresp) 189 238 { 190 239 int err; 191 - int wqe_size; 192 - enum queue_type type; 240 + 241 + /* if we don't finish qp create make sure queue is valid */ 242 + skb_queue_head_init(&qp->req_pkts); 193 243 194 244 err = sock_create_kern(&init_net, AF_INET, SOCK_DGRAM, 0, &qp->sk); 195 245 if (err < 0) ··· 254 204 * (0xc000 - 0xffff). 255 205 */ 256 206 qp->src_port = RXE_ROCE_V2_SPORT + (hash_32(qp_num(qp), 14) & 0x3fff); 257 - qp->sq.max_wr = init->cap.max_send_wr; 258 207 259 - /* These caps are limited by rxe_qp_chk_cap() done by the caller */ 260 - wqe_size = max_t(int, init->cap.max_send_sge * sizeof(struct ib_sge), 261 - init->cap.max_inline_data); 262 - qp->sq.max_sge = init->cap.max_send_sge = 263 - wqe_size / sizeof(struct ib_sge); 264 - qp->sq.max_inline = init->cap.max_inline_data = wqe_size; 265 - wqe_size += sizeof(struct rxe_send_wqe); 266 - 267 - type = QUEUE_TYPE_FROM_CLIENT; 268 - qp->sq.queue = rxe_queue_init(rxe, &qp->sq.max_wr, 269 - wqe_size, type); 270 - if (!qp->sq.queue) 271 - return -ENOMEM; 272 - 273 - err = do_mmap_info(rxe, uresp ? &uresp->sq_mi : NULL, udata, 274 - qp->sq.queue->buf, qp->sq.queue->buf_size, 275 - &qp->sq.queue->ip); 276 - 277 - if (err) { 278 - vfree(qp->sq.queue->buf); 279 - kfree(qp->sq.queue); 280 - qp->sq.queue = NULL; 208 + err = rxe_init_sq(qp, init, udata, uresp); 209 + if (err) 281 210 return err; 282 - } 283 211 284 212 qp->req.wqe_index = queue_get_producer(qp->sq.queue, 285 213 QUEUE_TYPE_FROM_CLIENT); ··· 276 248 return 0; 277 249 } 278 250 251 + static int rxe_init_rq(struct rxe_qp *qp, struct ib_qp_init_attr *init, 252 + struct ib_udata *udata, 253 + struct rxe_create_qp_resp __user *uresp) 254 + { 255 + struct rxe_dev *rxe = to_rdev(qp->ibqp.device); 256 + int wqe_size; 257 + int err; 258 + 259 + qp->rq.max_wr = init->cap.max_recv_wr; 260 + qp->rq.max_sge = init->cap.max_recv_sge; 261 + wqe_size = sizeof(struct rxe_recv_wqe) + 262 + qp->rq.max_sge*sizeof(struct ib_sge); 263 + 264 + qp->rq.queue = rxe_queue_init(rxe, &qp->rq.max_wr, wqe_size, 265 + QUEUE_TYPE_FROM_CLIENT); 266 + if (!qp->rq.queue) { 267 + rxe_err_qp(qp, "Unable to allocate recv queue"); 268 + err = -ENOMEM; 269 + goto err_out; 270 + } 271 + 272 + /* prepare info for caller to mmap recv queue if user space qp */ 273 + err = do_mmap_info(rxe, uresp ? &uresp->rq_mi : NULL, udata, 274 + qp->rq.queue->buf, qp->rq.queue->buf_size, 275 + &qp->rq.queue->ip); 276 + if (err) { 277 + rxe_err_qp(qp, "do_mmap_info failed, err = %d", err); 278 + goto err_free; 279 + } 280 + 281 + /* return actual capabilities to caller which may be larger 282 + * than requested 283 + */ 284 + init->cap.max_recv_wr = qp->rq.max_wr; 285 + 286 + return 0; 287 + 288 + err_free: 289 + vfree(qp->rq.queue->buf); 290 + kfree(qp->rq.queue); 291 + qp->rq.queue = NULL; 292 + err_out: 293 + return err; 294 + } 295 + 279 296 static int rxe_qp_init_resp(struct rxe_dev *rxe, struct rxe_qp *qp, 280 297 struct ib_qp_init_attr *init, 281 298 struct ib_udata *udata, 282 299 struct rxe_create_qp_resp __user *uresp) 283 300 { 284 301 int err; 285 - int wqe_size; 286 - enum queue_type type; 302 + 303 + /* if we don't finish qp create make sure queue is valid */ 304 + skb_queue_head_init(&qp->resp_pkts); 287 305 288 306 if (!qp->srq) { 289 - qp->rq.max_wr = init->cap.max_recv_wr; 290 - qp->rq.max_sge = init->cap.max_recv_sge; 291 - 292 - wqe_size = rcv_wqe_size(qp->rq.max_sge); 293 - 294 - type = QUEUE_TYPE_FROM_CLIENT; 295 - qp->rq.queue = rxe_queue_init(rxe, &qp->rq.max_wr, 296 - wqe_size, type); 297 - if (!qp->rq.queue) 298 - return -ENOMEM; 299 - 300 - err = do_mmap_info(rxe, uresp ? &uresp->rq_mi : NULL, udata, 301 - qp->rq.queue->buf, qp->rq.queue->buf_size, 302 - &qp->rq.queue->ip); 303 - if (err) { 304 - vfree(qp->rq.queue->buf); 305 - kfree(qp->rq.queue); 306 - qp->rq.queue = NULL; 307 + err = rxe_init_rq(qp, init, udata, uresp); 308 + if (err) 307 309 return err; 308 - } 309 310 } 310 311 311 312 rxe_init_task(&qp->resp.task, qp, rxe_responder); ··· 364 307 if (srq) 365 308 rxe_get(srq); 366 309 367 - qp->pd = pd; 368 - qp->rcq = rcq; 369 - qp->scq = scq; 370 - qp->srq = srq; 310 + qp->pd = pd; 311 + qp->rcq = rcq; 312 + qp->scq = scq; 313 + qp->srq = srq; 371 314 372 315 atomic_inc(&rcq->num_wq); 373 316 atomic_inc(&scq->num_wq);
+27 -22
drivers/infiniband/sw/rxe/rxe_req.c
··· 578 578 struct rxe_send_wqe *rollback_wqe, 579 579 u32 *rollback_psn) 580 580 { 581 - rollback_wqe->state = wqe->state; 581 + rollback_wqe->state = wqe->state; 582 582 rollback_wqe->first_psn = wqe->first_psn; 583 - rollback_wqe->last_psn = wqe->last_psn; 584 - *rollback_psn = qp->req.psn; 583 + rollback_wqe->last_psn = wqe->last_psn; 584 + rollback_wqe->dma = wqe->dma; 585 + *rollback_psn = qp->req.psn; 585 586 } 586 587 587 588 static void rollback_state(struct rxe_send_wqe *wqe, ··· 590 589 struct rxe_send_wqe *rollback_wqe, 591 590 u32 rollback_psn) 592 591 { 593 - wqe->state = rollback_wqe->state; 592 + wqe->state = rollback_wqe->state; 594 593 wqe->first_psn = rollback_wqe->first_psn; 595 - wqe->last_psn = rollback_wqe->last_psn; 596 - qp->req.psn = rollback_psn; 594 + wqe->last_psn = rollback_wqe->last_psn; 595 + wqe->dma = rollback_wqe->dma; 596 + qp->req.psn = rollback_psn; 597 597 } 598 598 599 599 static void update_state(struct rxe_qp *qp, struct rxe_pkt_info *pkt) ··· 799 797 pkt.mask = rxe_opcode[opcode].mask; 800 798 pkt.wqe = wqe; 801 799 800 + /* save wqe state before we build and send packet */ 801 + save_state(wqe, qp, &rollback_wqe, &rollback_psn); 802 + 802 803 av = rxe_get_av(&pkt, &ah); 803 804 if (unlikely(!av)) { 804 805 rxe_dbg_qp(qp, "Failed no address vector\n"); ··· 834 829 if (ah) 835 830 rxe_put(ah); 836 831 837 - /* 838 - * To prevent a race on wqe access between requester and completer, 839 - * wqe members state and psn need to be set before calling 840 - * rxe_xmit_packet(). 841 - * Otherwise, completer might initiate an unjustified retry flow. 842 - */ 843 - save_state(wqe, qp, &rollback_wqe, &rollback_psn); 832 + /* update wqe state as though we had sent it */ 844 833 update_wqe_state(qp, wqe, &pkt); 845 834 update_wqe_psn(qp, wqe, &pkt, payload); 846 835 847 836 err = rxe_xmit_packet(qp, &pkt, skb); 848 837 if (err) { 849 - qp->need_req_skb = 1; 850 - 851 - rollback_state(wqe, qp, &rollback_wqe, rollback_psn); 852 - 853 - if (err == -EAGAIN) { 854 - rxe_sched_task(&qp->req.task); 855 - goto exit; 838 + if (err != -EAGAIN) { 839 + wqe->status = IB_WC_LOC_QP_OP_ERR; 840 + goto err; 856 841 } 857 842 858 - wqe->status = IB_WC_LOC_QP_OP_ERR; 859 - goto err; 843 + /* the packet was dropped so reset wqe to the state 844 + * before we sent it so we can try to resend 845 + */ 846 + rollback_state(wqe, qp, &rollback_wqe, rollback_psn); 847 + 848 + /* force a delay until the dropped packet is freed and 849 + * the send queue is drained below the low water mark 850 + */ 851 + qp->need_req_skb = 1; 852 + 853 + rxe_sched_task(&qp->req.task); 854 + goto exit; 860 855 } 861 856 862 857 update_state(qp, &pkt);
+4
drivers/infiniband/sw/rxe/rxe_resp.c
··· 1469 1469 return; 1470 1470 } 1471 1471 1472 + /* recv queue not created. nothing to do. */ 1473 + if (!qp->rq.queue) 1474 + return; 1475 + 1472 1476 while ((wqe = queue_head(q, q->type))) { 1473 1477 if (notify) { 1474 1478 err = flush_recv_wqe(qp, wqe);
+36 -24
drivers/infiniband/sw/rxe/rxe_srq.c
··· 45 45 struct ib_srq_init_attr *init, struct ib_udata *udata, 46 46 struct rxe_create_srq_resp __user *uresp) 47 47 { 48 - int err; 49 - int srq_wqe_size; 50 48 struct rxe_queue *q; 51 - enum queue_type type; 49 + int wqe_size; 50 + int err; 52 51 53 - srq->ibsrq.event_handler = init->event_handler; 54 - srq->ibsrq.srq_context = init->srq_context; 55 - srq->limit = init->attr.srq_limit; 56 - srq->srq_num = srq->elem.index; 57 - srq->rq.max_wr = init->attr.max_wr; 58 - srq->rq.max_sge = init->attr.max_sge; 52 + srq->ibsrq.event_handler = init->event_handler; 53 + srq->ibsrq.srq_context = init->srq_context; 54 + srq->limit = init->attr.srq_limit; 55 + srq->srq_num = srq->elem.index; 56 + srq->rq.max_wr = init->attr.max_wr; 57 + srq->rq.max_sge = init->attr.max_sge; 59 58 60 - srq_wqe_size = rcv_wqe_size(srq->rq.max_sge); 59 + wqe_size = sizeof(struct rxe_recv_wqe) + 60 + srq->rq.max_sge*sizeof(struct ib_sge); 61 61 62 62 spin_lock_init(&srq->rq.producer_lock); 63 63 spin_lock_init(&srq->rq.consumer_lock); 64 64 65 - type = QUEUE_TYPE_FROM_CLIENT; 66 - q = rxe_queue_init(rxe, &srq->rq.max_wr, srq_wqe_size, type); 65 + q = rxe_queue_init(rxe, &srq->rq.max_wr, wqe_size, 66 + QUEUE_TYPE_FROM_CLIENT); 67 67 if (!q) { 68 68 rxe_dbg_srq(srq, "Unable to allocate queue\n"); 69 - return -ENOMEM; 69 + err = -ENOMEM; 70 + goto err_out; 70 71 } 71 - 72 - srq->rq.queue = q; 73 72 74 73 err = do_mmap_info(rxe, uresp ? &uresp->mi : NULL, udata, q->buf, 75 74 q->buf_size, &q->ip); 76 75 if (err) { 77 - vfree(q->buf); 78 - kfree(q); 79 - return err; 76 + rxe_dbg_srq(srq, "Unable to init mmap info for caller\n"); 77 + goto err_free; 80 78 } 79 + 80 + srq->rq.queue = q; 81 + init->attr.max_wr = srq->rq.max_wr; 81 82 82 83 if (uresp) { 83 84 if (copy_to_user(&uresp->srq_num, &srq->srq_num, ··· 89 88 } 90 89 91 90 return 0; 91 + 92 + err_free: 93 + vfree(q->buf); 94 + kfree(q); 95 + err_out: 96 + return err; 92 97 } 93 98 94 99 int rxe_srq_chk_attr(struct rxe_dev *rxe, struct rxe_srq *srq, ··· 152 145 struct ib_srq_attr *attr, enum ib_srq_attr_mask mask, 153 146 struct rxe_modify_srq_cmd *ucmd, struct ib_udata *udata) 154 147 { 155 - int err; 156 148 struct rxe_queue *q = srq->rq.queue; 157 149 struct mminfo __user *mi = NULL; 150 + int wqe_size; 151 + int err; 158 152 159 153 if (mask & IB_SRQ_MAX_WR) { 160 154 /* ··· 164 156 */ 165 157 mi = u64_to_user_ptr(ucmd->mmap_info_addr); 166 158 167 - err = rxe_queue_resize(q, &attr->max_wr, 168 - rcv_wqe_size(srq->rq.max_sge), udata, mi, 169 - &srq->rq.producer_lock, 159 + wqe_size = sizeof(struct rxe_recv_wqe) + 160 + srq->rq.max_sge*sizeof(struct ib_sge); 161 + 162 + err = rxe_queue_resize(q, &attr->max_wr, wqe_size, 163 + udata, mi, &srq->rq.producer_lock, 170 164 &srq->rq.consumer_lock); 171 165 if (err) 172 - goto err2; 166 + goto err_free; 167 + 168 + srq->rq.max_wr = attr->max_wr; 173 169 } 174 170 175 171 if (mask & IB_SRQ_LIMIT) ··· 181 169 182 170 return 0; 183 171 184 - err2: 172 + err_free: 185 173 rxe_queue_cleanup(q); 186 174 srq->rq.queue = NULL; 187 175 return err;
-1
drivers/infiniband/sw/rxe/rxe_verbs.c
··· 798 798 rxe_err_qp(qp, "unsupported wr opcode %d", 799 799 wr->opcode); 800 800 return -EINVAL; 801 - break; 802 801 } 803 802 } 804 803
+3 -1
drivers/infiniband/sw/siw/siw.h
··· 74 74 75 75 u32 vendor_part_id; 76 76 int numa_node; 77 + char raw_gid[ETH_ALEN]; 77 78 78 79 /* physical port state (only one port per device) */ 79 80 enum ib_port_state state; ··· 531 530 void siw_qp_llp_write_space(struct sock *sk); 532 531 533 532 /* QP TX path functions */ 533 + int siw_create_tx_threads(void); 534 + void siw_stop_tx_threads(void); 534 535 int siw_run_sq(void *arg); 535 536 int siw_qp_sq_process(struct siw_qp *qp); 536 537 int siw_sq_start(struct siw_qp *qp); 537 538 int siw_activate_tx(struct siw_qp *qp); 538 - void siw_stop_tx_thread(int nr_cpu); 539 539 int siw_get_tx_cpu(struct siw_device *sdev); 540 540 void siw_put_tx_cpu(int cpu); 541 541
-1
drivers/infiniband/sw/siw/siw_cm.c
··· 1501 1501 1502 1502 cep->cm_id = NULL; 1503 1503 id->rem_ref(id); 1504 - siw_cep_put(cep); 1505 1504 1506 1505 qp->cep = NULL; 1507 1506 siw_cep_put(cep);
+11 -51
drivers/infiniband/sw/siw/siw_main.c
··· 75 75 return rv; 76 76 } 77 77 78 - siw_dbg(base_dev, "HWaddr=%pM\n", sdev->netdev->dev_addr); 79 - 78 + siw_dbg(base_dev, "HWaddr=%pM\n", sdev->raw_gid); 80 79 return 0; 81 80 } 82 81 ··· 85 86 86 87 xa_destroy(&sdev->qp_xa); 87 88 xa_destroy(&sdev->mem_xa); 88 - } 89 - 90 - static int siw_create_tx_threads(void) 91 - { 92 - int cpu, assigned = 0; 93 - 94 - for_each_online_cpu(cpu) { 95 - /* Skip HT cores */ 96 - if (cpu % cpumask_weight(topology_sibling_cpumask(cpu))) 97 - continue; 98 - 99 - siw_tx_thread[cpu] = 100 - kthread_run_on_cpu(siw_run_sq, 101 - (unsigned long *)(long)cpu, 102 - cpu, "siw_tx/%u"); 103 - if (IS_ERR(siw_tx_thread[cpu])) { 104 - siw_tx_thread[cpu] = NULL; 105 - continue; 106 - } 107 - 108 - assigned++; 109 - } 110 - return assigned; 111 89 } 112 90 113 91 static int siw_dev_qualified(struct net_device *netdev) ··· 289 313 return NULL; 290 314 291 315 base_dev = &sdev->base_dev; 292 - 293 316 sdev->netdev = netdev; 294 317 295 - if (netdev->type != ARPHRD_LOOPBACK && netdev->type != ARPHRD_NONE) { 296 - addrconf_addr_eui48((unsigned char *)&base_dev->node_guid, 297 - netdev->dev_addr); 318 + if (netdev->addr_len) { 319 + memcpy(sdev->raw_gid, netdev->dev_addr, 320 + min_t(unsigned int, netdev->addr_len, ETH_ALEN)); 298 321 } else { 299 322 /* 300 - * This device does not have a HW address, 301 - * but connection mangagement lib expects gid != 0 323 + * This device does not have a HW address, but 324 + * connection mangagement requires a unique gid. 302 325 */ 303 - size_t len = min_t(size_t, strlen(base_dev->name), 6); 304 - char addr[6] = { }; 305 - 306 - memcpy(addr, base_dev->name, len); 307 - addrconf_addr_eui48((unsigned char *)&base_dev->node_guid, 308 - addr); 326 + eth_random_addr(sdev->raw_gid); 309 327 } 328 + addrconf_addr_eui48((u8 *)&base_dev->node_guid, sdev->raw_gid); 310 329 311 330 base_dev->uverbs_cmd_mask |= BIT_ULL(IB_USER_VERBS_CMD_POST_SEND); 312 331 ··· 506 535 static __init int siw_init_module(void) 507 536 { 508 537 int rv; 509 - int nr_cpu; 510 538 511 539 if (SENDPAGE_THRESH < SIW_MAX_INLINE) { 512 540 pr_info("siw: sendpage threshold too small: %u\n", ··· 550 580 return 0; 551 581 552 582 out_error: 553 - for (nr_cpu = 0; nr_cpu < nr_cpu_ids; nr_cpu++) { 554 - if (siw_tx_thread[nr_cpu]) { 555 - siw_stop_tx_thread(nr_cpu); 556 - siw_tx_thread[nr_cpu] = NULL; 557 - } 558 - } 583 + siw_stop_tx_threads(); 584 + 559 585 if (siw_crypto_shash) 560 586 crypto_free_shash(siw_crypto_shash); 561 587 ··· 565 599 566 600 static void __exit siw_exit_module(void) 567 601 { 568 - int cpu; 602 + siw_stop_tx_threads(); 569 603 570 - for_each_possible_cpu(cpu) { 571 - if (siw_tx_thread[cpu]) { 572 - siw_stop_tx_thread(cpu); 573 - siw_tx_thread[cpu] = NULL; 574 - } 575 - } 576 604 unregister_netdevice_notifier(&siw_netdev_nb); 577 605 rdma_link_unregister(&siw_link_ops); 578 606 ib_unregister_driver(RDMA_DRIVER_SIW);
+2 -2
drivers/infiniband/sw/siw/siw_qp.c
··· 204 204 { 205 205 if (irq_size) { 206 206 irq_size = roundup_pow_of_two(irq_size); 207 - qp->irq = vzalloc(irq_size * sizeof(struct siw_sqe)); 207 + qp->irq = vcalloc(irq_size, sizeof(struct siw_sqe)); 208 208 if (!qp->irq) { 209 209 qp->attrs.irq_size = 0; 210 210 return -ENOMEM; ··· 212 212 } 213 213 if (orq_size) { 214 214 orq_size = roundup_pow_of_two(orq_size); 215 - qp->orq = vzalloc(orq_size * sizeof(struct siw_sqe)); 215 + qp->orq = vcalloc(orq_size, sizeof(struct siw_sqe)); 216 216 if (!qp->orq) { 217 217 qp->attrs.orq_size = 0; 218 218 qp->attrs.irq_size = 0;
+39 -13
drivers/infiniband/sw/siw/siw_qp_tx.c
··· 1208 1208 1209 1209 static DEFINE_PER_CPU(struct tx_task_t, siw_tx_task_g); 1210 1210 1211 - void siw_stop_tx_thread(int nr_cpu) 1211 + int siw_create_tx_threads(void) 1212 1212 { 1213 - kthread_stop(siw_tx_thread[nr_cpu]); 1214 - wake_up(&per_cpu(siw_tx_task_g, nr_cpu).waiting); 1213 + int cpu, assigned = 0; 1214 + 1215 + for_each_online_cpu(cpu) { 1216 + struct tx_task_t *tx_task; 1217 + 1218 + /* Skip HT cores */ 1219 + if (cpu % cpumask_weight(topology_sibling_cpumask(cpu))) 1220 + continue; 1221 + 1222 + tx_task = &per_cpu(siw_tx_task_g, cpu); 1223 + init_llist_head(&tx_task->active); 1224 + init_waitqueue_head(&tx_task->waiting); 1225 + 1226 + siw_tx_thread[cpu] = 1227 + kthread_run_on_cpu(siw_run_sq, 1228 + (unsigned long *)(long)cpu, 1229 + cpu, "siw_tx/%u"); 1230 + if (IS_ERR(siw_tx_thread[cpu])) { 1231 + siw_tx_thread[cpu] = NULL; 1232 + continue; 1233 + } 1234 + assigned++; 1235 + } 1236 + return assigned; 1237 + } 1238 + 1239 + void siw_stop_tx_threads(void) 1240 + { 1241 + int cpu; 1242 + 1243 + for_each_possible_cpu(cpu) { 1244 + if (siw_tx_thread[cpu]) { 1245 + kthread_stop(siw_tx_thread[cpu]); 1246 + wake_up(&per_cpu(siw_tx_task_g, cpu).waiting); 1247 + siw_tx_thread[cpu] = NULL; 1248 + } 1249 + } 1215 1250 } 1216 1251 1217 1252 int siw_run_sq(void *data) ··· 1255 1220 struct llist_node *active; 1256 1221 struct siw_qp *qp; 1257 1222 struct tx_task_t *tx_task = &per_cpu(siw_tx_task_g, nr_cpu); 1258 - 1259 - init_llist_head(&tx_task->active); 1260 - init_waitqueue_head(&tx_task->waiting); 1261 1223 1262 1224 while (1) { 1263 1225 struct llist_node *fifo_list = NULL; ··· 1271 1239 * llist_del_all returns a list with newest entry first. 1272 1240 * Re-order list for fairness among QP's. 1273 1241 */ 1274 - while (active) { 1275 - struct llist_node *tmp = active; 1276 - 1277 - active = llist_next(active); 1278 - tmp->next = fifo_list; 1279 - fifo_list = tmp; 1280 - } 1242 + fifo_list = llist_reverse_order(active); 1281 1243 while (fifo_list) { 1282 1244 qp = container_of(fifo_list, struct siw_qp, tx_list); 1283 1245 fifo_list = llist_next(fifo_list);
+6 -6
drivers/infiniband/sw/siw/siw_verbs.c
··· 157 157 attr->vendor_part_id = sdev->vendor_part_id; 158 158 159 159 addrconf_addr_eui48((u8 *)&attr->sys_image_guid, 160 - sdev->netdev->dev_addr); 160 + sdev->raw_gid); 161 161 162 162 return 0; 163 163 } ··· 218 218 219 219 /* subnet_prefix == interface_id == 0; */ 220 220 memset(gid, 0, sizeof(*gid)); 221 - memcpy(&gid->raw[0], sdev->netdev->dev_addr, 6); 221 + memcpy(gid->raw, sdev->raw_gid, ETH_ALEN); 222 222 223 223 return 0; 224 224 } ··· 381 381 if (udata) 382 382 qp->sendq = vmalloc_user(num_sqe * sizeof(struct siw_sqe)); 383 383 else 384 - qp->sendq = vzalloc(num_sqe * sizeof(struct siw_sqe)); 384 + qp->sendq = vcalloc(num_sqe, sizeof(struct siw_sqe)); 385 385 386 386 if (qp->sendq == NULL) { 387 387 rv = -ENOMEM; ··· 414 414 qp->recvq = 415 415 vmalloc_user(num_rqe * sizeof(struct siw_rqe)); 416 416 else 417 - qp->recvq = vzalloc(num_rqe * sizeof(struct siw_rqe)); 417 + qp->recvq = vcalloc(num_rqe, sizeof(struct siw_rqe)); 418 418 419 419 if (qp->recvq == NULL) { 420 420 rv = -ENOMEM; ··· 1494 1494 1495 1495 if (pbl->max_buf < num_sle) { 1496 1496 siw_dbg_mem(mem, "too many SGE's: %d > %d\n", 1497 - mem->pbl->max_buf, num_sle); 1497 + num_sle, pbl->max_buf); 1498 1498 return -ENOMEM; 1499 1499 } 1500 1500 for_each_sg(sl, slp, num_sle, i) { ··· 1624 1624 srq->recvq = 1625 1625 vmalloc_user(srq->num_rqe * sizeof(struct siw_rqe)); 1626 1626 else 1627 - srq->recvq = vzalloc(srq->num_rqe * sizeof(struct siw_rqe)); 1627 + srq->recvq = vcalloc(srq->num_rqe, sizeof(struct siw_rqe)); 1628 1628 1629 1629 if (srq->recvq == NULL) { 1630 1630 rv = -ENOMEM;
+2
drivers/infiniband/ulp/isert/ib_isert.c
··· 2570 2570 isert_put_unsol_pending_cmds(conn); 2571 2571 isert_wait4cmds(conn); 2572 2572 isert_wait4logout(isert_conn); 2573 + 2574 + queue_work(isert_release_wq, &isert_conn->release_work); 2573 2575 } 2574 2576 2575 2577 static void isert_free_conn(struct iscsit_conn *conn)
+11 -8
drivers/infiniband/ulp/rtrs/rtrs-clt.c
··· 45 45 }; 46 46 47 47 static struct workqueue_struct *rtrs_wq; 48 - static struct class *rtrs_clt_dev_class; 48 + static const struct class rtrs_clt_dev_class = { 49 + .name = "rtrs-client", 50 + }; 49 51 50 52 static inline bool rtrs_clt_is_connected(const struct rtrs_clt_sess *clt) 51 53 { ··· 2700 2698 return ERR_PTR(-ENOMEM); 2701 2699 } 2702 2700 2703 - clt->dev.class = rtrs_clt_dev_class; 2701 + clt->dev.class = &rtrs_clt_dev_class; 2704 2702 clt->dev.release = rtrs_clt_dev_release; 2705 2703 uuid_gen(&clt->paths_uuid); 2706 2704 INIT_LIST_HEAD_RCU(&clt->paths_list); ··· 3153 3151 3154 3152 static int __init rtrs_client_init(void) 3155 3153 { 3156 - rtrs_rdma_dev_pd_init(0, &dev_pd); 3154 + int ret = 0; 3157 3155 3158 - rtrs_clt_dev_class = class_create("rtrs-client"); 3159 - if (IS_ERR(rtrs_clt_dev_class)) { 3156 + rtrs_rdma_dev_pd_init(0, &dev_pd); 3157 + ret = class_register(&rtrs_clt_dev_class); 3158 + if (ret) { 3160 3159 pr_err("Failed to create rtrs-client dev class\n"); 3161 - return PTR_ERR(rtrs_clt_dev_class); 3160 + return ret; 3162 3161 } 3163 3162 rtrs_wq = alloc_workqueue("rtrs_client_wq", 0, 0); 3164 3163 if (!rtrs_wq) { 3165 - class_destroy(rtrs_clt_dev_class); 3164 + class_unregister(&rtrs_clt_dev_class); 3166 3165 return -ENOMEM; 3167 3166 } 3168 3167 ··· 3173 3170 static void __exit rtrs_client_exit(void) 3174 3171 { 3175 3172 destroy_workqueue(rtrs_wq); 3176 - class_destroy(rtrs_clt_dev_class); 3173 + class_unregister(&rtrs_clt_dev_class); 3177 3174 rtrs_rdma_dev_pd_deinit(&dev_pd); 3178 3175 } 3179 3176
+1 -1
drivers/infiniband/ulp/rtrs/rtrs-srv-sysfs.c
··· 164 164 */ 165 165 goto unlock; 166 166 } 167 - srv->dev.class = rtrs_dev_class; 167 + srv->dev.class = &rtrs_dev_class; 168 168 err = dev_set_name(&srv->dev, "%s", srv_path->s.sessname); 169 169 if (err) 170 170 goto unlock;
+8 -7
drivers/infiniband/ulp/rtrs/rtrs-srv.c
··· 27 27 #define MAX_HDR_SIZE PAGE_SIZE 28 28 29 29 static struct rtrs_rdma_dev_pd dev_pd; 30 - struct class *rtrs_dev_class; 30 + const struct class rtrs_dev_class = { 31 + .name = "rtrs-server", 32 + }; 31 33 static struct rtrs_srv_ib_ctx ib_ctx; 32 34 33 35 static int __read_mostly max_chunk_size = DEFAULT_MAX_CHUNK_SIZE; ··· 2255 2253 err); 2256 2254 return err; 2257 2255 } 2258 - rtrs_dev_class = class_create("rtrs-server"); 2259 - if (IS_ERR(rtrs_dev_class)) { 2260 - err = PTR_ERR(rtrs_dev_class); 2256 + err = class_register(&rtrs_dev_class); 2257 + if (err) 2261 2258 goto out_err; 2262 - } 2259 + 2263 2260 rtrs_wq = alloc_workqueue("rtrs_server_wq", 0, 0); 2264 2261 if (!rtrs_wq) { 2265 2262 err = -ENOMEM; ··· 2268 2267 return 0; 2269 2268 2270 2269 out_dev_class: 2271 - class_destroy(rtrs_dev_class); 2270 + class_unregister(&rtrs_dev_class); 2272 2271 out_err: 2273 2272 return err; 2274 2273 } ··· 2276 2275 static void __exit rtrs_server_exit(void) 2277 2276 { 2278 2277 destroy_workqueue(rtrs_wq); 2279 - class_destroy(rtrs_dev_class); 2278 + class_unregister(&rtrs_dev_class); 2280 2279 rtrs_rdma_dev_pd_deinit(&dev_pd); 2281 2280 } 2282 2281
+1 -1
drivers/infiniband/ulp/rtrs/rtrs-srv.h
··· 129 129 int ib_dev_count; 130 130 }; 131 131 132 - extern struct class *rtrs_dev_class; 132 + extern const struct class rtrs_dev_class; 133 133 134 134 void close_path(struct rtrs_srv_path *srv_path); 135 135
+54
drivers/net/ethernet/broadcom/bnxt/bnxt_hsi.h
··· 3721 3721 u8 valid; 3722 3722 }; 3723 3723 3724 + /* hwrm_func_dbr_pacing_qcfg_input (size:128b/16B) */ 3725 + struct hwrm_func_dbr_pacing_qcfg_input { 3726 + __le16 req_type; 3727 + __le16 cmpl_ring; 3728 + __le16 seq_id; 3729 + __le16 target_id; 3730 + __le64 resp_addr; 3731 + }; 3732 + 3733 + /* hwrm_func_dbr_pacing_qcfg_output (size:512b/64B) */ 3734 + struct hwrm_func_dbr_pacing_qcfg_output { 3735 + __le16 error_code; 3736 + __le16 req_type; 3737 + __le16 seq_id; 3738 + __le16 resp_len; 3739 + u8 flags; 3740 + #define FUNC_DBR_PACING_QCFG_RESP_FLAGS_DBR_NQ_EVENT_ENABLED 0x1UL 3741 + u8 unused_0[7]; 3742 + __le32 dbr_stat_db_fifo_reg; 3743 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_MASK 0x3UL 3744 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_SFT 0 3745 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_PCIE_CFG 0x0UL 3746 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_GRC 0x1UL 3747 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_BAR0 0x2UL 3748 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_BAR1 0x3UL 3749 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_LAST \ 3750 + FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SPACE_BAR1 3751 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_MASK 0xfffffffcUL 3752 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_STAT_DB_FIFO_REG_ADDR_SFT 2 3753 + __le32 dbr_stat_db_fifo_reg_watermark_mask; 3754 + u8 dbr_stat_db_fifo_reg_watermark_shift; 3755 + u8 unused_1[3]; 3756 + __le32 dbr_stat_db_fifo_reg_fifo_room_mask; 3757 + u8 dbr_stat_db_fifo_reg_fifo_room_shift; 3758 + u8 unused_2[3]; 3759 + __le32 dbr_throttling_aeq_arm_reg; 3760 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_THROTTLING_AEQ_ARM_REG_ADDR_SPACE_MASK 0x3UL 3761 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_THROTTLING_AEQ_ARM_REG_ADDR_SPACE_SFT 0 3762 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_THROTTLING_AEQ_ARM_REG_ADDR_SPACE_PCIE_CFG 0x0UL 3763 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_THROTTLING_AEQ_ARM_REG_ADDR_SPACE_GRC 0x1UL 3764 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_THROTTLING_AEQ_ARM_REG_ADDR_SPACE_BAR0 0x2UL 3765 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_THROTTLING_AEQ_ARM_REG_ADDR_SPACE_BAR1 0x3UL 3766 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_THROTTLING_AEQ_ARM_REG_ADDR_SPACE_LAST \ 3767 + FUNC_DBR_PACING_QCFG_RESP_DBR_THROTTLING_AEQ_ARM_REG_ADDR_SPACE_BAR1 3768 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_THROTTLING_AEQ_ARM_REG_ADDR_MASK 0xfffffffcUL 3769 + #define FUNC_DBR_PACING_QCFG_RESP_DBR_THROTTLING_AEQ_ARM_REG_ADDR_SFT 2 3770 + u8 dbr_throttling_aeq_arm_reg_val; 3771 + u8 unused_3[7]; 3772 + __le32 primary_nq_id; 3773 + __le32 pacing_threshold; 3774 + u8 unused_4[7]; 3775 + u8 valid; 3776 + }; 3777 + 3724 3778 /* hwrm_func_drv_if_change_input (size:192b/24B) */ 3725 3779 struct hwrm_func_drv_if_change_input { 3726 3780 __le16 req_type;
+1 -1
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.c
··· 345 345 edev->hw_ring_stats_size = bp->hw_ring_stats_size; 346 346 edev->pf_port_id = bp->pf.port_id; 347 347 edev->en_state = bp->state; 348 - 348 + edev->bar0 = bp->bar0; 349 349 edev->ulp_tbl->msix_requested = bnxt_get_ulp_msix_num(bp); 350 350 } 351 351
+1
drivers/net/ethernet/broadcom/bnxt/bnxt_ulp.h
··· 81 81 * mode only. Will be 82 82 * updated in resume. 83 83 */ 84 + void __iomem *bar0; 84 85 }; 85 86 86 87 static inline bool bnxt_ulp_registered(struct bnxt_en_dev *edev)
-2
include/rdma/ib_verbs.h
··· 4440 4440 const struct sockaddr *addr); 4441 4441 int ib_device_set_netdev(struct ib_device *ib_dev, struct net_device *ndev, 4442 4442 unsigned int port); 4443 - struct net_device *ib_device_netdev(struct ib_device *dev, u32 port); 4444 - 4445 4443 struct ib_wq *ib_create_wq(struct ib_pd *pd, 4446 4444 struct ib_wq_init_attr *init_attr); 4447 4445 int ib_destroy_wq_user(struct ib_wq *wq, struct ib_udata *udata);
-21
include/rdma/iw_cm.h
··· 115 115 void iw_destroy_cm_id(struct iw_cm_id *cm_id); 116 116 117 117 /** 118 - * iw_cm_bind_qp - Unbind the specified IW CM identifier and QP 119 - * 120 - * @cm_id: The IW CM idenfier to unbind from the QP. 121 - * @qp: The QP 122 - * 123 - * This is called by the provider when destroying the QP to ensure 124 - * that any references held by the IWCM are released. It may also 125 - * be called by the IWCM when destroying a CM_ID to that any 126 - * references held by the provider are released. 127 - */ 128 - void iw_cm_unbind_qp(struct iw_cm_id *cm_id, struct ib_qp *qp); 129 - 130 - /** 131 - * iw_cm_get_qp - Return the ib_qp associated with a QPN 132 - * 133 - * @ib_device: The IB device 134 - * @qpn: The queue pair number 135 - */ 136 - struct ib_qp *iw_cm_get_qp(struct ib_device *device, int qpn); 137 - 138 - /** 139 118 * iw_cm_listen - Listen for incoming connection requests on the 140 119 * specified IW CM id. 141 120 *
+7
include/uapi/rdma/bnxt_re-abi.h
··· 53 53 BNXT_RE_UCNTX_CMASK_HAVE_CCTX = 0x1ULL, 54 54 BNXT_RE_UCNTX_CMASK_HAVE_MODE = 0x02ULL, 55 55 BNXT_RE_UCNTX_CMASK_WC_DPI_ENABLED = 0x04ULL, 56 + BNXT_RE_UCNTX_CMASK_DBR_PACING_ENABLED = 0x08ULL, 56 57 }; 57 58 58 59 enum bnxt_re_wqe_mode { ··· 132 131 133 132 enum bnxt_re_objects { 134 133 BNXT_RE_OBJECT_ALLOC_PAGE = (1U << UVERBS_ID_NS_SHIFT), 134 + BNXT_RE_OBJECT_NOTIFY_DRV, 135 135 }; 136 136 137 137 enum bnxt_re_alloc_page_type { 138 138 BNXT_RE_ALLOC_WC_PAGE = 0, 139 + BNXT_RE_ALLOC_DBR_BAR_PAGE, 140 + BNXT_RE_ALLOC_DBR_PAGE, 139 141 }; 140 142 141 143 enum bnxt_re_var_alloc_page_attrs { ··· 158 154 BNXT_RE_METHOD_DESTROY_PAGE, 159 155 }; 160 156 157 + enum bnxt_re_notify_drv_methods { 158 + BNXT_RE_METHOD_NOTIFY_DRV = (1U << UVERBS_ID_NS_SHIFT), 159 + }; 161 160 #endif /* __BNXT_RE_UVERBS_ABI_H__*/
+9
include/uapi/rdma/irdma-abi.h
··· 22 22 IRDMA_MEMREG_TYPE_CQ = 2, 23 23 }; 24 24 25 + enum { 26 + IRDMA_ALLOC_UCTX_USE_RAW_ATTR = 1 << 0, 27 + IRDMA_ALLOC_UCTX_MIN_HW_WQ_SIZE = 1 << 1, 28 + }; 29 + 25 30 struct irdma_alloc_ucontext_req { 26 31 __u32 rsvd32; 27 32 __u8 userspace_ver; 28 33 __u8 rsvd8[3]; 34 + __aligned_u64 comp_mask; 29 35 }; 30 36 31 37 struct irdma_alloc_ucontext_resp { ··· 52 46 __u16 max_hw_sq_chunk; 53 47 __u8 hw_rev; 54 48 __u8 rsvd2; 49 + __aligned_u64 comp_mask; 50 + __u16 min_hw_wq_size; 51 + __u8 rsvd3[6]; 55 52 }; 56 53 57 54 struct irdma_alloc_pd_resp {