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/dledford/rdma

Pull rdma fixes from Doug Ledford:
"This is the second batch of queued up rdma patches for this rc cycle.

There isn't anything really major in here. It's passed 0day,
linux-next, and local testing across a wide variety of hardware.
There are still a few known issues to be tracked down, but this should
amount to the vast majority of the rdma RC fixes.

Round two of 4.7 rc fixes:

- A couple minor fixes to the rdma core
- Multiple minor fixes to hfi1
- Multiple minor fixes to mlx4/mlx4
- A few minor fixes to i40iw"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma: (31 commits)
IB/srpt: Reduce QP buffer size
i40iw: Enable level-1 PBL for fast memory registration
i40iw: Return correct max_fast_reg_page_list_len
i40iw: Correct status check on i40iw_get_pble
i40iw: Correct CQ arming
IB/rdmavt: Correct qp_priv_alloc() return value test
IB/hfi1: Don't zero out qp->s_ack_queue in rvt_reset_qp
IB/hfi1: Fix deadlock with txreq allocation slow path
IB/mlx4: Prevent cross page boundary allocation
IB/mlx4: Fix memory leak if QP creation failed
IB/mlx4: Verify port number in flow steering create flow
IB/mlx4: Fix error flow when sending mads under SRIOV
IB/mlx4: Fix the SQ size of an RC QP
IB/mlx5: Fix wrong naming of port_rcv_data counter
IB/mlx5: Fix post send fence logic
IB/uverbs: Initialize ib_qp_init_attr with zeros
IB/core: Fix false search of the IB_SA_WELL_KNOWN_GUID
IB/core: Fix RoCE v1 multicast join logic issue
IB/core: Fix no default GIDs when netdevice reregisters
IB/hfi1: Send a pkey change event on driver pkey update
...

+190 -113
+3 -1
drivers/infiniband/core/cache.c
··· 411 411 412 412 for (ix = 0; ix < table->sz; ix++) 413 413 if (table->data_vec[ix].attr.ndev == ndev) 414 - if (!del_gid(ib_dev, port, table, ix, false)) 414 + if (!del_gid(ib_dev, port, table, ix, 415 + !!(table->data_vec[ix].props & 416 + GID_TABLE_ENTRY_DEFAULT))) 415 417 deleted = true; 416 418 417 419 write_unlock_irq(&table->rwlock);
+30 -32
drivers/infiniband/core/cma.c
··· 708 708 complete(&id_priv->comp); 709 709 } 710 710 711 - static int cma_disable_callback(struct rdma_id_private *id_priv, 712 - enum rdma_cm_state state) 713 - { 714 - mutex_lock(&id_priv->handler_mutex); 715 - if (id_priv->state != state) { 716 - mutex_unlock(&id_priv->handler_mutex); 717 - return -EINVAL; 718 - } 719 - return 0; 720 - } 721 - 722 711 struct rdma_cm_id *rdma_create_id(struct net *net, 723 712 rdma_cm_event_handler event_handler, 724 713 void *context, enum rdma_port_space ps, ··· 1660 1671 struct rdma_cm_event event; 1661 1672 int ret = 0; 1662 1673 1674 + mutex_lock(&id_priv->handler_mutex); 1663 1675 if ((ib_event->event != IB_CM_TIMEWAIT_EXIT && 1664 - cma_disable_callback(id_priv, RDMA_CM_CONNECT)) || 1676 + id_priv->state != RDMA_CM_CONNECT) || 1665 1677 (ib_event->event == IB_CM_TIMEWAIT_EXIT && 1666 - cma_disable_callback(id_priv, RDMA_CM_DISCONNECT))) 1667 - return 0; 1678 + id_priv->state != RDMA_CM_DISCONNECT)) 1679 + goto out; 1668 1680 1669 1681 memset(&event, 0, sizeof event); 1670 1682 switch (ib_event->event) { ··· 1860 1870 1861 1871 static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event) 1862 1872 { 1863 - struct rdma_id_private *listen_id, *conn_id; 1873 + struct rdma_id_private *listen_id, *conn_id = NULL; 1864 1874 struct rdma_cm_event event; 1865 1875 struct net_device *net_dev; 1866 1876 int offset, ret; ··· 1874 1884 goto net_dev_put; 1875 1885 } 1876 1886 1877 - if (cma_disable_callback(listen_id, RDMA_CM_LISTEN)) { 1887 + mutex_lock(&listen_id->handler_mutex); 1888 + if (listen_id->state != RDMA_CM_LISTEN) { 1878 1889 ret = -ECONNABORTED; 1879 - goto net_dev_put; 1890 + goto err1; 1880 1891 } 1881 1892 1882 1893 memset(&event, 0, sizeof event); ··· 1967 1976 struct sockaddr *laddr = (struct sockaddr *)&iw_event->local_addr; 1968 1977 struct sockaddr *raddr = (struct sockaddr *)&iw_event->remote_addr; 1969 1978 1970 - if (cma_disable_callback(id_priv, RDMA_CM_CONNECT)) 1971 - return 0; 1979 + mutex_lock(&id_priv->handler_mutex); 1980 + if (id_priv->state != RDMA_CM_CONNECT) 1981 + goto out; 1972 1982 1973 1983 memset(&event, 0, sizeof event); 1974 1984 switch (iw_event->event) { ··· 2021 2029 return ret; 2022 2030 } 2023 2031 2032 + out: 2024 2033 mutex_unlock(&id_priv->handler_mutex); 2025 2034 return ret; 2026 2035 } ··· 2032 2039 struct rdma_cm_id *new_cm_id; 2033 2040 struct rdma_id_private *listen_id, *conn_id; 2034 2041 struct rdma_cm_event event; 2035 - int ret; 2042 + int ret = -ECONNABORTED; 2036 2043 struct sockaddr *laddr = (struct sockaddr *)&iw_event->local_addr; 2037 2044 struct sockaddr *raddr = (struct sockaddr *)&iw_event->remote_addr; 2038 2045 2039 2046 listen_id = cm_id->context; 2040 - if (cma_disable_callback(listen_id, RDMA_CM_LISTEN)) 2041 - return -ECONNABORTED; 2047 + 2048 + mutex_lock(&listen_id->handler_mutex); 2049 + if (listen_id->state != RDMA_CM_LISTEN) 2050 + goto out; 2042 2051 2043 2052 /* Create a new RDMA id for the new IW CM ID */ 2044 2053 new_cm_id = rdma_create_id(listen_id->id.route.addr.dev_addr.net, ··· 3211 3216 struct ib_cm_sidr_rep_event_param *rep = &ib_event->param.sidr_rep_rcvd; 3212 3217 int ret = 0; 3213 3218 3214 - if (cma_disable_callback(id_priv, RDMA_CM_CONNECT)) 3215 - return 0; 3219 + mutex_lock(&id_priv->handler_mutex); 3220 + if (id_priv->state != RDMA_CM_CONNECT) 3221 + goto out; 3216 3222 3217 3223 memset(&event, 0, sizeof event); 3218 3224 switch (ib_event->event) { ··· 3669 3673 struct rdma_id_private *id_priv; 3670 3674 struct cma_multicast *mc = multicast->context; 3671 3675 struct rdma_cm_event event; 3672 - int ret; 3676 + int ret = 0; 3673 3677 3674 3678 id_priv = mc->id_priv; 3675 - if (cma_disable_callback(id_priv, RDMA_CM_ADDR_BOUND) && 3676 - cma_disable_callback(id_priv, RDMA_CM_ADDR_RESOLVED)) 3677 - return 0; 3679 + mutex_lock(&id_priv->handler_mutex); 3680 + if (id_priv->state != RDMA_CM_ADDR_BOUND && 3681 + id_priv->state != RDMA_CM_ADDR_RESOLVED) 3682 + goto out; 3678 3683 3679 3684 if (!status) 3680 3685 status = cma_set_qkey(id_priv, be32_to_cpu(multicast->rec.qkey)); ··· 3717 3720 return 0; 3718 3721 } 3719 3722 3723 + out: 3720 3724 mutex_unlock(&id_priv->handler_mutex); 3721 3725 return 0; 3722 3726 } ··· 3876 3878 gid_type = id_priv->cma_dev->default_gid_type[id_priv->id.port_num - 3877 3879 rdma_start_port(id_priv->cma_dev->device)]; 3878 3880 if (addr->sa_family == AF_INET) { 3879 - if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) 3881 + if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) { 3882 + mc->multicast.ib->rec.hop_limit = IPV6_DEFAULT_HOPLIMIT; 3880 3883 err = cma_igmp_send(ndev, &mc->multicast.ib->rec.mgid, 3881 3884 true); 3882 - if (!err) { 3883 - mc->igmp_joined = true; 3884 - mc->multicast.ib->rec.hop_limit = IPV6_DEFAULT_HOPLIMIT; 3885 + if (!err) 3886 + mc->igmp_joined = true; 3885 3887 } 3886 3888 } else { 3887 3889 if (gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP)
+1 -1
drivers/infiniband/core/uverbs_cmd.c
··· 1747 1747 struct ib_srq *srq = NULL; 1748 1748 struct ib_qp *qp; 1749 1749 char *buf; 1750 - struct ib_qp_init_attr attr; 1750 + struct ib_qp_init_attr attr = {}; 1751 1751 struct ib_uverbs_ex_create_qp_resp resp; 1752 1752 int ret; 1753 1753
+10 -6
drivers/infiniband/core/verbs.c
··· 511 511 ah_attr->grh.dgid = sgid; 512 512 513 513 if (!rdma_cap_eth_ah(device, port_num)) { 514 - ret = ib_find_cached_gid_by_port(device, &dgid, 515 - IB_GID_TYPE_IB, 516 - port_num, NULL, 517 - &gid_index); 518 - if (ret) 519 - return ret; 514 + if (dgid.global.interface_id != cpu_to_be64(IB_SA_WELL_KNOWN_GUID)) { 515 + ret = ib_find_cached_gid_by_port(device, &dgid, 516 + IB_GID_TYPE_IB, 517 + port_num, NULL, 518 + &gid_index); 519 + if (ret) 520 + return ret; 521 + } else { 522 + gid_index = 0; 523 + } 520 524 } 521 525 522 526 ah_attr->grh.sgid_index = (u8) gid_index;
+20 -8
drivers/infiniband/hw/hfi1/chip.c
··· 1037 1037 static void dc_start(struct hfi1_devdata *); 1038 1038 static int qos_rmt_entries(struct hfi1_devdata *dd, unsigned int *mp, 1039 1039 unsigned int *np); 1040 - static void remove_full_mgmt_pkey(struct hfi1_pportdata *ppd); 1040 + static void clear_full_mgmt_pkey(struct hfi1_pportdata *ppd); 1041 1041 1042 1042 /* 1043 1043 * Error interrupt table entry. This is used as input to the interrupt ··· 6962 6962 } 6963 6963 6964 6964 reset_neighbor_info(ppd); 6965 - if (ppd->mgmt_allowed) 6966 - remove_full_mgmt_pkey(ppd); 6967 6965 6968 6966 /* disable the port */ 6969 6967 clear_rcvctrl(ppd->dd, RCV_CTRL_RCV_PORT_ENABLE_SMASK); ··· 7068 7070 __func__, ppd->pkeys[2], FULL_MGMT_P_KEY); 7069 7071 ppd->pkeys[2] = FULL_MGMT_P_KEY; 7070 7072 (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0); 7073 + hfi1_event_pkey_change(ppd->dd, ppd->port); 7071 7074 } 7072 7075 7073 - static void remove_full_mgmt_pkey(struct hfi1_pportdata *ppd) 7076 + static void clear_full_mgmt_pkey(struct hfi1_pportdata *ppd) 7074 7077 { 7075 - ppd->pkeys[2] = 0; 7076 - (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0); 7078 + if (ppd->pkeys[2] != 0) { 7079 + ppd->pkeys[2] = 0; 7080 + (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0); 7081 + hfi1_event_pkey_change(ppd->dd, ppd->port); 7082 + } 7077 7083 } 7078 7084 7079 7085 /* ··· 9170 9168 return 0; 9171 9169 } 9172 9170 9171 + /* 9172 + * FULL_MGMT_P_KEY is cleared from the pkey table, so that the 9173 + * pkey table can be configured properly if the HFI unit is connected 9174 + * to switch port with MgmtAllowed=NO 9175 + */ 9176 + clear_full_mgmt_pkey(ppd); 9177 + 9173 9178 return set_link_state(ppd, HLS_DN_POLL); 9174 9179 } 9175 9180 ··· 9786 9777 u64 len1 = 0, len2 = (((dd->vld[15].mtu + max_hb) >> 2) 9787 9778 & SEND_LEN_CHECK1_LEN_VL15_MASK) << 9788 9779 SEND_LEN_CHECK1_LEN_VL15_SHIFT; 9789 - int i; 9780 + int i, j; 9790 9781 u32 thres; 9791 9782 9792 9783 for (i = 0; i < ppd->vls_supported; i++) { ··· 9810 9801 sc_mtu_to_threshold(dd->vld[i].sc, 9811 9802 dd->vld[i].mtu, 9812 9803 dd->rcd[0]->rcvhdrqentsize)); 9813 - sc_set_cr_threshold(dd->vld[i].sc, thres); 9804 + for (j = 0; j < INIT_SC_PER_VL; j++) 9805 + sc_set_cr_threshold( 9806 + pio_select_send_context_vl(dd, j, i), 9807 + thres); 9814 9808 } 9815 9809 thres = min(sc_percent_to_threshold(dd->vld[15].sc, 50), 9816 9810 sc_mtu_to_threshold(dd->vld[15].sc,
+3
drivers/infiniband/hw/hfi1/file_ops.c
··· 203 203 204 204 switch (cmd) { 205 205 case HFI1_IOCTL_ASSIGN_CTXT: 206 + if (uctxt) 207 + return -EINVAL; 208 + 206 209 if (copy_from_user(&uinfo, 207 210 (struct hfi1_user_info __user *)arg, 208 211 sizeof(uinfo)))
+1 -1
drivers/infiniband/hw/hfi1/init.c
··· 1383 1383 static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 1384 1384 { 1385 1385 int ret = 0, j, pidx, initfail; 1386 - struct hfi1_devdata *dd = NULL; 1386 + struct hfi1_devdata *dd = ERR_PTR(-EINVAL); 1387 1387 struct hfi1_pportdata *ppd; 1388 1388 1389 1389 /* First, lock the non-writable module parameters */
+12 -7
drivers/infiniband/hw/hfi1/mad.c
··· 78 78 memset(data, 0, size); 79 79 } 80 80 81 + void hfi1_event_pkey_change(struct hfi1_devdata *dd, u8 port) 82 + { 83 + struct ib_event event; 84 + 85 + event.event = IB_EVENT_PKEY_CHANGE; 86 + event.device = &dd->verbs_dev.rdi.ibdev; 87 + event.element.port_num = port; 88 + ib_dispatch_event(&event); 89 + } 90 + 81 91 static void send_trap(struct hfi1_ibport *ibp, void *data, unsigned len) 82 92 { 83 93 struct ib_mad_send_buf *send_buf; ··· 1428 1418 } 1429 1419 1430 1420 if (changed) { 1431 - struct ib_event event; 1432 - 1433 1421 (void)hfi1_set_ib_cfg(ppd, HFI1_IB_CFG_PKEYS, 0); 1434 - 1435 - event.event = IB_EVENT_PKEY_CHANGE; 1436 - event.device = &dd->verbs_dev.rdi.ibdev; 1437 - event.element.port_num = port; 1438 - ib_dispatch_event(&event); 1422 + hfi1_event_pkey_change(dd, port); 1439 1423 } 1424 + 1440 1425 return 0; 1441 1426 } 1442 1427
+2
drivers/infiniband/hw/hfi1/mad.h
··· 434 434 COUNTER_MASK(1, 3) | \ 435 435 COUNTER_MASK(1, 4)) 436 436 437 + void hfi1_event_pkey_change(struct hfi1_devdata *dd, u8 port); 438 + 437 439 #endif /* _HFI1_MAD_H */
+23 -3
drivers/infiniband/hw/hfi1/pio.c
··· 995 995 /* counter is reset if occupancy count changes */ 996 996 if (reg != reg_prev) 997 997 loop = 0; 998 - if (loop > 500) { 998 + if (loop > 50000) { 999 999 /* timed out - bounce the link */ 1000 1000 dd_dev_err(dd, 1001 1001 "%s: context %u(%u) timeout waiting for packets to egress, remaining count %u, bouncing link\n", ··· 1798 1798 } 1799 1799 1800 1800 /* 1801 + * Set credit return threshold for the kernel send context 1802 + */ 1803 + static void set_threshold(struct hfi1_devdata *dd, int scontext, int i) 1804 + { 1805 + u32 thres; 1806 + 1807 + thres = min(sc_percent_to_threshold(dd->kernel_send_context[scontext], 1808 + 50), 1809 + sc_mtu_to_threshold(dd->kernel_send_context[scontext], 1810 + dd->vld[i].mtu, 1811 + dd->rcd[0]->rcvhdrqentsize)); 1812 + sc_set_cr_threshold(dd->kernel_send_context[scontext], thres); 1813 + } 1814 + 1815 + /* 1801 1816 * pio_map_init - called when #vls change 1802 1817 * @dd: hfi1_devdata 1803 1818 * @port: port number ··· 1887 1872 if (!newmap->map[i]) 1888 1873 goto bail; 1889 1874 newmap->map[i]->mask = (1 << ilog2(sz)) - 1; 1890 - /* assign send contexts */ 1875 + /* 1876 + * assign send contexts and 1877 + * adjust credit return threshold 1878 + */ 1891 1879 for (j = 0; j < sz; j++) { 1892 - if (dd->kernel_send_context[scontext]) 1880 + if (dd->kernel_send_context[scontext]) { 1893 1881 newmap->map[i]->ksc[j] = 1894 1882 dd->kernel_send_context[scontext]; 1883 + set_threshold(dd, scontext, i); 1884 + } 1895 1885 if (++scontext >= first_scontext + 1896 1886 vl_scontexts[i]) 1897 1887 /* wrap back to first send context */
+2 -1
drivers/infiniband/hw/hfi1/qsfp.c
··· 579 579 580 580 if (ppd->qsfp_info.cache_valid) { 581 581 if (QSFP_IS_CU(cache[QSFP_MOD_TECH_OFFS])) 582 - sprintf(lenstr, "%dM ", cache[QSFP_MOD_LEN_OFFS]); 582 + snprintf(lenstr, sizeof(lenstr), "%dM ", 583 + cache[QSFP_MOD_LEN_OFFS]); 583 584 584 585 power_byte = cache[QSFP_MOD_PWR_OFFS]; 585 586 sofar += scnprintf(buf + sofar, len - sofar, "PWR:%.3sW\n",
+1 -3
drivers/infiniband/hw/hfi1/verbs_txreq.c
··· 92 92 93 93 struct verbs_txreq *__get_txreq(struct hfi1_ibdev *dev, 94 94 struct rvt_qp *qp) 95 + __must_hold(&qp->s_lock) 95 96 { 96 97 struct verbs_txreq *tx = ERR_PTR(-EBUSY); 97 - unsigned long flags; 98 98 99 - spin_lock_irqsave(&qp->s_lock, flags); 100 99 write_seqlock(&dev->iowait_lock); 101 100 if (ib_rvt_state_ops[qp->state] & RVT_PROCESS_RECV_OK) { 102 101 struct hfi1_qp_priv *priv; ··· 115 116 } 116 117 out: 117 118 write_sequnlock(&dev->iowait_lock); 118 - spin_unlock_irqrestore(&qp->s_lock, flags); 119 119 return tx; 120 120 } 121 121
+1
drivers/infiniband/hw/hfi1/verbs_txreq.h
··· 73 73 74 74 static inline struct verbs_txreq *get_txreq(struct hfi1_ibdev *dev, 75 75 struct rvt_qp *qp) 76 + __must_hold(&qp->slock) 76 77 { 77 78 struct verbs_txreq *tx; 78 79 struct hfi1_qp_priv *priv = qp->priv;
+2
drivers/infiniband/hw/i40iw/i40iw.h
··· 113 113 114 114 #define IW_HMC_OBJ_TYPE_NUM ARRAY_SIZE(iw_hmc_obj_types) 115 115 #define IW_CFG_FPM_QP_COUNT 32768 116 + #define I40IW_MAX_PAGES_PER_FMR 512 117 + #define I40IW_MIN_PAGES_PER_FMR 1 116 118 117 119 #define I40IW_MTU_TO_MSS 40 118 120 #define I40IW_DEFAULT_MSS 1460
+13 -4
drivers/infiniband/hw/i40iw/i40iw_verbs.c
··· 79 79 props->max_qp_init_rd_atom = props->max_qp_rd_atom; 80 80 props->atomic_cap = IB_ATOMIC_NONE; 81 81 props->max_map_per_fmr = 1; 82 + props->max_fast_reg_page_list_len = I40IW_MAX_PAGES_PER_FMR; 82 83 return 0; 83 84 } 84 85 ··· 1528 1527 mutex_lock(&iwdev->pbl_mutex); 1529 1528 status = i40iw_get_pble(&iwdev->sc_dev, iwdev->pble_rsrc, palloc, iwmr->page_cnt); 1530 1529 mutex_unlock(&iwdev->pbl_mutex); 1531 - if (!status) 1530 + if (status) 1532 1531 goto err1; 1533 1532 1534 1533 if (palloc->level != I40IW_LEVEL_1) ··· 2150 2149 struct i40iw_sc_dev *dev = &iwqp->iwdev->sc_dev; 2151 2150 struct i40iw_fast_reg_stag_info info; 2152 2151 2152 + memset(&info, 0, sizeof(info)); 2153 2153 info.access_rights = I40IW_ACCESS_FLAGS_LOCALREAD; 2154 2154 info.access_rights |= i40iw_get_user_access(flags); 2155 2155 info.stag_key = reg_wr(ib_wr)->key & 0xff; ··· 2160 2158 info.addr_type = I40IW_ADDR_TYPE_VA_BASED; 2161 2159 info.va = (void *)(uintptr_t)iwmr->ibmr.iova; 2162 2160 info.total_len = iwmr->ibmr.length; 2161 + info.reg_addr_pa = *(u64 *)palloc->level1.addr; 2163 2162 info.first_pm_pbl_index = palloc->level1.idx; 2164 2163 info.local_fence = ib_wr->send_flags & IB_SEND_FENCE; 2165 2164 info.signaled = ib_wr->send_flags & IB_SEND_SIGNALED; 2165 + 2166 + if (iwmr->npages > I40IW_MIN_PAGES_PER_FMR) 2167 + info.chunk_size = 1; 2166 2168 2167 2169 if (page_shift == 21) 2168 2170 info.page_size = 1; /* 2M page */ ··· 2333 2327 { 2334 2328 struct i40iw_cq *iwcq; 2335 2329 struct i40iw_cq_uk *ukcq; 2336 - enum i40iw_completion_notify cq_notify = IW_CQ_COMPL_SOLICITED; 2330 + unsigned long flags; 2331 + enum i40iw_completion_notify cq_notify = IW_CQ_COMPL_EVENT; 2337 2332 2338 2333 iwcq = (struct i40iw_cq *)ibcq; 2339 2334 ukcq = &iwcq->sc_cq.cq_uk; 2340 - if (notify_flags == IB_CQ_NEXT_COMP) 2341 - cq_notify = IW_CQ_COMPL_EVENT; 2335 + if (notify_flags == IB_CQ_SOLICITED) 2336 + cq_notify = IW_CQ_COMPL_SOLICITED; 2337 + spin_lock_irqsave(&iwcq->lock, flags); 2342 2338 ukcq->ops.iw_cq_request_notification(ukcq, cq_notify); 2339 + spin_unlock_irqrestore(&iwcq->lock, flags); 2343 2340 return 0; 2344 2341 } 2345 2342
+1 -1
drivers/infiniband/hw/mlx4/ah.c
··· 47 47 48 48 ah->av.ib.port_pd = cpu_to_be32(to_mpd(pd)->pdn | (ah_attr->port_num << 24)); 49 49 ah->av.ib.g_slid = ah_attr->src_path_bits; 50 + ah->av.ib.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28); 50 51 if (ah_attr->ah_flags & IB_AH_GRH) { 51 52 ah->av.ib.g_slid |= 0x80; 52 53 ah->av.ib.gid_index = ah_attr->grh.sgid_index; ··· 65 64 !(1 << ah->av.ib.stat_rate & dev->caps.stat_rate_support)) 66 65 --ah->av.ib.stat_rate; 67 66 } 68 - ah->av.ib.sl_tclass_flowlabel = cpu_to_be32(ah_attr->sl << 28); 69 67 70 68 return &ah->ibah; 71 69 }
+18 -6
drivers/infiniband/hw/mlx4/mad.c
··· 527 527 tun_tx_ix = (++tun_qp->tx_ix_head) & (MLX4_NUM_TUNNEL_BUFS - 1); 528 528 spin_unlock(&tun_qp->tx_lock); 529 529 if (ret) 530 - goto out; 530 + goto end; 531 531 532 532 tun_mad = (struct mlx4_rcv_tunnel_mad *) (tun_qp->tx_ring[tun_tx_ix].buf.addr); 533 533 if (tun_qp->tx_ring[tun_tx_ix].ah) ··· 596 596 wr.wr.send_flags = IB_SEND_SIGNALED; 597 597 598 598 ret = ib_post_send(src_qp, &wr.wr, &bad_wr); 599 - out: 600 - if (ret) 601 - ib_destroy_ah(ah); 599 + if (!ret) 600 + return 0; 601 + out: 602 + spin_lock(&tun_qp->tx_lock); 603 + tun_qp->tx_ix_tail++; 604 + spin_unlock(&tun_qp->tx_lock); 605 + tun_qp->tx_ring[tun_tx_ix].ah = NULL; 606 + end: 607 + ib_destroy_ah(ah); 602 608 return ret; 603 609 } 604 610 ··· 1332 1326 1333 1327 1334 1328 ret = ib_post_send(send_qp, &wr.wr, &bad_wr); 1329 + if (!ret) 1330 + return 0; 1331 + 1332 + spin_lock(&sqp->tx_lock); 1333 + sqp->tx_ix_tail++; 1334 + spin_unlock(&sqp->tx_lock); 1335 + sqp->tx_ring[wire_tx_ix].ah = NULL; 1335 1336 out: 1336 - if (ret) 1337 - ib_destroy_ah(ah); 1337 + ib_destroy_ah(ah); 1338 1338 return ret; 1339 1339 } 1340 1340
+3
drivers/infiniband/hw/mlx4/main.c
··· 1704 1704 struct mlx4_dev *dev = (to_mdev(qp->device))->dev; 1705 1705 int is_bonded = mlx4_is_bonded(dev); 1706 1706 1707 + if (flow_attr->port < 1 || flow_attr->port > qp->device->phys_port_cnt) 1708 + return ERR_PTR(-EINVAL); 1709 + 1707 1710 if ((flow_attr->flags & IB_FLOW_ATTR_FLAGS_DONT_TRAP) && 1708 1711 (flow_attr->type != IB_FLOW_ATTR_NORMAL)) 1709 1712 return ERR_PTR(-EOPNOTSUPP);
+1 -1
drivers/infiniband/hw/mlx4/mlx4_ib.h
··· 139 139 u32 max_pages; 140 140 struct mlx4_mr mmr; 141 141 struct ib_umem *umem; 142 - void *pages_alloc; 142 + size_t page_map_size; 143 143 }; 144 144 145 145 struct mlx4_ib_mw {
+17 -17
drivers/infiniband/hw/mlx4/mr.c
··· 277 277 struct mlx4_ib_mr *mr, 278 278 int max_pages) 279 279 { 280 - int size = max_pages * sizeof(u64); 281 - int add_size; 282 280 int ret; 283 281 284 - add_size = max_t(int, MLX4_MR_PAGES_ALIGN - ARCH_KMALLOC_MINALIGN, 0); 282 + /* Ensure that size is aligned to DMA cacheline 283 + * requirements. 284 + * max_pages is limited to MLX4_MAX_FAST_REG_PAGES 285 + * so page_map_size will never cross PAGE_SIZE. 286 + */ 287 + mr->page_map_size = roundup(max_pages * sizeof(u64), 288 + MLX4_MR_PAGES_ALIGN); 285 289 286 - mr->pages_alloc = kzalloc(size + add_size, GFP_KERNEL); 287 - if (!mr->pages_alloc) 290 + /* Prevent cross page boundary allocation. */ 291 + mr->pages = (__be64 *)get_zeroed_page(GFP_KERNEL); 292 + if (!mr->pages) 288 293 return -ENOMEM; 289 294 290 - mr->pages = PTR_ALIGN(mr->pages_alloc, MLX4_MR_PAGES_ALIGN); 291 - 292 295 mr->page_map = dma_map_single(device->dma_device, mr->pages, 293 - size, DMA_TO_DEVICE); 296 + mr->page_map_size, DMA_TO_DEVICE); 294 297 295 298 if (dma_mapping_error(device->dma_device, mr->page_map)) { 296 299 ret = -ENOMEM; ··· 301 298 } 302 299 303 300 return 0; 304 - err: 305 - kfree(mr->pages_alloc); 306 301 302 + err: 303 + free_page((unsigned long)mr->pages); 307 304 return ret; 308 305 } 309 306 ··· 312 309 { 313 310 if (mr->pages) { 314 311 struct ib_device *device = mr->ibmr.device; 315 - int size = mr->max_pages * sizeof(u64); 316 312 317 313 dma_unmap_single(device->dma_device, mr->page_map, 318 - size, DMA_TO_DEVICE); 319 - kfree(mr->pages_alloc); 314 + mr->page_map_size, DMA_TO_DEVICE); 315 + free_page((unsigned long)mr->pages); 320 316 mr->pages = NULL; 321 317 } 322 318 } ··· 539 537 mr->npages = 0; 540 538 541 539 ib_dma_sync_single_for_cpu(ibmr->device, mr->page_map, 542 - sizeof(u64) * mr->max_pages, 543 - DMA_TO_DEVICE); 540 + mr->page_map_size, DMA_TO_DEVICE); 544 541 545 542 rc = ib_sg_to_pages(ibmr, sg, sg_nents, sg_offset, mlx4_set_page); 546 543 547 544 ib_dma_sync_single_for_device(ibmr->device, mr->page_map, 548 - sizeof(u64) * mr->max_pages, 549 - DMA_TO_DEVICE); 545 + mr->page_map_size, DMA_TO_DEVICE); 550 546 551 547 return rc; 552 548 }
+4 -2
drivers/infiniband/hw/mlx4/qp.c
··· 362 362 sizeof (struct mlx4_wqe_raddr_seg); 363 363 case MLX4_IB_QPT_RC: 364 364 return sizeof (struct mlx4_wqe_ctrl_seg) + 365 - sizeof (struct mlx4_wqe_atomic_seg) + 365 + sizeof (struct mlx4_wqe_masked_atomic_seg) + 366 366 sizeof (struct mlx4_wqe_raddr_seg); 367 367 case MLX4_IB_QPT_SMI: 368 368 case MLX4_IB_QPT_GSI: ··· 1191 1191 { 1192 1192 err = create_qp_common(to_mdev(pd->device), pd, init_attr, 1193 1193 udata, 0, &qp, gfp); 1194 - if (err) 1194 + if (err) { 1195 + kfree(qp); 1195 1196 return ERR_PTR(err); 1197 + } 1196 1198 1197 1199 qp->ibqp.qp_num = qp->mqp.qpn; 1198 1200 qp->xrcdn = xrcdn;
+1 -1
drivers/infiniband/hw/mlx5/mad.c
··· 121 121 pma_cnt_ext->port_xmit_data = 122 122 cpu_to_be64(MLX5_SUM_CNT(out, transmitted_ib_unicast.octets, 123 123 transmitted_ib_multicast.octets) >> 2); 124 - pma_cnt_ext->port_xmit_data = 124 + pma_cnt_ext->port_rcv_data = 125 125 cpu_to_be64(MLX5_SUM_CNT(out, received_ib_unicast.octets, 126 126 received_ib_multicast.octets) >> 2); 127 127 pma_cnt_ext->port_xmit_packets =
+4 -3
drivers/infiniband/hw/mlx5/qp.c
··· 3332 3332 return MLX5_FENCE_MODE_SMALL_AND_FENCE; 3333 3333 else 3334 3334 return fence; 3335 - 3336 - } else { 3337 - return 0; 3335 + } else if (unlikely(wr->send_flags & IB_SEND_FENCE)) { 3336 + return MLX5_FENCE_MODE_FENCE; 3338 3337 } 3338 + 3339 + return 0; 3339 3340 } 3340 3341 3341 3342 static int begin_wqe(struct mlx5_ib_qp *qp, void **seg,
+5
drivers/infiniband/hw/qib/qib_file_ops.c
··· 2178 2178 2179 2179 switch (cmd.type) { 2180 2180 case QIB_CMD_ASSIGN_CTXT: 2181 + if (rcd) { 2182 + ret = -EINVAL; 2183 + goto bail; 2184 + } 2185 + 2181 2186 ret = qib_assign_ctxt(fp, &cmd.cmd.user_info); 2182 2187 if (ret) 2183 2188 goto bail;
+5 -9
drivers/infiniband/sw/rdmavt/qp.c
··· 369 369 /* wrap to first map page, invert bit 0 */ 370 370 offset = qpt->incr | ((offset & 1) ^ 1); 371 371 } 372 - /* there can be no bits at shift and below */ 373 - WARN_ON(offset & (rdi->dparms.qos_shift - 1)); 372 + /* there can be no set bits in low-order QoS bits */ 373 + WARN_ON(offset & (BIT(rdi->dparms.qos_shift) - 1)); 374 374 qpn = mk_qpn(qpt, map, offset); 375 375 } 376 376 ··· 576 576 qp->s_ssn = 1; 577 577 qp->s_lsn = 0; 578 578 qp->s_mig_state = IB_MIG_MIGRATED; 579 - if (qp->s_ack_queue) 580 - memset( 581 - qp->s_ack_queue, 582 - 0, 583 - rvt_max_atomic(rdi) * 584 - sizeof(*qp->s_ack_queue)); 585 579 qp->r_head_ack_queue = 0; 586 580 qp->s_tail_ack_queue = 0; 587 581 qp->s_num_rd_atomic = 0; ··· 699 705 * initialization that is needed. 700 706 */ 701 707 priv = rdi->driver_f.qp_priv_alloc(rdi, qp, gfp); 702 - if (!priv) 708 + if (IS_ERR(priv)) { 709 + ret = priv; 703 710 goto bail_qp; 711 + } 704 712 qp->priv = priv; 705 713 qp->timeout_jiffies = 706 714 usecs_to_jiffies((4096UL * (1UL << qp->timeout)) /
+1 -3
drivers/infiniband/sw/rdmavt/vt.c
··· 501 501 !rdi->driver_f.quiesce_qp || 502 502 !rdi->driver_f.notify_error_qp || 503 503 !rdi->driver_f.mtu_from_qp || 504 - !rdi->driver_f.mtu_to_path_mtu || 505 - !rdi->driver_f.shut_down_port || 506 - !rdi->driver_f.cap_mask_chg) 504 + !rdi->driver_f.mtu_to_path_mtu) 507 505 return -EINVAL; 508 506 break; 509 507
+1 -2
drivers/infiniband/ulp/srpt/ib_srpt.c
··· 1638 1638 */ 1639 1639 qp_init->cap.max_send_wr = srp_sq_size / 2; 1640 1640 qp_init->cap.max_rdma_ctxs = srp_sq_size / 2; 1641 - qp_init->cap.max_send_sge = max(sdev->device->attrs.max_sge_rd, 1642 - sdev->device->attrs.max_sge); 1641 + qp_init->cap.max_send_sge = SRPT_DEF_SG_PER_WQE; 1643 1642 qp_init->port_num = ch->sport->port; 1644 1643 1645 1644 ch->qp = ib_create_qp(sdev->pd, qp_init);
+1
drivers/infiniband/ulp/srpt/ib_srpt.h
··· 106 106 SRP_LOGIN_RSP_MULTICHAN_MAINTAINED = 0x2, 107 107 108 108 SRPT_DEF_SG_TABLESIZE = 128, 109 + SRPT_DEF_SG_PER_WQE = 16, 109 110 110 111 MIN_SRPT_SQ_SIZE = 16, 111 112 DEF_SRPT_SQ_SIZE = 4096,
+1
include/linux/mlx5/qp.h
··· 172 172 enum { 173 173 MLX5_FENCE_MODE_NONE = 0 << 5, 174 174 MLX5_FENCE_MODE_INITIATOR_SMALL = 1 << 5, 175 + MLX5_FENCE_MODE_FENCE = 2 << 5, 175 176 MLX5_FENCE_MODE_STRONG_ORDERING = 3 << 5, 176 177 MLX5_FENCE_MODE_SMALL_AND_FENCE = 4 << 5, 177 178 };
+3 -1
include/rdma/rdma_vt.h
··· 203 203 204 204 /* 205 205 * Allocate a private queue pair data structure for driver specific 206 - * information which is opaque to rdmavt. 206 + * information which is opaque to rdmavt. Errors are returned via 207 + * ERR_PTR(err). The driver is free to return NULL or a valid 208 + * pointer. 207 209 */ 208 210 void * (*qp_priv_alloc)(struct rvt_dev_info *rdi, struct rvt_qp *qp, 209 211 gfp_t gfp);