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 first -rc pull for the RDMA subsystem. The patch count is
high, but they are all smallish patches fixing simple things for the
most part, and the overall line count of changes here is smaller than
the patch count would lead a person to believe.

Code is up and running in my labs, including direct testing of cxgb4,
mlx4, mlx5, ocrdma, and qib.

Summary:

- Multiple minor fixes to the rdma core
- Multiple minor fixes to hfi1
- Multiple minor fixes to mlx5
- A very few other minor fixes (SRP, IPoIB, usNIC, mlx4)"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dledford/rdma: (35 commits)
IB/IPoIB: Don't update neigh validity for unresolved entries
IB/mlx5: Fix alternate path code
IB/mlx5: Fix pkey_index length in the QP path record
IB/mlx5: Fix entries check in mlx5_ib_resize_cq
IB/mlx5: Fix entries checks in mlx5_ib_create_cq
IB/mlx5: Check BlueFlame HCA support
IB/mlx5: Fix returned values of query QP
IB/mlx5: Limit query HCA clock
IB/mlx5: Fix FW version diaplay in sysfs
IB/mlx5: Return PORT_ERR in Active to Initializing tranisition
IB/mlx5: Set flow steering capability bit
IB/core: Make all casts in ib_device_cap_flags enum consistent
IB/core: Fix bit curruption in ib_device_cap_flags structure
IB/core: Initialize sysfs attributes before sysfs create group
IB/IPoIB: Disable bottom half when dealing with device address
IB/core: Fix removal of default GID cache entry
IB/IPoIB: Fix race between ipoib_remove_one to sysfs functions
IB/core: Fix query port failure in RoCE
IB/core: fix error unwind in sysfs hw counters code
IB/core: Fix array length allocation
...

+148 -110
+8 -2
drivers/infiniband/core/cache.c
··· 178 178 { 179 179 int ret = 0; 180 180 struct net_device *old_net_dev; 181 + enum ib_gid_type old_gid_type; 181 182 182 183 /* in rdma_cap_roce_gid_table, this funciton should be protected by a 183 184 * sleep-able lock. ··· 200 199 } 201 200 202 201 old_net_dev = table->data_vec[ix].attr.ndev; 202 + old_gid_type = table->data_vec[ix].attr.gid_type; 203 203 if (old_net_dev && old_net_dev != attr->ndev) 204 204 dev_put(old_net_dev); 205 205 /* if modify_gid failed, just delete the old gid */ ··· 209 207 attr = &zattr; 210 208 table->data_vec[ix].context = NULL; 211 209 } 212 - if (default_gid) 213 - table->data_vec[ix].props |= GID_TABLE_ENTRY_DEFAULT; 210 + 214 211 memcpy(&table->data_vec[ix].gid, gid, sizeof(*gid)); 215 212 memcpy(&table->data_vec[ix].attr, attr, sizeof(*attr)); 213 + if (default_gid) { 214 + table->data_vec[ix].props |= GID_TABLE_ENTRY_DEFAULT; 215 + if (action == GID_TABLE_WRITE_ACTION_DEL) 216 + table->data_vec[ix].attr.gid_type = old_gid_type; 217 + } 216 218 if (table->data_vec[ix].attr.ndev && 217 219 table->data_vec[ix].attr.ndev != old_net_dev) 218 220 dev_hold(table->data_vec[ix].attr.ndev);
+2 -2
drivers/infiniband/core/cm.c
··· 3452 3452 work->cm_event.event = IB_CM_USER_ESTABLISHED; 3453 3453 3454 3454 /* Check if the device started its remove_one */ 3455 - spin_lock_irq(&cm.lock); 3455 + spin_lock_irqsave(&cm.lock, flags); 3456 3456 if (!cm_dev->going_down) { 3457 3457 queue_delayed_work(cm.wq, &work->work, 0); 3458 3458 } else { 3459 3459 kfree(work); 3460 3460 ret = -ENODEV; 3461 3461 } 3462 - spin_unlock_irq(&cm.lock); 3462 + spin_unlock_irqrestore(&cm.lock, flags); 3463 3463 3464 3464 out: 3465 3465 return ret;
+5 -1
drivers/infiniband/core/device.c
··· 661 661 if (err || port_attr->subnet_prefix) 662 662 return err; 663 663 664 + if (rdma_port_get_link_layer(device, port_num) != IB_LINK_LAYER_INFINIBAND) 665 + return 0; 666 + 664 667 err = ib_query_gid(device, port_num, 0, &gid, NULL); 665 668 if (err) 666 669 return err; ··· 1027 1024 goto err_mad; 1028 1025 } 1029 1026 1030 - if (ib_add_ibnl_clients()) { 1027 + ret = ib_add_ibnl_clients(); 1028 + if (ret) { 1031 1029 pr_warn("Couldn't register ibnl clients\n"); 1032 1030 goto err_sa; 1033 1031 }
+1 -1
drivers/infiniband/core/iwpm_msg.c
··· 506 506 if (!nlmsg_request) { 507 507 pr_info("%s: Could not find a matching request (seq = %u)\n", 508 508 __func__, msg_seq); 509 - return -EINVAL; 509 + return -EINVAL; 510 510 } 511 511 pm_msg = nlmsg_request->req_buffer; 512 512 local_sockaddr = (struct sockaddr_storage *)
+3 -3
drivers/infiniband/core/mad.c
··· 1638 1638 /* Now, check to see if there are any methods still in use */ 1639 1639 if (!check_method_table(method)) { 1640 1640 /* If not, release management method table */ 1641 - kfree(method); 1642 - class->method_table[mgmt_class] = NULL; 1643 - /* Any management classes left ? */ 1641 + kfree(method); 1642 + class->method_table[mgmt_class] = NULL; 1643 + /* Any management classes left ? */ 1644 1644 if (!check_class_table(class)) { 1645 1645 /* If not, release management class table */ 1646 1646 kfree(class);
+16 -8
drivers/infiniband/core/sysfs.c
··· 889 889 static void setup_hw_stats(struct ib_device *device, struct ib_port *port, 890 890 u8 port_num) 891 891 { 892 - struct attribute_group *hsag = NULL; 892 + struct attribute_group *hsag; 893 893 struct rdma_hw_stats *stats; 894 - int i = 0, ret; 894 + int i, ret; 895 895 896 896 stats = device->alloc_hw_stats(device, port_num); 897 897 ··· 899 899 return; 900 900 901 901 if (!stats->names || stats->num_counters <= 0) 902 - goto err; 902 + goto err_free_stats; 903 903 904 + /* 905 + * Two extra attribue elements here, one for the lifespan entry and 906 + * one to NULL terminate the list for the sysfs core code 907 + */ 904 908 hsag = kzalloc(sizeof(*hsag) + 905 - // 1 extra for the lifespan config entry 906 - sizeof(void *) * (stats->num_counters + 1), 909 + sizeof(void *) * (stats->num_counters + 2), 907 910 GFP_KERNEL); 908 911 if (!hsag) 909 - return; 912 + goto err_free_stats; 910 913 911 914 ret = device->get_hw_stats(device, stats, port_num, 912 915 stats->num_counters); 913 916 if (ret != stats->num_counters) 914 - goto err; 917 + goto err_free_hsag; 915 918 916 919 stats->timestamp = jiffies; 917 920 ··· 925 922 hsag->attrs[i] = alloc_hsa(i, port_num, stats->names[i]); 926 923 if (!hsag->attrs[i]) 927 924 goto err; 925 + sysfs_attr_init(hsag->attrs[i]); 928 926 } 929 927 930 928 /* treat an error here as non-fatal */ 931 929 hsag->attrs[i] = alloc_hsa_lifespan("lifespan", port_num); 930 + if (hsag->attrs[i]) 931 + sysfs_attr_init(hsag->attrs[i]); 932 932 933 933 if (port) { 934 934 struct kobject *kobj = &port->kobj; ··· 952 946 return; 953 947 954 948 err: 955 - kfree(stats); 956 949 for (; i >= 0; i--) 957 950 kfree(hsag->attrs[i]); 951 + err_free_hsag: 958 952 kfree(hsag); 953 + err_free_stats: 954 + kfree(stats); 959 955 return; 960 956 } 961 957
+14 -17
drivers/infiniband/hw/hfi1/affinity.c
··· 300 300 const struct cpumask *node_mask, 301 301 *proc_mask = tsk_cpus_allowed(current); 302 302 struct cpu_mask_set *set = &dd->affinity->proc; 303 - char buf[1024]; 304 303 305 304 /* 306 305 * check whether process/context affinity has already 307 306 * been set 308 307 */ 309 308 if (cpumask_weight(proc_mask) == 1) { 310 - scnprintf(buf, 1024, "%*pbl", cpumask_pr_args(proc_mask)); 311 - hfi1_cdbg(PROC, "PID %u %s affinity set to CPU %s", 312 - current->pid, current->comm, buf); 309 + hfi1_cdbg(PROC, "PID %u %s affinity set to CPU %*pbl", 310 + current->pid, current->comm, 311 + cpumask_pr_args(proc_mask)); 313 312 /* 314 313 * Mark the pre-set CPU as used. This is atomic so we don't 315 314 * need the lock ··· 317 318 cpumask_set_cpu(cpu, &set->used); 318 319 goto done; 319 320 } else if (cpumask_weight(proc_mask) < cpumask_weight(&set->mask)) { 320 - scnprintf(buf, 1024, "%*pbl", cpumask_pr_args(proc_mask)); 321 - hfi1_cdbg(PROC, "PID %u %s affinity set to CPU set(s) %s", 322 - current->pid, current->comm, buf); 321 + hfi1_cdbg(PROC, "PID %u %s affinity set to CPU set(s) %*pbl", 322 + current->pid, current->comm, 323 + cpumask_pr_args(proc_mask)); 323 324 goto done; 324 325 } 325 326 ··· 355 356 cpumask_or(intrs, intrs, (dd->affinity->rcv_intr.gen ? 356 357 &dd->affinity->rcv_intr.mask : 357 358 &dd->affinity->rcv_intr.used)); 358 - scnprintf(buf, 1024, "%*pbl", cpumask_pr_args(intrs)); 359 - hfi1_cdbg(PROC, "CPUs used by interrupts: %s", buf); 359 + hfi1_cdbg(PROC, "CPUs used by interrupts: %*pbl", 360 + cpumask_pr_args(intrs)); 360 361 361 362 /* 362 363 * If we don't have a NUMA node requested, preference is towards ··· 365 366 if (node == -1) 366 367 node = dd->node; 367 368 node_mask = cpumask_of_node(node); 368 - scnprintf(buf, 1024, "%*pbl", cpumask_pr_args(node_mask)); 369 - hfi1_cdbg(PROC, "device on NUMA %u, CPUs %s", node, buf); 369 + hfi1_cdbg(PROC, "device on NUMA %u, CPUs %*pbl", node, 370 + cpumask_pr_args(node_mask)); 370 371 371 372 /* diff will hold all unused cpus */ 372 373 cpumask_andnot(diff, &set->mask, &set->used); 373 - scnprintf(buf, 1024, "%*pbl", cpumask_pr_args(diff)); 374 - hfi1_cdbg(PROC, "unused CPUs (all) %s", buf); 374 + hfi1_cdbg(PROC, "unused CPUs (all) %*pbl", cpumask_pr_args(diff)); 375 375 376 376 /* get cpumask of available CPUs on preferred NUMA */ 377 377 cpumask_and(mask, diff, node_mask); 378 - scnprintf(buf, 1024, "%*pbl", cpumask_pr_args(mask)); 379 - hfi1_cdbg(PROC, "available cpus on NUMA %s", buf); 378 + hfi1_cdbg(PROC, "available cpus on NUMA %*pbl", cpumask_pr_args(mask)); 380 379 381 380 /* 382 381 * At first, we don't want to place processes on the same ··· 392 395 cpumask_andnot(diff, &set->mask, &set->used); 393 396 cpumask_andnot(mask, diff, node_mask); 394 397 } 395 - scnprintf(buf, 1024, "%*pbl", cpumask_pr_args(mask)); 396 - hfi1_cdbg(PROC, "possible CPUs for process %s", buf); 398 + hfi1_cdbg(PROC, "possible CPUs for process %*pbl", 399 + cpumask_pr_args(mask)); 397 400 398 401 cpu = cpumask_first(mask); 399 402 if (cpu >= nr_cpu_ids) /* empty */
+3 -3
drivers/infiniband/hw/hfi1/chip.c
··· 7832 7832 * save first 2 flits in the packet that caused 7833 7833 * the error 7834 7834 */ 7835 - dd->err_info_rcvport.packet_flit1 = hdr0; 7836 - dd->err_info_rcvport.packet_flit2 = hdr1; 7835 + dd->err_info_rcvport.packet_flit1 = hdr0; 7836 + dd->err_info_rcvport.packet_flit2 = hdr1; 7837 7837 } 7838 7838 switch (info) { 7839 7839 case 1: ··· 11906 11906 hfi1_cdbg(CNTR, "[%d] No update necessary", dd->unit); 11907 11907 } 11908 11908 11909 - mod_timer(&dd->synth_stats_timer, jiffies + HZ * SYNTH_CNT_TIME); 11909 + mod_timer(&dd->synth_stats_timer, jiffies + HZ * SYNTH_CNT_TIME); 11910 11910 } 11911 11911 11912 11912 #define C_MAX_NAME 13 /* 12 chars + one for /0 */
+1 -1
drivers/infiniband/hw/hfi1/init.c
··· 1337 1337 dma_free_coherent(&dd->pcidev->dev, sizeof(u64), 1338 1338 (void *)dd->rcvhdrtail_dummy_kvaddr, 1339 1339 dd->rcvhdrtail_dummy_physaddr); 1340 - dd->rcvhdrtail_dummy_kvaddr = NULL; 1340 + dd->rcvhdrtail_dummy_kvaddr = NULL; 1341 1341 } 1342 1342 1343 1343 for (ctxt = 0; tmp && ctxt < dd->num_rcv_contexts; ctxt++) {
-13
drivers/infiniband/hw/hfi1/trace.c
··· 214 214 return ret; 215 215 } 216 216 217 - const char *print_u64_array( 218 - struct trace_seq *p, 219 - u64 *arr, int len) 220 - { 221 - int i; 222 - const char *ret = trace_seq_buffer_ptr(p); 223 - 224 - for (i = 0; i < len; i++) 225 - trace_seq_printf(p, "%s0x%016llx", i == 0 ? "" : " ", arr[i]); 226 - trace_seq_putc(p, 0); 227 - return ret; 228 - } 229 - 230 217 __hfi1_trace_fn(PKT); 231 218 __hfi1_trace_fn(PROC); 232 219 __hfi1_trace_fn(SDMA);
+3 -3
drivers/infiniband/hw/hfi1/user_sdma.c
··· 183 183 struct sdma_mmu_node *node; 184 184 }; 185 185 186 - #define SDMA_CACHE_NODE_EVICT BIT(0) 186 + #define SDMA_CACHE_NODE_EVICT 0 187 187 188 188 struct sdma_mmu_node { 189 189 struct mmu_rb_node rb; ··· 1355 1355 */ 1356 1356 SDMA_DBG(req, "TID offset %ubytes %uunits om%u", 1357 1357 req->tidoffset, req->tidoffset / req->omfactor, 1358 - !!(req->omfactor - KDETH_OM_SMALL)); 1358 + req->omfactor != KDETH_OM_SMALL); 1359 1359 KDETH_SET(hdr->kdeth.ver_tid_offset, OFFSET, 1360 1360 req->tidoffset / req->omfactor); 1361 1361 KDETH_SET(hdr->kdeth.ver_tid_offset, OM, 1362 - !!(req->omfactor - KDETH_OM_SMALL)); 1362 + req->omfactor != KDETH_OM_SMALL); 1363 1363 } 1364 1364 done: 1365 1365 trace_hfi1_sdma_user_header(pq->dd, pq->ctxt, pq->subctxt,
+2 -2
drivers/infiniband/hw/mlx4/main.c
··· 505 505 props->device_cap_flags |= IB_DEVICE_MEM_WINDOW_TYPE_2B; 506 506 else 507 507 props->device_cap_flags |= IB_DEVICE_MEM_WINDOW_TYPE_2A; 508 - if (dev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED) 509 - props->device_cap_flags |= IB_DEVICE_MANAGED_FLOW_STEERING; 510 508 } 509 + if (dev->steering_support == MLX4_STEERING_MODE_DEVICE_MANAGED) 510 + props->device_cap_flags |= IB_DEVICE_MANAGED_FLOW_STEERING; 511 511 512 512 props->device_cap_flags |= IB_DEVICE_RAW_IP_CSUM; 513 513
+9 -3
drivers/infiniband/hw/mlx5/cq.c
··· 822 822 int eqn; 823 823 int err; 824 824 825 - if (entries < 0) 825 + if (entries < 0 || 826 + (entries > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz)))) 826 827 return ERR_PTR(-EINVAL); 827 828 828 829 if (check_cq_create_flags(attr->flags)) ··· 1169 1168 return -ENOSYS; 1170 1169 } 1171 1170 1172 - if (entries < 1) 1171 + if (entries < 1 || 1172 + entries > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz))) { 1173 + mlx5_ib_warn(dev, "wrong entries number %d, max %d\n", 1174 + entries, 1175 + 1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz)); 1173 1176 return -EINVAL; 1177 + } 1174 1178 1175 1179 entries = roundup_pow_of_two(entries + 1); 1176 - if (entries > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz)) + 1) 1180 + if (entries > (1 << MLX5_CAP_GEN(dev->mdev, log_max_cq_sz)) + 1) 1177 1181 return -EINVAL; 1178 1182 1179 1183 if (entries == ibcq->cqe + 1)
+15 -7
drivers/infiniband/hw/mlx5/main.c
··· 524 524 MLX5_CAP_ETH(dev->mdev, scatter_fcs)) 525 525 props->device_cap_flags |= IB_DEVICE_RAW_SCATTER_FCS; 526 526 527 + if (mlx5_get_flow_namespace(dev->mdev, MLX5_FLOW_NAMESPACE_BYPASS)) 528 + props->device_cap_flags |= IB_DEVICE_MANAGED_FLOW_STEERING; 529 + 527 530 props->vendor_part_id = mdev->pdev->device; 528 531 props->hw_ver = mdev->pdev->revision; 529 532 ··· 918 915 num_uars = req.total_num_uuars / MLX5_NON_FP_BF_REGS_PER_PAGE; 919 916 gross_uuars = num_uars * MLX5_BF_REGS_PER_PAGE; 920 917 resp.qp_tab_size = 1 << MLX5_CAP_GEN(dev->mdev, log_max_qp); 921 - resp.bf_reg_size = 1 << MLX5_CAP_GEN(dev->mdev, log_bf_reg_size); 918 + if (mlx5_core_is_pf(dev->mdev) && MLX5_CAP_GEN(dev->mdev, bf)) 919 + resp.bf_reg_size = 1 << MLX5_CAP_GEN(dev->mdev, log_bf_reg_size); 922 920 resp.cache_line_size = L1_CACHE_BYTES; 923 921 resp.max_sq_desc_sz = MLX5_CAP_GEN(dev->mdev, max_wqe_sz_sq); 924 922 resp.max_rq_desc_sz = MLX5_CAP_GEN(dev->mdev, max_wqe_sz_rq); ··· 992 988 if (field_avail(typeof(resp), cqe_version, udata->outlen)) 993 989 resp.response_length += sizeof(resp.cqe_version); 994 990 995 - if (field_avail(typeof(resp), hca_core_clock_offset, udata->outlen)) { 991 + /* 992 + * We don't want to expose information from the PCI bar that is located 993 + * after 4096 bytes, so if the arch only supports larger pages, let's 994 + * pretend we don't support reading the HCA's core clock. This is also 995 + * forced by mmap function. 996 + */ 997 + if (PAGE_SIZE <= 4096 && 998 + field_avail(typeof(resp), hca_core_clock_offset, udata->outlen)) { 996 999 resp.comp_mask |= 997 1000 MLX5_IB_ALLOC_UCONTEXT_RESP_MASK_CORE_CLOCK_OFFSET; 998 1001 resp.hca_core_clock_offset = ··· 1809 1798 { 1810 1799 struct mlx5_ib_dev *dev = 1811 1800 container_of(device, struct mlx5_ib_dev, ib_dev.dev); 1812 - return sprintf(buf, "%d.%d.%d\n", fw_rev_maj(dev->mdev), 1801 + return sprintf(buf, "%d.%d.%04d\n", fw_rev_maj(dev->mdev), 1813 1802 fw_rev_min(dev->mdev), fw_rev_sub(dev->mdev)); 1814 1803 } 1815 1804 ··· 1877 1866 break; 1878 1867 1879 1868 case MLX5_DEV_EVENT_PORT_DOWN: 1869 + case MLX5_DEV_EVENT_PORT_INITIALIZED: 1880 1870 ibev.event = IB_EVENT_PORT_ERR; 1881 1871 port = (u8)param; 1882 1872 break; 1883 - 1884 - case MLX5_DEV_EVENT_PORT_INITIALIZED: 1885 - /* not used by ULPs */ 1886 - return; 1887 1873 1888 1874 case MLX5_DEV_EVENT_LID_CHANGE: 1889 1875 ibev.event = IB_EVENT_LID_CHANGE;
+25 -16
drivers/infiniband/hw/mlx5/qp.c
··· 235 235 qp->rq.max_gs = 0; 236 236 qp->rq.wqe_cnt = 0; 237 237 qp->rq.wqe_shift = 0; 238 + cap->max_recv_wr = 0; 239 + cap->max_recv_sge = 0; 238 240 } else { 239 241 if (ucmd) { 240 242 qp->rq.wqe_cnt = ucmd->rq_wqe_count; ··· 1853 1851 static int mlx5_set_path(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp, 1854 1852 const struct ib_ah_attr *ah, 1855 1853 struct mlx5_qp_path *path, u8 port, int attr_mask, 1856 - u32 path_flags, const struct ib_qp_attr *attr) 1854 + u32 path_flags, const struct ib_qp_attr *attr, 1855 + bool alt) 1857 1856 { 1858 1857 enum rdma_link_layer ll = rdma_port_get_link_layer(&dev->ib_dev, port); 1859 1858 int err; 1860 1859 1861 1860 if (attr_mask & IB_QP_PKEY_INDEX) 1862 - path->pkey_index = attr->pkey_index; 1861 + path->pkey_index = cpu_to_be16(alt ? attr->alt_pkey_index : 1862 + attr->pkey_index); 1863 1863 1864 1864 if (ah->ah_flags & IB_AH_GRH) { 1865 1865 if (ah->grh.sgid_index >= ··· 1881 1877 ah->grh.sgid_index); 1882 1878 path->dci_cfi_prio_sl = (ah->sl & 0x7) << 4; 1883 1879 } else { 1884 - path->fl = (path_flags & MLX5_PATH_FLAG_FL) ? 0x80 : 0; 1885 - path->free_ar = (path_flags & MLX5_PATH_FLAG_FREE_AR) ? 0x80 : 1886 - 0; 1880 + path->fl_free_ar = (path_flags & MLX5_PATH_FLAG_FL) ? 0x80 : 0; 1881 + path->fl_free_ar |= 1882 + (path_flags & MLX5_PATH_FLAG_FREE_AR) ? 0x40 : 0; 1887 1883 path->rlid = cpu_to_be16(ah->dlid); 1888 1884 path->grh_mlid = ah->src_path_bits & 0x7f; 1889 1885 if (ah->ah_flags & IB_AH_GRH) ··· 1907 1903 path->port = port; 1908 1904 1909 1905 if (attr_mask & IB_QP_TIMEOUT) 1910 - path->ackto_lt = attr->timeout << 3; 1906 + path->ackto_lt = (alt ? attr->alt_timeout : attr->timeout) << 3; 1911 1907 1912 1908 if ((qp->ibqp.qp_type == IB_QPT_RAW_PACKET) && qp->sq.wqe_cnt) 1913 1909 return modify_raw_packet_eth_prio(dev->mdev, ··· 2268 2264 context->log_pg_sz_remote_qpn = cpu_to_be32(attr->dest_qp_num); 2269 2265 2270 2266 if (attr_mask & IB_QP_PKEY_INDEX) 2271 - context->pri_path.pkey_index = attr->pkey_index; 2267 + context->pri_path.pkey_index = cpu_to_be16(attr->pkey_index); 2272 2268 2273 2269 /* todo implement counter_index functionality */ 2274 2270 ··· 2281 2277 if (attr_mask & IB_QP_AV) { 2282 2278 err = mlx5_set_path(dev, qp, &attr->ah_attr, &context->pri_path, 2283 2279 attr_mask & IB_QP_PORT ? attr->port_num : qp->port, 2284 - attr_mask, 0, attr); 2280 + attr_mask, 0, attr, false); 2285 2281 if (err) 2286 2282 goto out; 2287 2283 } ··· 2292 2288 if (attr_mask & IB_QP_ALT_PATH) { 2293 2289 err = mlx5_set_path(dev, qp, &attr->alt_ah_attr, 2294 2290 &context->alt_path, 2295 - attr->alt_port_num, attr_mask, 0, attr); 2291 + attr->alt_port_num, 2292 + attr_mask | IB_QP_PKEY_INDEX | IB_QP_TIMEOUT, 2293 + 0, attr, true); 2296 2294 if (err) 2297 2295 goto out; 2298 2296 } ··· 4019 4013 if (qp->ibqp.qp_type == IB_QPT_RC || qp->ibqp.qp_type == IB_QPT_UC) { 4020 4014 to_ib_ah_attr(dev, &qp_attr->ah_attr, &context->pri_path); 4021 4015 to_ib_ah_attr(dev, &qp_attr->alt_ah_attr, &context->alt_path); 4022 - qp_attr->alt_pkey_index = context->alt_path.pkey_index & 0x7f; 4016 + qp_attr->alt_pkey_index = 4017 + be16_to_cpu(context->alt_path.pkey_index); 4023 4018 qp_attr->alt_port_num = qp_attr->alt_ah_attr.port_num; 4024 4019 } 4025 4020 4026 - qp_attr->pkey_index = context->pri_path.pkey_index & 0x7f; 4021 + qp_attr->pkey_index = be16_to_cpu(context->pri_path.pkey_index); 4027 4022 qp_attr->port_num = context->pri_path.port; 4028 4023 4029 4024 /* qp_attr->en_sqd_async_notify is only applicable in modify qp */ ··· 4086 4079 qp_attr->cap.max_recv_sge = qp->rq.max_gs; 4087 4080 4088 4081 if (!ibqp->uobject) { 4089 - qp_attr->cap.max_send_wr = qp->sq.wqe_cnt; 4082 + qp_attr->cap.max_send_wr = qp->sq.max_post; 4090 4083 qp_attr->cap.max_send_sge = qp->sq.max_gs; 4084 + qp_init_attr->qp_context = ibqp->qp_context; 4091 4085 } else { 4092 4086 qp_attr->cap.max_send_wr = 0; 4093 4087 qp_attr->cap.max_send_sge = 0; 4094 4088 } 4095 4089 4096 - /* We don't support inline sends for kernel QPs (yet), and we 4097 - * don't know what userspace's value should be. 4098 - */ 4099 - qp_attr->cap.max_inline_data = 0; 4090 + qp_init_attr->qp_type = ibqp->qp_type; 4091 + qp_init_attr->recv_cq = ibqp->recv_cq; 4092 + qp_init_attr->send_cq = ibqp->send_cq; 4093 + qp_init_attr->srq = ibqp->srq; 4094 + qp_attr->cap.max_inline_data = qp->max_inline_data; 4100 4095 4101 4096 qp_init_attr->cap = qp_attr->cap; 4102 4097
-5
drivers/infiniband/hw/usnic/usnic_uiom.c
··· 36 36 #include <linux/dma-mapping.h> 37 37 #include <linux/sched.h> 38 38 #include <linux/hugetlb.h> 39 - #include <linux/dma-attrs.h> 40 39 #include <linux/iommu.h> 41 40 #include <linux/workqueue.h> 42 41 #include <linux/list.h> ··· 111 112 int i; 112 113 int flags; 113 114 dma_addr_t pa; 114 - DEFINE_DMA_ATTRS(attrs); 115 - 116 - if (dmasync) 117 - dma_set_attr(DMA_ATTR_WRITE_BARRIER, &attrs); 118 115 119 116 if (!can_do_mlock()) 120 117 return -EPERM;
+6
drivers/infiniband/sw/rdmavt/qp.c
··· 502 502 */ 503 503 static void rvt_reset_qp(struct rvt_dev_info *rdi, struct rvt_qp *qp, 504 504 enum ib_qp_type type) 505 + __releases(&qp->s_lock) 506 + __releases(&qp->s_hlock) 507 + __releases(&qp->r_lock) 508 + __acquires(&qp->r_lock) 509 + __acquires(&qp->s_hlock) 510 + __acquires(&qp->s_lock) 505 511 { 506 512 if (qp->state != IB_QPS_RESET) { 507 513 qp->state = IB_QPS_RESET;
+1
drivers/infiniband/ulp/ipoib/ipoib.h
··· 94 94 IPOIB_NEIGH_TBL_FLUSH = 12, 95 95 IPOIB_FLAG_DEV_ADDR_SET = 13, 96 96 IPOIB_FLAG_DEV_ADDR_CTRL = 14, 97 + IPOIB_FLAG_GOING_DOWN = 15, 97 98 98 99 IPOIB_MAX_BACKOFF_SECONDS = 16, 99 100
+4
drivers/infiniband/ulp/ipoib/ipoib_cm.c
··· 1486 1486 { 1487 1487 struct net_device *dev = to_net_dev(d); 1488 1488 int ret; 1489 + struct ipoib_dev_priv *priv = netdev_priv(dev); 1490 + 1491 + if (test_bit(IPOIB_FLAG_GOING_DOWN, &priv->flags)) 1492 + return -EPERM; 1489 1493 1490 1494 if (!rtnl_trylock()) 1491 1495 return restart_syscall();
+4 -4
drivers/infiniband/ulp/ipoib/ipoib_ib.c
··· 1015 1015 if (ib_query_gid(priv->ca, priv->port, 0, &gid0, NULL)) 1016 1016 return false; 1017 1017 1018 - netif_addr_lock(priv->dev); 1018 + netif_addr_lock_bh(priv->dev); 1019 1019 1020 1020 /* The subnet prefix may have changed, update it now so we won't have 1021 1021 * to do it later ··· 1026 1026 1027 1027 search_gid.global.interface_id = priv->local_gid.global.interface_id; 1028 1028 1029 - netif_addr_unlock(priv->dev); 1029 + netif_addr_unlock_bh(priv->dev); 1030 1030 1031 1031 err = ib_find_gid(priv->ca, &search_gid, IB_GID_TYPE_IB, 1032 1032 priv->dev, &port, &index); 1033 1033 1034 - netif_addr_lock(priv->dev); 1034 + netif_addr_lock_bh(priv->dev); 1035 1035 1036 1036 if (search_gid.global.interface_id != 1037 1037 priv->local_gid.global.interface_id) ··· 1092 1092 } 1093 1093 1094 1094 out: 1095 - netif_addr_unlock(priv->dev); 1095 + netif_addr_unlock_bh(priv->dev); 1096 1096 1097 1097 return ret; 1098 1098 }
+10 -5
drivers/infiniband/ulp/ipoib/ipoib_main.c
··· 1206 1206 neigh = NULL; 1207 1207 goto out_unlock; 1208 1208 } 1209 - neigh->alive = jiffies; 1209 + 1210 + if (likely(skb_queue_len(&neigh->queue) < IPOIB_MAX_PATH_REC_QUEUE)) 1211 + neigh->alive = jiffies; 1210 1212 goto out_unlock; 1211 1213 } 1212 1214 } ··· 1853 1851 struct ipoib_dev_priv *child_priv; 1854 1852 struct net_device *netdev = priv->dev; 1855 1853 1856 - netif_addr_lock(netdev); 1854 + netif_addr_lock_bh(netdev); 1857 1855 1858 1856 memcpy(&priv->local_gid.global.interface_id, 1859 1857 &gid->global.interface_id, ··· 1861 1859 memcpy(netdev->dev_addr + 4, &priv->local_gid, sizeof(priv->local_gid)); 1862 1860 clear_bit(IPOIB_FLAG_DEV_ADDR_SET, &priv->flags); 1863 1861 1864 - netif_addr_unlock(netdev); 1862 + netif_addr_unlock_bh(netdev); 1865 1863 1866 1864 if (!test_bit(IPOIB_FLAG_SUBINTERFACE, &priv->flags)) { 1867 1865 down_read(&priv->vlan_rwsem); ··· 1877 1875 union ib_gid *gid = (union ib_gid *)(ss->__data + 4); 1878 1876 int ret = 0; 1879 1877 1880 - netif_addr_lock(dev); 1878 + netif_addr_lock_bh(dev); 1881 1879 1882 1880 /* Make sure the QPN, reserved and subnet prefix match the current 1883 1881 * lladdr, it also makes sure the lladdr is unicast. ··· 1887 1885 gid->global.interface_id == 0) 1888 1886 ret = -EINVAL; 1889 1887 1890 - netif_addr_unlock(dev); 1888 + netif_addr_unlock_bh(dev); 1891 1889 1892 1890 return ret; 1893 1891 } ··· 2142 2140 list_for_each_entry_safe(priv, tmp, dev_list, list) { 2143 2141 ib_unregister_event_handler(&priv->event_handler); 2144 2142 flush_workqueue(ipoib_workqueue); 2143 + 2144 + /* mark interface in the middle of destruction */ 2145 + set_bit(IPOIB_FLAG_GOING_DOWN, &priv->flags); 2145 2146 2146 2147 rtnl_lock(); 2147 2148 dev_change_flags(priv->dev, priv->dev->flags & ~IFF_UP);
+3 -3
drivers/infiniband/ulp/ipoib/ipoib_multicast.c
··· 582 582 return; 583 583 } 584 584 priv->local_lid = port_attr.lid; 585 - netif_addr_lock(dev); 585 + netif_addr_lock_bh(dev); 586 586 587 587 if (!test_bit(IPOIB_FLAG_DEV_ADDR_SET, &priv->flags)) { 588 - netif_addr_unlock(dev); 588 + netif_addr_unlock_bh(dev); 589 589 return; 590 590 } 591 - netif_addr_unlock(dev); 591 + netif_addr_unlock_bh(dev); 592 592 593 593 spin_lock_irq(&priv->lock); 594 594 if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags))
+6
drivers/infiniband/ulp/ipoib/ipoib_vlan.c
··· 131 131 132 132 ppriv = netdev_priv(pdev); 133 133 134 + if (test_bit(IPOIB_FLAG_GOING_DOWN, &ppriv->flags)) 135 + return -EPERM; 136 + 134 137 snprintf(intf_name, sizeof intf_name, "%s.%04x", 135 138 ppriv->dev->name, pkey); 136 139 priv = ipoib_intf_alloc(intf_name); ··· 185 182 return -EPERM; 186 183 187 184 ppriv = netdev_priv(pdev); 185 + 186 + if (test_bit(IPOIB_FLAG_GOING_DOWN, &ppriv->flags)) 187 + return -EPERM; 188 188 189 189 if (!rtnl_trylock()) 190 190 return restart_syscall();
+2 -5
drivers/infiniband/ulp/srp/ib_srp.c
··· 1457 1457 { 1458 1458 unsigned int sg_offset = 0; 1459 1459 1460 - state->desc = req->indirect_desc; 1461 1460 state->fr.next = req->fr_list; 1462 1461 state->fr.end = req->fr_list + ch->target->mr_per_cmd; 1463 1462 state->sg = scat; ··· 1488 1489 struct scatterlist *sg; 1489 1490 int i; 1490 1491 1491 - state->desc = req->indirect_desc; 1492 1492 for_each_sg(scat, sg, count, i) { 1493 1493 srp_map_desc(state, ib_sg_dma_address(dev->dev, sg), 1494 1494 ib_sg_dma_len(dev->dev, sg), ··· 1653 1655 target->indirect_size, DMA_TO_DEVICE); 1654 1656 1655 1657 memset(&state, 0, sizeof(state)); 1658 + state.desc = req->indirect_desc; 1656 1659 if (dev->use_fast_reg) 1657 1660 ret = srp_map_sg_fr(&state, ch, req, scat, count); 1658 1661 else if (dev->use_fmr) ··· 3525 3526 int mr_page_shift, p; 3526 3527 u64 max_pages_per_mr; 3527 3528 3528 - srp_dev = kmalloc(sizeof *srp_dev, GFP_KERNEL); 3529 + srp_dev = kzalloc(sizeof(*srp_dev), GFP_KERNEL); 3529 3530 if (!srp_dev) 3530 3531 return; 3531 3532 ··· 3585 3586 IB_ACCESS_REMOTE_WRITE); 3586 3587 if (IS_ERR(srp_dev->global_mr)) 3587 3588 goto err_pd; 3588 - } else { 3589 - srp_dev->global_mr = NULL; 3590 3589 } 3591 3590 3592 3591 for (p = rdma_start_port(device); p <= rdma_end_port(device); ++p) {
+2 -3
include/linux/mlx5/qp.h
··· 460 460 }; 461 461 462 462 struct mlx5_qp_path { 463 - u8 fl; 463 + u8 fl_free_ar; 464 464 u8 rsvd3; 465 - u8 free_ar; 466 - u8 pkey_index; 465 + __be16 pkey_index; 467 466 u8 rsvd0; 468 467 u8 grh_mlid; 469 468 __be16 rlid;
+3 -3
include/rdma/ib_verbs.h
··· 217 217 IB_DEVICE_CROSS_CHANNEL = (1 << 27), 218 218 IB_DEVICE_MANAGED_FLOW_STEERING = (1 << 29), 219 219 IB_DEVICE_SIGNATURE_HANDOVER = (1 << 30), 220 - IB_DEVICE_ON_DEMAND_PAGING = (1 << 31), 220 + IB_DEVICE_ON_DEMAND_PAGING = (1ULL << 31), 221 221 IB_DEVICE_SG_GAPS_REG = (1ULL << 32), 222 - IB_DEVICE_VIRTUAL_FUNCTION = ((u64)1 << 33), 223 - IB_DEVICE_RAW_SCATTER_FCS = ((u64)1 << 34), 222 + IB_DEVICE_VIRTUAL_FUNCTION = (1ULL << 33), 223 + IB_DEVICE_RAW_SCATTER_FCS = (1ULL << 34), 224 224 }; 225 225 226 226 enum ib_signature_prot_cap {