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

Configure Feed

Select the types of activity you want to include in your feed.

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

Pull rdma fixes from Jason Gunthorpe:
"We had a fairly slow cycle on the rc side this time, here are the
accumulated fixes, mostly in drivers:

- irdma should not generate extra completions during flushing

- Fix several memory leaks

- Do not get confused in irdma's iwarp mode if IPv6 is present

- Correct a link speed calculation in mlx5

- Increase the EQ/WQ limits on erdma as they are too small for big
applications

- Use the right math for erdma's inline mtt feature

- Make erdma probing more robust to boot time ordering differences

- Fix a KMSAN crash in CMA due to uninitialized qkey"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma:
RDMA/core: Fix GID entry ref leak when create_ah fails
RDMA/cma: Allow UD qp_type to join multicast only
RDMA/erdma: Defer probing if netdevice can not be found
RDMA/erdma: Inline mtt entries into WQE if supported
RDMA/erdma: Update default EQ depth to 4096 and max_send_wr to 8192
RDMA/erdma: Fix some typos
IB/mlx5: Add support for 400G_8X lane speed
RDMA/irdma: Add ipv4 check to irdma_find_listener()
RDMA/irdma: Increase iWARP CM default rexmit count
RDMA/irdma: Fix memory leak of PBLE objects
RDMA/irdma: Do not generate SW completions for NOPs

+65 -41
+34 -26
drivers/infiniband/core/cma.c
··· 624 624 return id_priv->id.route.addr.src_addr.ss_family; 625 625 } 626 626 627 - static int cma_set_qkey(struct rdma_id_private *id_priv, u32 qkey) 627 + static int cma_set_default_qkey(struct rdma_id_private *id_priv) 628 628 { 629 629 struct ib_sa_mcmember_rec rec; 630 630 int ret = 0; 631 - 632 - if (id_priv->qkey) { 633 - if (qkey && id_priv->qkey != qkey) 634 - return -EINVAL; 635 - return 0; 636 - } 637 - 638 - if (qkey) { 639 - id_priv->qkey = qkey; 640 - return 0; 641 - } 642 631 643 632 switch (id_priv->id.ps) { 644 633 case RDMA_PS_UDP: ··· 646 657 break; 647 658 } 648 659 return ret; 660 + } 661 + 662 + static int cma_set_qkey(struct rdma_id_private *id_priv, u32 qkey) 663 + { 664 + if (!qkey || 665 + (id_priv->qkey && (id_priv->qkey != qkey))) 666 + return -EINVAL; 667 + 668 + id_priv->qkey = qkey; 669 + return 0; 649 670 } 650 671 651 672 static void cma_translate_ib(struct sockaddr_ib *sib, struct rdma_dev_addr *dev_addr) ··· 1228 1229 *qp_attr_mask = IB_QP_STATE | IB_QP_PKEY_INDEX | IB_QP_PORT; 1229 1230 1230 1231 if (id_priv->id.qp_type == IB_QPT_UD) { 1231 - ret = cma_set_qkey(id_priv, 0); 1232 + ret = cma_set_default_qkey(id_priv); 1232 1233 if (ret) 1233 1234 return ret; 1234 1235 ··· 4568 4569 memset(&rep, 0, sizeof rep); 4569 4570 rep.status = status; 4570 4571 if (status == IB_SIDR_SUCCESS) { 4571 - ret = cma_set_qkey(id_priv, qkey); 4572 + if (qkey) 4573 + ret = cma_set_qkey(id_priv, qkey); 4574 + else 4575 + ret = cma_set_default_qkey(id_priv); 4572 4576 if (ret) 4573 4577 return ret; 4574 4578 rep.qp_num = id_priv->qp_num; ··· 4776 4774 enum ib_gid_type gid_type; 4777 4775 struct net_device *ndev; 4778 4776 4779 - if (!status) 4780 - status = cma_set_qkey(id_priv, be32_to_cpu(multicast->rec.qkey)); 4781 - else 4777 + if (status) 4782 4778 pr_debug_ratelimited("RDMA CM: MULTICAST_ERROR: failed to join multicast. status %d\n", 4783 4779 status); 4784 4780 ··· 4804 4804 } 4805 4805 4806 4806 event->param.ud.qp_num = 0xFFFFFF; 4807 - event->param.ud.qkey = be32_to_cpu(multicast->rec.qkey); 4807 + event->param.ud.qkey = id_priv->qkey; 4808 4808 4809 4809 out: 4810 4810 if (ndev) ··· 4823 4823 READ_ONCE(id_priv->state) == RDMA_CM_DESTROYING) 4824 4824 goto out; 4825 4825 4826 - cma_make_mc_event(status, id_priv, multicast, &event, mc); 4827 - ret = cma_cm_event_handler(id_priv, &event); 4826 + ret = cma_set_qkey(id_priv, be32_to_cpu(multicast->rec.qkey)); 4827 + if (!ret) { 4828 + cma_make_mc_event(status, id_priv, multicast, &event, mc); 4829 + ret = cma_cm_event_handler(id_priv, &event); 4830 + } 4828 4831 rdma_destroy_ah_attr(&event.param.ud.ah_attr); 4829 4832 WARN_ON(ret); 4830 4833 ··· 4880 4877 if (ret) 4881 4878 return ret; 4882 4879 4883 - ret = cma_set_qkey(id_priv, 0); 4884 - if (ret) 4885 - return ret; 4880 + if (!id_priv->qkey) { 4881 + ret = cma_set_default_qkey(id_priv); 4882 + if (ret) 4883 + return ret; 4884 + } 4886 4885 4887 4886 cma_set_mgid(id_priv, (struct sockaddr *) &mc->addr, &rec.mgid); 4888 4887 rec.qkey = cpu_to_be32(id_priv->qkey); ··· 4961 4956 cma_iboe_set_mgid(addr, &ib.rec.mgid, gid_type); 4962 4957 4963 4958 ib.rec.pkey = cpu_to_be16(0xffff); 4964 - if (id_priv->id.ps == RDMA_PS_UDP) 4965 - ib.rec.qkey = cpu_to_be32(RDMA_UDP_QKEY); 4966 - 4967 4959 if (dev_addr->bound_dev_if) 4968 4960 ndev = dev_get_by_index(dev_addr->net, dev_addr->bound_dev_if); 4969 4961 if (!ndev) ··· 4986 4984 if (err || !ib.rec.mtu) 4987 4985 return err ?: -EINVAL; 4988 4986 4987 + if (!id_priv->qkey) 4988 + cma_set_default_qkey(id_priv); 4989 + 4989 4990 rdma_ip2gid((struct sockaddr *)&id_priv->id.route.addr.src_addr, 4990 4991 &ib.rec.port_gid); 4991 4992 INIT_WORK(&mc->iboe_join.work, cma_iboe_join_work_handler); ··· 5012 5007 /* ULP is calling this wrong. */ 5013 5008 if (!id->device || (READ_ONCE(id_priv->state) != RDMA_CM_ADDR_BOUND && 5014 5009 READ_ONCE(id_priv->state) != RDMA_CM_ADDR_RESOLVED)) 5010 + return -EINVAL; 5011 + 5012 + if (id_priv->id.qp_type != IB_QPT_UD) 5015 5013 return -EINVAL; 5016 5014 5017 5015 mc = kzalloc(sizeof(*mc), GFP_KERNEL);
+2
drivers/infiniband/core/verbs.c
··· 532 532 else 533 533 ret = device->ops.create_ah(ah, &init_attr, NULL); 534 534 if (ret) { 535 + if (ah->sgid_attr) 536 + rdma_put_gid_attr(ah->sgid_attr); 535 537 kfree(ah); 536 538 return ERR_PTR(ret); 537 539 }
+1 -1
drivers/infiniband/hw/erdma/erdma_cq.c
··· 65 65 [ERDMA_OP_LOCAL_INV] = IB_WC_LOCAL_INV, 66 66 [ERDMA_OP_READ_WITH_INV] = IB_WC_RDMA_READ, 67 67 [ERDMA_OP_ATOMIC_CAS] = IB_WC_COMP_SWAP, 68 - [ERDMA_OP_ATOMIC_FAD] = IB_WC_FETCH_ADD, 68 + [ERDMA_OP_ATOMIC_FAA] = IB_WC_FETCH_ADD, 69 69 }; 70 70 71 71 static const struct {
+2 -2
drivers/infiniband/hw/erdma/erdma_hw.h
··· 441 441 }; 442 442 443 443 /* EQ related. */ 444 - #define ERDMA_DEFAULT_EQ_DEPTH 256 444 + #define ERDMA_DEFAULT_EQ_DEPTH 4096 445 445 446 446 /* ceqe */ 447 447 #define ERDMA_CEQE_HDR_DB_MASK BIT_ULL(63) ··· 491 491 ERDMA_OP_LOCAL_INV = 15, 492 492 ERDMA_OP_READ_WITH_INV = 16, 493 493 ERDMA_OP_ATOMIC_CAS = 17, 494 - ERDMA_OP_ATOMIC_FAD = 18, 494 + ERDMA_OP_ATOMIC_FAA = 18, 495 495 ERDMA_NUM_OPCODES = 19, 496 496 ERDMA_OP_INVALID = ERDMA_NUM_OPCODES + 1 497 497 };
+1 -1
drivers/infiniband/hw/erdma/erdma_main.c
··· 56 56 static int erdma_enum_and_get_netdev(struct erdma_dev *dev) 57 57 { 58 58 struct net_device *netdev; 59 - int ret = -ENODEV; 59 + int ret = -EPROBE_DEFER; 60 60 61 61 /* Already binded to a net_device, so we skip. */ 62 62 if (dev->netdev)
+2 -2
drivers/infiniband/hw/erdma/erdma_qp.c
··· 405 405 FIELD_PREP(ERDMA_SQE_MR_MTT_CNT_MASK, 406 406 mr->mem.mtt_nents); 407 407 408 - if (mr->mem.mtt_nents < ERDMA_MAX_INLINE_MTT_ENTRIES) { 408 + if (mr->mem.mtt_nents <= ERDMA_MAX_INLINE_MTT_ENTRIES) { 409 409 attrs |= FIELD_PREP(ERDMA_SQE_MR_MTT_TYPE_MASK, 0); 410 410 /* Copy SGLs to SQE content to accelerate */ 411 411 memcpy(get_queue_entry(qp->kern_qp.sq_buf, idx + 1, ··· 439 439 cpu_to_le64(atomic_wr(send_wr)->compare_add); 440 440 } else { 441 441 wqe_hdr |= FIELD_PREP(ERDMA_SQE_HDR_OPCODE_MASK, 442 - ERDMA_OP_ATOMIC_FAD); 442 + ERDMA_OP_ATOMIC_FAA); 443 443 atomic_sqe->fetchadd_swap_data = 444 444 cpu_to_le64(atomic_wr(send_wr)->compare_add); 445 445 }
+1 -1
drivers/infiniband/hw/erdma/erdma_verbs.h
··· 11 11 12 12 /* RDMA Capability. */ 13 13 #define ERDMA_MAX_PD (128 * 1024) 14 - #define ERDMA_MAX_SEND_WR 4096 14 + #define ERDMA_MAX_SEND_WR 8192 15 15 #define ERDMA_MAX_ORD 128 16 16 #define ERDMA_MAX_IRD 128 17 17 #define ERDMA_MAX_SGE_RD 1
+10 -6
drivers/infiniband/hw/irdma/cm.c
··· 1458 1458 * irdma_find_listener - find a cm node listening on this addr-port pair 1459 1459 * @cm_core: cm's core 1460 1460 * @dst_addr: listener ip addr 1461 + * @ipv4: flag indicating IPv4 when true 1461 1462 * @dst_port: listener tcp port num 1462 1463 * @vlan_id: virtual LAN ID 1463 1464 * @listener_state: state to match with listen node's 1464 1465 */ 1465 1466 static struct irdma_cm_listener * 1466 - irdma_find_listener(struct irdma_cm_core *cm_core, u32 *dst_addr, u16 dst_port, 1467 - u16 vlan_id, enum irdma_cm_listener_state listener_state) 1467 + irdma_find_listener(struct irdma_cm_core *cm_core, u32 *dst_addr, bool ipv4, 1468 + u16 dst_port, u16 vlan_id, 1469 + enum irdma_cm_listener_state listener_state) 1468 1470 { 1469 1471 struct irdma_cm_listener *listen_node; 1470 1472 static const u32 ip_zero[4] = { 0, 0, 0, 0 }; ··· 1479 1477 list_for_each_entry (listen_node, &cm_core->listen_list, list) { 1480 1478 memcpy(listen_addr, listen_node->loc_addr, sizeof(listen_addr)); 1481 1479 listen_port = listen_node->loc_port; 1482 - if (listen_port != dst_port || 1480 + if (listen_node->ipv4 != ipv4 || listen_port != dst_port || 1483 1481 !(listener_state & listen_node->listener_state)) 1484 1482 continue; 1485 1483 /* compare node pair, return node handle if a match */ ··· 2904 2902 unsigned long flags; 2905 2903 2906 2904 /* cannot have multiple matching listeners */ 2907 - listener = irdma_find_listener(cm_core, cm_info->loc_addr, 2908 - cm_info->loc_port, cm_info->vlan_id, 2909 - IRDMA_CM_LISTENER_EITHER_STATE); 2905 + listener = 2906 + irdma_find_listener(cm_core, cm_info->loc_addr, cm_info->ipv4, 2907 + cm_info->loc_port, cm_info->vlan_id, 2908 + IRDMA_CM_LISTENER_EITHER_STATE); 2910 2909 if (listener && 2911 2910 listener->listener_state == IRDMA_CM_LISTENER_ACTIVE_STATE) { 2912 2911 refcount_dec(&listener->refcnt); ··· 3156 3153 3157 3154 listener = irdma_find_listener(cm_core, 3158 3155 cm_info.loc_addr, 3156 + cm_info.ipv4, 3159 3157 cm_info.loc_port, 3160 3158 cm_info.vlan_id, 3161 3159 IRDMA_CM_LISTENER_ACTIVE_STATE);
+1 -1
drivers/infiniband/hw/irdma/cm.h
··· 41 41 #define TCP_OPTIONS_PADDING 3 42 42 43 43 #define IRDMA_DEFAULT_RETRYS 64 44 - #define IRDMA_DEFAULT_RETRANS 8 44 + #define IRDMA_DEFAULT_RETRANS 32 45 45 #define IRDMA_DEFAULT_TTL 0x40 46 46 #define IRDMA_DEFAULT_RTT_VAR 6 47 47 #define IRDMA_DEFAULT_SS_THRESH 0x3fffffff
+3
drivers/infiniband/hw/irdma/hw.c
··· 41 41 IRDMA_HMC_IW_XFFL, 42 42 IRDMA_HMC_IW_Q1, 43 43 IRDMA_HMC_IW_Q1FL, 44 + IRDMA_HMC_IW_PBLE, 44 45 IRDMA_HMC_IW_TIMER, 45 46 IRDMA_HMC_IW_FSIMC, 46 47 IRDMA_HMC_IW_FSIAV, ··· 828 827 info.entry_type = rf->sd_type; 829 828 830 829 for (i = 0; i < IW_HMC_OBJ_TYPE_NUM; i++) { 830 + if (iw_hmc_obj_types[i] == IRDMA_HMC_IW_PBLE) 831 + continue; 831 832 if (dev->hmc_info->hmc_obj[iw_hmc_obj_types[i]].cnt) { 832 833 info.rsrc_type = iw_hmc_obj_types[i]; 833 834 info.count = dev->hmc_info->hmc_obj[info.rsrc_type].cnt;
+4 -1
drivers/infiniband/hw/irdma/utils.c
··· 2595 2595 /* remove the SQ WR by moving SQ tail*/ 2596 2596 IRDMA_RING_SET_TAIL(*sq_ring, 2597 2597 sq_ring->tail + qp->sq_wrtrk_array[sq_ring->tail].quanta); 2598 - 2598 + if (cmpl->cpi.op_type == IRDMAQP_OP_NOP) { 2599 + kfree(cmpl); 2600 + continue; 2601 + } 2599 2602 ibdev_dbg(iwqp->iwscq->ibcq.device, 2600 2603 "DEV: %s: adding wr_id = 0x%llx SQ Completion to list qp_id=%d\n", 2601 2604 __func__, cmpl->cpi.wr_id, qp->qp_id);
+4
drivers/infiniband/hw/mlx5/main.c
··· 442 442 *active_width = IB_WIDTH_2X; 443 443 *active_speed = IB_SPEED_NDR; 444 444 break; 445 + case MLX5E_PROT_MASK(MLX5E_400GAUI_8): 446 + *active_width = IB_WIDTH_8X; 447 + *active_speed = IB_SPEED_HDR; 448 + break; 445 449 case MLX5E_PROT_MASK(MLX5E_400GAUI_4_400GBASE_CR4_KR4): 446 450 *active_width = IB_WIDTH_4X; 447 451 *active_speed = IB_SPEED_NDR;