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 fixes from Doug Ledford:
"No beating around the bush: this is a monster pull request for an -rc5
kernel. Intel hit me with a series of fixes for TID processing.
Mellanox hit me with a series for their UMR memory support.

And we had one fix for siw that fixes the 32bit build warnings and
because of the number of casts that had to be changed to properly
silence the warnings, that one patch alone is a full 40% of the LOC of
this entire pull request. Given that this is the initial release
kernel for siw, I'm trying to fix anything in it that we can, so that
adds to the impetus to take fixes for it like this one.

I had to do a rebase early in the week. Jason had thought he put a
patch on the rc queue that he needed to be there so he could base some
work off of it, and it had actually not been placed there. So he asked
me (on Tuesday) to fix that up before pushing my wip branch to the
official rc branch. I did, and that's why the early patches look like
they were all committed at the same time on Tuesday. That bunch had
been in my queue prior.

The various patches all pass my test for being legitimate fixes and
not attempts to slide new features or development into a late rc.
Well, they were all fixes with the exception of a couple clean up
patches people wrote for making the fixes they also wrote better (like
a cleanup patch to move UMR checking into a function so that the
remaining UMR fix patches can reference that function), so I left
those in place too.

My apologies for the LOC count and the number of patches here, it's
just how the cards fell this cycle.

Summary:

- Fix siw buffer mapping issue

- Fix siw 32/64 casting issues

- Fix a KASAN access issue in bnxt_re

- Fix several memory leaks (hfi1, mlx4)

- Fix a NULL deref in cma_cleanup

- Fixes for UMR memory support in mlx5 (4 patch series)

- Fix namespace check for restrack

- Fixes for counter support

- Fixes for hfi1 TID processing (5 patch series)

- Fix potential NULL deref in siw

- Fix memory page calculations in mlx5"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (21 commits)
RDMA/siw: Fix 64/32bit pointer inconsistency
RDMA/siw: Fix SGL mapping issues
RDMA/bnxt_re: Fix stack-out-of-bounds in bnxt_qplib_rcfw_send_message
infiniband: hfi1: fix memory leaks
infiniband: hfi1: fix a memory leak bug
IB/mlx4: Fix memory leaks
RDMA/cma: fix null-ptr-deref Read in cma_cleanup
IB/mlx5: Block MR WR if UMR is not possible
IB/mlx5: Fix MR re-registration flow to use UMR properly
IB/mlx5: Report and handle ODP support properly
IB/mlx5: Consolidate use_umr checks into single function
RDMA/restrack: Rewrite PID namespace check to be reliable
RDMA/counters: Properly implement PID checks
IB/core: Fix NULL pointer dereference when bind QP to counter
IB/hfi1: Drop stale TID RDMA packets that cause TIDErr
IB/hfi1: Add additional checks when handling TID RDMA WRITE DATA packet
IB/hfi1: Add additional checks when handling TID RDMA READ RESP packet
IB/hfi1: Unsafe PSN checking for TID RDMA READ Resp packet
IB/hfi1: Drop stale TID RDMA packets
RDMA/siw: Fix potential NULL de-ref
...

+248 -239
+5 -1
drivers/infiniband/core/cma.c
··· 4724 4724 if (ret) 4725 4725 goto err; 4726 4726 4727 - cma_configfs_init(); 4727 + ret = cma_configfs_init(); 4728 + if (ret) 4729 + goto err_ib; 4728 4730 4729 4731 return 0; 4730 4732 4733 + err_ib: 4734 + ib_unregister_client(&cma_client); 4731 4735 err: 4732 4736 unregister_netdevice_notifier(&cma_nb); 4733 4737 ib_sa_unregister_client(&sa_client);
+4 -6
drivers/infiniband/core/counters.c
··· 149 149 struct auto_mode_param *param = &counter->mode.param; 150 150 bool match = true; 151 151 152 - if (rdma_is_kernel_res(&counter->res) != rdma_is_kernel_res(&qp->res)) 152 + if (!rdma_is_visible_in_pid_ns(&qp->res)) 153 153 return false; 154 154 155 - /* Ensure that counter belong to right PID */ 156 - if (!rdma_is_kernel_res(&counter->res) && 157 - !rdma_is_kernel_res(&qp->res) && 158 - (task_pid_vnr(counter->res.task) != current->pid)) 155 + /* Ensure that counter belongs to the right PID */ 156 + if (task_pid_nr(counter->res.task) != task_pid_nr(qp->res.task)) 159 157 return false; 160 158 161 159 if (auto_mask & RDMA_COUNTER_MASK_QP_TYPE) ··· 422 424 return qp; 423 425 424 426 err: 425 - rdma_restrack_put(&qp->res); 427 + rdma_restrack_put(res); 426 428 return NULL; 427 429 } 428 430
+1 -2
drivers/infiniband/core/nldev.c
··· 382 382 for (i = 0; i < RDMA_RESTRACK_MAX; i++) { 383 383 if (!names[i]) 384 384 continue; 385 - curr = rdma_restrack_count(device, i, 386 - task_active_pid_ns(current)); 385 + curr = rdma_restrack_count(device, i); 387 386 ret = fill_res_info_entry(msg, names[i], curr); 388 387 if (ret) 389 388 goto err;
+7 -8
drivers/infiniband/core/restrack.c
··· 107 107 * rdma_restrack_count() - the current usage of specific object 108 108 * @dev: IB device 109 109 * @type: actual type of object to operate 110 - * @ns: PID namespace 111 110 */ 112 - int rdma_restrack_count(struct ib_device *dev, enum rdma_restrack_type type, 113 - struct pid_namespace *ns) 111 + int rdma_restrack_count(struct ib_device *dev, enum rdma_restrack_type type) 114 112 { 115 113 struct rdma_restrack_root *rt = &dev->res[type]; 116 114 struct rdma_restrack_entry *e; ··· 117 119 118 120 xa_lock(&rt->xa); 119 121 xas_for_each(&xas, e, U32_MAX) { 120 - if (ns == &init_pid_ns || 121 - (!rdma_is_kernel_res(e) && 122 - ns == task_active_pid_ns(e->task))) 123 - cnt++; 122 + if (!rdma_is_visible_in_pid_ns(e)) 123 + continue; 124 + cnt++; 124 125 } 125 126 xa_unlock(&rt->xa); 126 127 return cnt; ··· 357 360 */ 358 361 if (rdma_is_kernel_res(res)) 359 362 return task_active_pid_ns(current) == &init_pid_ns; 360 - return task_active_pid_ns(current) == task_active_pid_ns(res->task); 363 + 364 + /* PID 0 means that resource is not found in current namespace */ 365 + return task_pid_vnr(res->task); 361 366 }
+1 -6
drivers/infiniband/core/umem.c
··· 379 379 380 380 int ib_umem_page_count(struct ib_umem *umem) 381 381 { 382 - int i; 383 - int n; 382 + int i, n = 0; 384 383 struct scatterlist *sg; 385 384 386 - if (umem->is_odp) 387 - return ib_umem_num_pages(umem); 388 - 389 - n = 0; 390 385 for_each_sg(umem->sg_head.sgl, sg, umem->nmap, i) 391 386 n += sg_dma_len(sg) >> PAGE_SHIFT; 392 387
+7 -1
drivers/infiniband/hw/bnxt_re/qplib_rcfw.c
··· 136 136 spin_unlock_irqrestore(&cmdq->lock, flags); 137 137 return -EBUSY; 138 138 } 139 + 140 + size = req->cmd_size; 141 + /* change the cmd_size to the number of 16byte cmdq unit. 142 + * req->cmd_size is modified here 143 + */ 144 + bnxt_qplib_set_cmd_slots(req); 145 + 139 146 memset(resp, 0, sizeof(*resp)); 140 147 crsqe->resp = (struct creq_qp_event *)resp; 141 148 crsqe->resp->cookie = req->cookie; ··· 157 150 158 151 cmdq_ptr = (struct bnxt_qplib_cmdqe **)cmdq->pbl_ptr; 159 152 preq = (u8 *)req; 160 - size = req->cmd_size * BNXT_QPLIB_CMDQE_UNITS; 161 153 do { 162 154 /* Locate the next cmdq slot */ 163 155 sw_prod = HWQ_CMP(cmdq->prod, cmdq);
+8 -3
drivers/infiniband/hw/bnxt_re/qplib_rcfw.h
··· 55 55 do { \ 56 56 memset(&(req), 0, sizeof((req))); \ 57 57 (req).opcode = CMDQ_BASE_OPCODE_##CMD; \ 58 - (req).cmd_size = (sizeof((req)) + \ 59 - BNXT_QPLIB_CMDQE_UNITS - 1) / \ 60 - BNXT_QPLIB_CMDQE_UNITS; \ 58 + (req).cmd_size = sizeof((req)); \ 61 59 (req).flags = cpu_to_le16(cmd_flags); \ 62 60 } while (0) 63 61 ··· 91 93 { 92 94 return (bnxt_qplib_cmdqe_page_size(depth) / 93 95 BNXT_QPLIB_CMDQE_UNITS); 96 + } 97 + 98 + /* Set the cmd_size to a factor of CMDQE unit */ 99 + static inline void bnxt_qplib_set_cmd_slots(struct cmdq_base *req) 100 + { 101 + req->cmd_size = (req->cmd_size + BNXT_QPLIB_CMDQE_UNITS - 1) / 102 + BNXT_QPLIB_CMDQE_UNITS; 94 103 } 95 104 96 105 #define MAX_CMDQ_IDX(depth) ((depth) - 1)
+8 -4
drivers/infiniband/hw/hfi1/fault.c
··· 141 141 if (!data) 142 142 return -ENOMEM; 143 143 copy = min(len, datalen - 1); 144 - if (copy_from_user(data, buf, copy)) 145 - return -EFAULT; 144 + if (copy_from_user(data, buf, copy)) { 145 + ret = -EFAULT; 146 + goto free_data; 147 + } 146 148 147 149 ret = debugfs_file_get(file->f_path.dentry); 148 150 if (unlikely(ret)) 149 - return ret; 151 + goto free_data; 150 152 ptr = data; 151 153 token = ptr; 152 154 for (ptr = data; *ptr; ptr = end + 1, token = ptr) { ··· 197 195 ret = len; 198 196 199 197 debugfs_file_put(file->f_path.dentry); 198 + free_data: 200 199 kfree(data); 201 200 return ret; 202 201 } ··· 217 214 return -ENOMEM; 218 215 ret = debugfs_file_get(file->f_path.dentry); 219 216 if (unlikely(ret)) 220 - return ret; 217 + goto free_data; 221 218 bit = find_first_bit(fault->opcodes, bitsize); 222 219 while (bit < bitsize) { 223 220 zero = find_next_zero_bit(fault->opcodes, bitsize, bit); ··· 235 232 data[size - 1] = '\n'; 236 233 data[size] = '\0'; 237 234 ret = simple_read_from_buffer(buf, len, pos, data, size); 235 + free_data: 238 236 kfree(data); 239 237 return ret; 240 238 }
+27 -49
drivers/infiniband/hw/hfi1/tid_rdma.c
··· 2574 2574 hfi1_kern_clear_hw_flow(priv->rcd, qp); 2575 2575 } 2576 2576 2577 - static bool tid_rdma_tid_err(struct hfi1_ctxtdata *rcd, 2578 - struct hfi1_packet *packet, u8 rcv_type, 2579 - u8 opcode) 2577 + static bool tid_rdma_tid_err(struct hfi1_packet *packet, u8 rcv_type) 2580 2578 { 2581 2579 struct rvt_qp *qp = packet->qp; 2582 - struct hfi1_qp_priv *qpriv = qp->priv; 2583 - u32 ipsn; 2584 - struct ib_other_headers *ohdr = packet->ohdr; 2585 - struct rvt_ack_entry *e; 2586 - struct tid_rdma_request *req; 2587 - struct rvt_dev_info *rdi = ib_to_rvt(qp->ibqp.device); 2588 - u32 i; 2589 2580 2590 2581 if (rcv_type >= RHF_RCV_TYPE_IB) 2591 2582 goto done; ··· 2593 2602 if (rcv_type == RHF_RCV_TYPE_EAGER) { 2594 2603 hfi1_restart_rc(qp, qp->s_last_psn + 1, 1); 2595 2604 hfi1_schedule_send(qp); 2596 - goto done_unlock; 2597 2605 } 2598 2606 2599 - /* 2600 - * For TID READ response, error out QP after freeing the tid 2601 - * resources. 2602 - */ 2603 - if (opcode == TID_OP(READ_RESP)) { 2604 - ipsn = mask_psn(be32_to_cpu(ohdr->u.tid_rdma.r_rsp.verbs_psn)); 2605 - if (cmp_psn(ipsn, qp->s_last_psn) > 0 && 2606 - cmp_psn(ipsn, qp->s_psn) < 0) { 2607 - hfi1_kern_read_tid_flow_free(qp); 2608 - spin_unlock(&qp->s_lock); 2609 - rvt_rc_error(qp, IB_WC_LOC_QP_OP_ERR); 2610 - goto done; 2611 - } 2612 - goto done_unlock; 2613 - } 2614 - 2615 - /* 2616 - * Error out the qp for TID RDMA WRITE 2617 - */ 2618 - hfi1_kern_clear_hw_flow(qpriv->rcd, qp); 2619 - for (i = 0; i < rvt_max_atomic(rdi); i++) { 2620 - e = &qp->s_ack_queue[i]; 2621 - if (e->opcode == TID_OP(WRITE_REQ)) { 2622 - req = ack_to_tid_req(e); 2623 - hfi1_kern_exp_rcv_clear_all(req); 2624 - } 2625 - } 2626 - spin_unlock(&qp->s_lock); 2627 - rvt_rc_error(qp, IB_WC_LOC_LEN_ERR); 2628 - goto done; 2629 - 2630 - done_unlock: 2607 + /* Since no payload is delivered, just drop the packet */ 2631 2608 spin_unlock(&qp->s_lock); 2632 2609 done: 2633 2610 return true; ··· 2646 2687 u32 fpsn; 2647 2688 2648 2689 lockdep_assert_held(&qp->r_lock); 2690 + spin_lock(&qp->s_lock); 2649 2691 /* If the psn is out of valid range, drop the packet */ 2650 2692 if (cmp_psn(ibpsn, qp->s_last_psn) < 0 || 2651 2693 cmp_psn(ibpsn, qp->s_psn) > 0) 2652 - return ret; 2694 + goto s_unlock; 2653 2695 2654 - spin_lock(&qp->s_lock); 2655 2696 /* 2656 2697 * Note that NAKs implicitly ACK outstanding SEND and RDMA write 2657 2698 * requests and implicitly NAK RDMA read and atomic requests issued ··· 2699 2740 2700 2741 wqe = do_rc_completion(qp, wqe, ibp); 2701 2742 if (qp->s_acked == qp->s_tail) 2702 - break; 2743 + goto s_unlock; 2703 2744 } 2745 + 2746 + if (qp->s_acked == qp->s_tail) 2747 + goto s_unlock; 2704 2748 2705 2749 /* Handle the eflags for the request */ 2706 2750 if (wqe->wr.opcode != IB_WR_TID_RDMA_READ) ··· 2884 2922 if (lnh == HFI1_LRH_GRH) 2885 2923 goto r_unlock; 2886 2924 2887 - if (tid_rdma_tid_err(rcd, packet, rcv_type, opcode)) 2925 + if (tid_rdma_tid_err(packet, rcv_type)) 2888 2926 goto r_unlock; 2889 2927 } 2890 2928 ··· 2904 2942 */ 2905 2943 spin_lock(&qp->s_lock); 2906 2944 qpriv = qp->priv; 2945 + if (qpriv->r_tid_tail == HFI1_QP_WQE_INVALID || 2946 + qpriv->r_tid_tail == qpriv->r_tid_head) 2947 + goto unlock; 2907 2948 e = &qp->s_ack_queue[qpriv->r_tid_tail]; 2949 + if (e->opcode != TID_OP(WRITE_REQ)) 2950 + goto unlock; 2908 2951 req = ack_to_tid_req(e); 2952 + if (req->comp_seg == req->cur_seg) 2953 + goto unlock; 2909 2954 flow = &req->flows[req->clear_tail]; 2910 2955 trace_hfi1_eflags_err_write(qp, rcv_type, rte, psn); 2911 2956 trace_hfi1_rsp_handle_kdeth_eflags(qp, psn); ··· 4478 4509 struct rvt_swqe *wqe; 4479 4510 struct tid_rdma_request *req; 4480 4511 struct tid_rdma_flow *flow; 4481 - u32 aeth, psn, req_psn, ack_psn, resync_psn, ack_kpsn; 4512 + u32 aeth, psn, req_psn, ack_psn, flpsn, resync_psn, ack_kpsn; 4482 4513 unsigned long flags; 4483 4514 u16 fidx; 4484 4515 ··· 4507 4538 ack_kpsn--; 4508 4539 } 4509 4540 4541 + if (unlikely(qp->s_acked == qp->s_tail)) 4542 + goto ack_op_err; 4543 + 4510 4544 wqe = rvt_get_swqe_ptr(qp, qp->s_acked); 4511 4545 4512 4546 if (wqe->wr.opcode != IB_WR_TID_RDMA_WRITE) ··· 4522 4550 trace_hfi1_tid_flow_rcv_tid_ack(qp, req->acked_tail, flow); 4523 4551 4524 4552 /* Drop stale ACK/NAK */ 4525 - if (cmp_psn(psn, full_flow_psn(flow, flow->flow_state.spsn)) < 0) 4553 + if (cmp_psn(psn, full_flow_psn(flow, flow->flow_state.spsn)) < 0 || 4554 + cmp_psn(req_psn, flow->flow_state.resp_ib_psn) < 0) 4526 4555 goto ack_op_err; 4527 4556 4528 4557 while (cmp_psn(ack_kpsn, ··· 4685 4712 switch ((aeth >> IB_AETH_CREDIT_SHIFT) & 4686 4713 IB_AETH_CREDIT_MASK) { 4687 4714 case 0: /* PSN sequence error */ 4715 + if (!req->flows) 4716 + break; 4688 4717 flow = &req->flows[req->acked_tail]; 4718 + flpsn = full_flow_psn(flow, flow->flow_state.lpsn); 4719 + if (cmp_psn(psn, flpsn) > 0) 4720 + break; 4689 4721 trace_hfi1_tid_flow_rcv_tid_ack(qp, req->acked_tail, 4690 4722 flow); 4691 4723 req->r_ack_psn = mask_psn(be32_to_cpu(ohdr->bth[2]));
+2 -2
drivers/infiniband/hw/mlx4/mad.c
··· 1677 1677 tx_buf_size, DMA_TO_DEVICE); 1678 1678 kfree(tun_qp->tx_ring[i].buf.addr); 1679 1679 } 1680 - kfree(tun_qp->tx_ring); 1681 - tun_qp->tx_ring = NULL; 1682 1680 i = MLX4_NUM_TUNNEL_BUFS; 1683 1681 err: 1684 1682 while (i > 0) { ··· 1685 1687 rx_buf_size, DMA_FROM_DEVICE); 1686 1688 kfree(tun_qp->ring[i].addr); 1687 1689 } 1690 + kfree(tun_qp->tx_ring); 1691 + tun_qp->tx_ring = NULL; 1688 1692 kfree(tun_qp->ring); 1689 1693 tun_qp->ring = NULL; 1690 1694 return -ENOMEM;
+3 -3
drivers/infiniband/hw/mlx5/main.c
··· 1023 1023 props->timestamp_mask = 0x7FFFFFFFFFFFFFFFULL; 1024 1024 1025 1025 if (IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING)) { 1026 - if (MLX5_CAP_GEN(mdev, pg)) 1026 + if (dev->odp_caps.general_caps & IB_ODP_SUPPORT) 1027 1027 props->device_cap_flags |= IB_DEVICE_ON_DEMAND_PAGING; 1028 1028 props->odp_caps = dev->odp_caps; 1029 1029 } ··· 6139 6139 dev->port[i].roce.last_port_state = IB_PORT_DOWN; 6140 6140 } 6141 6141 6142 + mlx5_ib_internal_fill_odp_caps(dev); 6143 + 6142 6144 err = mlx5_ib_init_multiport_master(dev); 6143 6145 if (err) 6144 6146 return err; ··· 6565 6563 6566 6564 static int mlx5_ib_stage_odp_init(struct mlx5_ib_dev *dev) 6567 6565 { 6568 - mlx5_ib_internal_fill_odp_caps(dev); 6569 - 6570 6566 return mlx5_ib_odp_init_one(dev); 6571 6567 } 6572 6568
+3 -2
drivers/infiniband/hw/mlx5/mem.c
··· 57 57 int entry; 58 58 59 59 if (umem->is_odp) { 60 - unsigned int page_shift = to_ib_umem_odp(umem)->page_shift; 60 + struct ib_umem_odp *odp = to_ib_umem_odp(umem); 61 + unsigned int page_shift = odp->page_shift; 61 62 62 - *ncont = ib_umem_page_count(umem); 63 + *ncont = ib_umem_odp_num_pages(odp); 63 64 *count = *ncont << (page_shift - PAGE_SHIFT); 64 65 *shift = page_shift; 65 66 if (order)
+14
drivers/infiniband/hw/mlx5/mlx5_ib.h
··· 1475 1475 bool dyn_bfreg); 1476 1476 1477 1477 int mlx5_ib_qp_set_counter(struct ib_qp *qp, struct rdma_counter *counter); 1478 + 1479 + static inline bool mlx5_ib_can_use_umr(struct mlx5_ib_dev *dev, 1480 + bool do_modify_atomic) 1481 + { 1482 + if (MLX5_CAP_GEN(dev->mdev, umr_modify_entity_size_disabled)) 1483 + return false; 1484 + 1485 + if (do_modify_atomic && 1486 + MLX5_CAP_GEN(dev->mdev, atomic) && 1487 + MLX5_CAP_GEN(dev->mdev, umr_modify_atomic_disabled)) 1488 + return false; 1489 + 1490 + return true; 1491 + } 1478 1492 #endif /* MLX5_IB_H */
+3 -4
drivers/infiniband/hw/mlx5/mr.c
··· 1293 1293 if (err < 0) 1294 1294 return ERR_PTR(err); 1295 1295 1296 - use_umr = !MLX5_CAP_GEN(dev->mdev, umr_modify_entity_size_disabled) && 1297 - (!MLX5_CAP_GEN(dev->mdev, umr_modify_atomic_disabled) || 1298 - !MLX5_CAP_GEN(dev->mdev, atomic)); 1296 + use_umr = mlx5_ib_can_use_umr(dev, true); 1299 1297 1300 1298 if (order <= mr_cache_max_order(dev) && use_umr) { 1301 1299 mr = alloc_mr_from_cache(pd, umem, virt_addr, length, ncont, ··· 1446 1448 goto err; 1447 1449 } 1448 1450 1449 - if (flags & IB_MR_REREG_TRANS && !use_umr_mtt_update(mr, addr, len)) { 1451 + if (!mlx5_ib_can_use_umr(dev, true) || 1452 + (flags & IB_MR_REREG_TRANS && !use_umr_mtt_update(mr, addr, len))) { 1450 1453 /* 1451 1454 * UMR can't be used - MKey needs to be replaced. 1452 1455 */
+9 -8
drivers/infiniband/hw/mlx5/odp.c
··· 301 301 302 302 memset(caps, 0, sizeof(*caps)); 303 303 304 - if (!MLX5_CAP_GEN(dev->mdev, pg)) 304 + if (!MLX5_CAP_GEN(dev->mdev, pg) || 305 + !mlx5_ib_can_use_umr(dev, true)) 305 306 return; 306 307 307 308 caps->general_caps = IB_ODP_SUPPORT; ··· 356 355 357 356 if (MLX5_CAP_GEN(dev->mdev, fixed_buffer_size) && 358 357 MLX5_CAP_GEN(dev->mdev, null_mkey) && 359 - MLX5_CAP_GEN(dev->mdev, umr_extended_translation_offset)) 358 + MLX5_CAP_GEN(dev->mdev, umr_extended_translation_offset) && 359 + !MLX5_CAP_GEN(dev->mdev, umr_indirect_mkey_disabled)) 360 360 caps->general_caps |= IB_ODP_SUPPORT_IMPLICIT; 361 361 362 362 return; ··· 1624 1622 { 1625 1623 int ret = 0; 1626 1624 1627 - if (dev->odp_caps.general_caps & IB_ODP_SUPPORT) 1628 - ib_set_device_ops(&dev->ib_dev, &mlx5_ib_dev_odp_ops); 1625 + if (!(dev->odp_caps.general_caps & IB_ODP_SUPPORT)) 1626 + return ret; 1627 + 1628 + ib_set_device_ops(&dev->ib_dev, &mlx5_ib_dev_odp_ops); 1629 1629 1630 1630 if (dev->odp_caps.general_caps & IB_ODP_SUPPORT_IMPLICIT) { 1631 1631 ret = mlx5_cmd_null_mkey(dev->mdev, &dev->null_mkey); ··· 1637 1633 } 1638 1634 } 1639 1635 1640 - if (!MLX5_CAP_GEN(dev->mdev, pg)) 1641 - return ret; 1642 - 1643 1636 ret = mlx5_ib_create_pf_eq(dev, &dev->odp_pf_eq); 1644 1637 1645 1638 return ret; ··· 1644 1643 1645 1644 void mlx5_ib_odp_cleanup_one(struct mlx5_ib_dev *dev) 1646 1645 { 1647 - if (!MLX5_CAP_GEN(dev->mdev, pg)) 1646 + if (!(dev->odp_caps.general_caps & IB_ODP_SUPPORT)) 1648 1647 return; 1649 1648 1650 1649 mlx5_ib_destroy_pf_eq(dev, &dev->odp_pf_eq);
+19 -5
drivers/infiniband/hw/mlx5/qp.c
··· 4162 4162 MLX5_IB_UMR_OCTOWORD; 4163 4163 } 4164 4164 4165 - static __be64 frwr_mkey_mask(void) 4165 + static __be64 frwr_mkey_mask(bool atomic) 4166 4166 { 4167 4167 u64 result; 4168 4168 ··· 4175 4175 MLX5_MKEY_MASK_LW | 4176 4176 MLX5_MKEY_MASK_RR | 4177 4177 MLX5_MKEY_MASK_RW | 4178 - MLX5_MKEY_MASK_A | 4179 4178 MLX5_MKEY_MASK_SMALL_FENCE | 4180 4179 MLX5_MKEY_MASK_FREE; 4180 + 4181 + if (atomic) 4182 + result |= MLX5_MKEY_MASK_A; 4181 4183 4182 4184 return cpu_to_be64(result); 4183 4185 } ··· 4206 4204 } 4207 4205 4208 4206 static void set_reg_umr_seg(struct mlx5_wqe_umr_ctrl_seg *umr, 4209 - struct mlx5_ib_mr *mr, u8 flags) 4207 + struct mlx5_ib_mr *mr, u8 flags, bool atomic) 4210 4208 { 4211 4209 int size = (mr->ndescs + mr->meta_ndescs) * mr->desc_size; 4212 4210 ··· 4214 4212 4215 4213 umr->flags = flags; 4216 4214 umr->xlt_octowords = cpu_to_be16(get_xlt_octo(size)); 4217 - umr->mkey_mask = frwr_mkey_mask(); 4215 + umr->mkey_mask = frwr_mkey_mask(atomic); 4218 4216 } 4219 4217 4220 4218 static void set_linv_umr_seg(struct mlx5_wqe_umr_ctrl_seg *umr) ··· 4813 4811 { 4814 4812 struct mlx5_ib_mr *mr = to_mmr(wr->mr); 4815 4813 struct mlx5_ib_pd *pd = to_mpd(qp->ibqp.pd); 4814 + struct mlx5_ib_dev *dev = to_mdev(pd->ibpd.device); 4816 4815 int mr_list_size = (mr->ndescs + mr->meta_ndescs) * mr->desc_size; 4817 4816 bool umr_inline = mr_list_size <= MLX5_IB_SQ_UMR_INLINE_THRESHOLD; 4817 + bool atomic = wr->access & IB_ACCESS_REMOTE_ATOMIC; 4818 4818 u8 flags = 0; 4819 + 4820 + if (!mlx5_ib_can_use_umr(dev, atomic)) { 4821 + mlx5_ib_warn(to_mdev(qp->ibqp.device), 4822 + "Fast update of %s for MR is disabled\n", 4823 + (MLX5_CAP_GEN(dev->mdev, 4824 + umr_modify_entity_size_disabled)) ? 4825 + "entity size" : 4826 + "atomic access"); 4827 + return -EINVAL; 4828 + } 4819 4829 4820 4830 if (unlikely(wr->wr.send_flags & IB_SEND_INLINE)) { 4821 4831 mlx5_ib_warn(to_mdev(qp->ibqp.device), ··· 4840 4826 if (umr_inline) 4841 4827 flags |= MLX5_UMR_INLINE; 4842 4828 4843 - set_reg_umr_seg(*seg, mr, flags); 4829 + set_reg_umr_seg(*seg, mr, flags, atomic); 4844 4830 *seg += sizeof(struct mlx5_wqe_umr_ctrl_seg); 4845 4831 *size += sizeof(struct mlx5_wqe_umr_ctrl_seg) / 16; 4846 4832 handle_post_send_edge(&qp->sq, seg, *size, cur_edge);
+4 -4
drivers/infiniband/sw/siw/siw.h
··· 138 138 }; 139 139 140 140 struct siw_pble { 141 - u64 addr; /* Address of assigned user buffer */ 142 - u64 size; /* Size of this entry */ 143 - u64 pbl_off; /* Total offset from start of PBL */ 141 + dma_addr_t addr; /* Address of assigned buffer */ 142 + unsigned int size; /* Size of this entry */ 143 + unsigned long pbl_off; /* Total offset from start of PBL */ 144 144 }; 145 145 146 146 struct siw_pbl { ··· 734 734 "MEM[0x%08x] %s: " fmt, mem->stag, __func__, ##__VA_ARGS__) 735 735 736 736 #define siw_dbg_cep(cep, fmt, ...) \ 737 - ibdev_dbg(&cep->sdev->base_dev, "CEP[0x%p] %s: " fmt, \ 737 + ibdev_dbg(&cep->sdev->base_dev, "CEP[0x%pK] %s: " fmt, \ 738 738 cep, __func__, ##__VA_ARGS__) 739 739 740 740 void siw_cq_flush(struct siw_cq *cq);
+39 -43
drivers/infiniband/sw/siw/siw_cm.c
··· 355 355 getname_local(cep->sock, &event.local_addr); 356 356 getname_peer(cep->sock, &event.remote_addr); 357 357 } 358 - siw_dbg_cep(cep, "[QP %u]: id 0x%p, reason=%d, status=%d\n", 359 - cep->qp ? qp_id(cep->qp) : -1, id, reason, status); 358 + siw_dbg_cep(cep, "[QP %u]: reason=%d, status=%d\n", 359 + cep->qp ? qp_id(cep->qp) : UINT_MAX, reason, status); 360 360 361 361 return id->event_handler(id, &event); 362 362 } ··· 947 947 siw_cep_get(new_cep); 948 948 new_s->sk->sk_user_data = new_cep; 949 949 950 - siw_dbg_cep(cep, "listen socket 0x%p, new 0x%p\n", s, new_s); 951 - 952 950 if (siw_tcp_nagle == false) { 953 951 int val = 1; 954 952 ··· 1009 1011 cep = work->cep; 1010 1012 1011 1013 siw_dbg_cep(cep, "[QP %u]: work type: %d, state %d\n", 1012 - cep->qp ? qp_id(cep->qp) : -1, work->type, cep->state); 1014 + cep->qp ? qp_id(cep->qp) : UINT_MAX, 1015 + work->type, cep->state); 1013 1016 1014 1017 siw_cep_set_inuse(cep); 1015 1018 ··· 1144 1145 } 1145 1146 if (release_cep) { 1146 1147 siw_dbg_cep(cep, 1147 - "release: timer=%s, QP[%u], id 0x%p\n", 1148 + "release: timer=%s, QP[%u]\n", 1148 1149 cep->mpa_timer ? "y" : "n", 1149 - cep->qp ? qp_id(cep->qp) : -1, cep->cm_id); 1150 + cep->qp ? qp_id(cep->qp) : UINT_MAX); 1150 1151 1151 1152 siw_cancel_mpatimer(cep); 1152 1153 ··· 1210 1211 else 1211 1212 delay = MPAREP_TIMEOUT; 1212 1213 } 1213 - siw_dbg_cep(cep, "[QP %u]: work type: %d, work 0x%p, timeout %lu\n", 1214 - cep->qp ? qp_id(cep->qp) : -1, type, work, delay); 1214 + siw_dbg_cep(cep, "[QP %u]: work type: %d, timeout %lu\n", 1215 + cep->qp ? qp_id(cep->qp) : -1, type, delay); 1215 1216 1216 1217 queue_delayed_work(siw_cm_wq, &work->work, delay); 1217 1218 ··· 1375 1376 } 1376 1377 if (v4) 1377 1378 siw_dbg_qp(qp, 1378 - "id 0x%p, pd_len %d, laddr %pI4 %d, raddr %pI4 %d\n", 1379 - id, pd_len, 1379 + "pd_len %d, laddr %pI4 %d, raddr %pI4 %d\n", 1380 + pd_len, 1380 1381 &((struct sockaddr_in *)(laddr))->sin_addr, 1381 1382 ntohs(((struct sockaddr_in *)(laddr))->sin_port), 1382 1383 &((struct sockaddr_in *)(raddr))->sin_addr, 1383 1384 ntohs(((struct sockaddr_in *)(raddr))->sin_port)); 1384 1385 else 1385 1386 siw_dbg_qp(qp, 1386 - "id 0x%p, pd_len %d, laddr %pI6 %d, raddr %pI6 %d\n", 1387 - id, pd_len, 1387 + "pd_len %d, laddr %pI6 %d, raddr %pI6 %d\n", 1388 + pd_len, 1388 1389 &((struct sockaddr_in6 *)(laddr))->sin6_addr, 1389 1390 ntohs(((struct sockaddr_in6 *)(laddr))->sin6_port), 1390 1391 &((struct sockaddr_in6 *)(raddr))->sin6_addr, ··· 1507 1508 if (rv >= 0) { 1508 1509 rv = siw_cm_queue_work(cep, SIW_CM_WORK_MPATIMEOUT); 1509 1510 if (!rv) { 1510 - siw_dbg_cep(cep, "id 0x%p, [QP %u]: exit\n", id, 1511 - qp_id(qp)); 1511 + siw_dbg_cep(cep, "[QP %u]: exit\n", qp_id(qp)); 1512 1512 siw_cep_set_free(cep); 1513 1513 return 0; 1514 1514 } 1515 1515 } 1516 1516 error: 1517 - siw_dbg_qp(qp, "failed: %d\n", rv); 1517 + siw_dbg(id->device, "failed: %d\n", rv); 1518 1518 1519 1519 if (cep) { 1520 1520 siw_socket_disassoc(s); ··· 1538 1540 } else if (s) { 1539 1541 sock_release(s); 1540 1542 } 1541 - siw_qp_put(qp); 1543 + if (qp) 1544 + siw_qp_put(qp); 1542 1545 1543 1546 return rv; 1544 1547 } ··· 1579 1580 siw_cancel_mpatimer(cep); 1580 1581 1581 1582 if (cep->state != SIW_EPSTATE_RECVD_MPAREQ) { 1582 - siw_dbg_cep(cep, "id 0x%p: out of state\n", id); 1583 + siw_dbg_cep(cep, "out of state\n"); 1583 1584 1584 1585 siw_cep_set_free(cep); 1585 1586 siw_cep_put(cep); ··· 1600 1601 up_write(&qp->state_lock); 1601 1602 goto error; 1602 1603 } 1603 - siw_dbg_cep(cep, "id 0x%p\n", id); 1604 + siw_dbg_cep(cep, "[QP %d]\n", params->qpn); 1604 1605 1605 1606 if (try_gso && cep->mpa.hdr.params.bits & MPA_RR_FLAG_GSO_EXP) { 1606 1607 siw_dbg_cep(cep, "peer allows GSO on TX\n"); ··· 1610 1611 params->ird > sdev->attrs.max_ird) { 1611 1612 siw_dbg_cep( 1612 1613 cep, 1613 - "id 0x%p, [QP %u]: ord %d (max %d), ird %d (max %d)\n", 1614 - id, qp_id(qp), params->ord, sdev->attrs.max_ord, 1614 + "[QP %u]: ord %d (max %d), ird %d (max %d)\n", 1615 + qp_id(qp), params->ord, sdev->attrs.max_ord, 1615 1616 params->ird, sdev->attrs.max_ird); 1616 1617 rv = -EINVAL; 1617 1618 up_write(&qp->state_lock); ··· 1623 1624 if (params->private_data_len > max_priv_data) { 1624 1625 siw_dbg_cep( 1625 1626 cep, 1626 - "id 0x%p, [QP %u]: private data length: %d (max %d)\n", 1627 - id, qp_id(qp), params->private_data_len, max_priv_data); 1627 + "[QP %u]: private data length: %d (max %d)\n", 1628 + qp_id(qp), params->private_data_len, max_priv_data); 1628 1629 rv = -EINVAL; 1629 1630 up_write(&qp->state_lock); 1630 1631 goto error; ··· 1678 1679 qp_attrs.flags = SIW_MPA_CRC; 1679 1680 qp_attrs.state = SIW_QP_STATE_RTS; 1680 1681 1681 - siw_dbg_cep(cep, "id 0x%p, [QP%u]: moving to rts\n", id, qp_id(qp)); 1682 + siw_dbg_cep(cep, "[QP%u]: moving to rts\n", qp_id(qp)); 1682 1683 1683 1684 /* Associate QP with CEP */ 1684 1685 siw_cep_get(cep); ··· 1699 1700 if (rv) 1700 1701 goto error; 1701 1702 1702 - siw_dbg_cep(cep, "id 0x%p, [QP %u]: send mpa reply, %d byte pdata\n", 1703 - id, qp_id(qp), params->private_data_len); 1703 + siw_dbg_cep(cep, "[QP %u]: send mpa reply, %d byte pdata\n", 1704 + qp_id(qp), params->private_data_len); 1704 1705 1705 1706 rv = siw_send_mpareqrep(cep, params->private_data, 1706 1707 params->private_data_len); ··· 1758 1759 siw_cancel_mpatimer(cep); 1759 1760 1760 1761 if (cep->state != SIW_EPSTATE_RECVD_MPAREQ) { 1761 - siw_dbg_cep(cep, "id 0x%p: out of state\n", id); 1762 + siw_dbg_cep(cep, "out of state\n"); 1762 1763 1763 1764 siw_cep_set_free(cep); 1764 1765 siw_cep_put(cep); /* put last reference */ 1765 1766 1766 1767 return -ECONNRESET; 1767 1768 } 1768 - siw_dbg_cep(cep, "id 0x%p, cep->state %d, pd_len %d\n", id, cep->state, 1769 + siw_dbg_cep(cep, "cep->state %d, pd_len %d\n", cep->state, 1769 1770 pd_len); 1770 1771 1771 1772 if (__mpa_rr_revision(cep->mpa.hdr.params.bits) >= MPA_REVISION_1) { ··· 1803 1804 rv = kernel_setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *)&s_val, 1804 1805 sizeof(s_val)); 1805 1806 if (rv) { 1806 - siw_dbg(id->device, "id 0x%p: setsockopt error: %d\n", id, rv); 1807 + siw_dbg(id->device, "setsockopt error: %d\n", rv); 1807 1808 goto error; 1808 1809 } 1809 1810 rv = s->ops->bind(s, laddr, addr_family == AF_INET ? 1810 1811 sizeof(struct sockaddr_in) : 1811 1812 sizeof(struct sockaddr_in6)); 1812 1813 if (rv) { 1813 - siw_dbg(id->device, "id 0x%p: socket bind error: %d\n", id, rv); 1814 + siw_dbg(id->device, "socket bind error: %d\n", rv); 1814 1815 goto error; 1815 1816 } 1816 1817 cep = siw_cep_alloc(sdev); ··· 1823 1824 rv = siw_cm_alloc_work(cep, backlog); 1824 1825 if (rv) { 1825 1826 siw_dbg(id->device, 1826 - "id 0x%p: alloc_work error %d, backlog %d\n", id, 1827 + "alloc_work error %d, backlog %d\n", 1827 1828 rv, backlog); 1828 1829 goto error; 1829 1830 } 1830 1831 rv = s->ops->listen(s, backlog); 1831 1832 if (rv) { 1832 - siw_dbg(id->device, "id 0x%p: listen error %d\n", id, rv); 1833 + siw_dbg(id->device, "listen error %d\n", rv); 1833 1834 goto error; 1834 1835 } 1835 1836 cep->cm_id = id; ··· 1913 1914 1914 1915 list_del(p); 1915 1916 1916 - siw_dbg_cep(cep, "id 0x%p: drop cep, state %d\n", id, 1917 - cep->state); 1917 + siw_dbg_cep(cep, "drop cep, state %d\n", cep->state); 1918 1918 1919 1919 siw_cep_set_inuse(cep); 1920 1920 ··· 1950 1952 struct net_device *dev = to_siw_dev(id->device)->netdev; 1951 1953 int rv = 0, listeners = 0; 1952 1954 1953 - siw_dbg(id->device, "id 0x%p: backlog %d\n", id, backlog); 1955 + siw_dbg(id->device, "backlog %d\n", backlog); 1954 1956 1955 1957 /* 1956 1958 * For each attached address of the interface, create a ··· 1966 1968 s_raddr = (struct sockaddr_in *)&id->remote_addr; 1967 1969 1968 1970 siw_dbg(id->device, 1969 - "id 0x%p: laddr %pI4:%d, raddr %pI4:%d\n", 1970 - id, &s_laddr.sin_addr, ntohs(s_laddr.sin_port), 1971 + "laddr %pI4:%d, raddr %pI4:%d\n", 1972 + &s_laddr.sin_addr, ntohs(s_laddr.sin_port), 1971 1973 &s_raddr->sin_addr, ntohs(s_raddr->sin_port)); 1972 1974 1973 1975 rtnl_lock(); ··· 1992 1994 *s_raddr = &to_sockaddr_in6(id->remote_addr); 1993 1995 1994 1996 siw_dbg(id->device, 1995 - "id 0x%p: laddr %pI6:%d, raddr %pI6:%d\n", 1996 - id, &s_laddr->sin6_addr, ntohs(s_laddr->sin6_port), 1997 + "laddr %pI6:%d, raddr %pI6:%d\n", 1998 + &s_laddr->sin6_addr, ntohs(s_laddr->sin6_port), 1997 1999 &s_raddr->sin6_addr, ntohs(s_raddr->sin6_port)); 1998 2000 1999 2001 read_lock_bh(&in6_dev->lock); ··· 2026 2028 else if (!rv) 2027 2029 rv = -EINVAL; 2028 2030 2029 - siw_dbg(id->device, "id 0x%p: %s\n", id, rv ? "FAIL" : "OK"); 2031 + siw_dbg(id->device, "%s\n", rv ? "FAIL" : "OK"); 2030 2032 2031 2033 return rv; 2032 2034 } 2033 2035 2034 2036 int siw_destroy_listen(struct iw_cm_id *id) 2035 2037 { 2036 - siw_dbg(id->device, "id 0x%p\n", id); 2037 - 2038 2038 if (!id->provider_data) { 2039 - siw_dbg(id->device, "id 0x%p: no cep(s)\n", id); 2039 + siw_dbg(id->device, "no cep(s)\n"); 2040 2040 return 0; 2041 2041 } 2042 2042 siw_drop_listeners(id);
+3 -2
drivers/infiniband/sw/siw/siw_cq.c
··· 71 71 wc->wc_flags = IB_WC_WITH_INVALIDATE; 72 72 } 73 73 wc->qp = cqe->base_qp; 74 - siw_dbg_cq(cq, "idx %u, type %d, flags %2x, id 0x%p\n", 74 + siw_dbg_cq(cq, 75 + "idx %u, type %d, flags %2x, id 0x%pK\n", 75 76 cq->cq_get % cq->num_cqe, cqe->opcode, 76 - cqe->flags, (void *)cqe->id); 77 + cqe->flags, (void *)(uintptr_t)cqe->id); 77 78 } 78 79 WRITE_ONCE(cqe->flags, 0); 79 80 cq->cq_get++;
+7 -7
drivers/infiniband/sw/siw/siw_mem.c
··· 197 197 */ 198 198 if (addr < mem->va || addr + len > mem->va + mem->len) { 199 199 siw_dbg_pd(pd, "MEM interval len %d\n", len); 200 - siw_dbg_pd(pd, "[0x%016llx, 0x%016llx] out of bounds\n", 201 - (unsigned long long)addr, 202 - (unsigned long long)(addr + len)); 203 - siw_dbg_pd(pd, "[0x%016llx, 0x%016llx] STag=0x%08x\n", 204 - (unsigned long long)mem->va, 205 - (unsigned long long)(mem->va + mem->len), 200 + siw_dbg_pd(pd, "[0x%pK, 0x%pK] out of bounds\n", 201 + (void *)(uintptr_t)addr, 202 + (void *)(uintptr_t)(addr + len)); 203 + siw_dbg_pd(pd, "[0x%pK, 0x%pK] STag=0x%08x\n", 204 + (void *)(uintptr_t)mem->va, 205 + (void *)(uintptr_t)(mem->va + mem->len), 206 206 mem->stag); 207 207 208 208 return -E_BASE_BOUNDS; ··· 330 330 * Optionally, provides remaining len within current element, and 331 331 * current PBL index for later resume at same element. 332 332 */ 333 - u64 siw_pbl_get_buffer(struct siw_pbl *pbl, u64 off, int *len, int *idx) 333 + dma_addr_t siw_pbl_get_buffer(struct siw_pbl *pbl, u64 off, int *len, int *idx) 334 334 { 335 335 int i = idx ? *idx : 0; 336 336
+1 -1
drivers/infiniband/sw/siw/siw_mem.h
··· 9 9 struct siw_umem *siw_umem_get(u64 start, u64 len, bool writable); 10 10 void siw_umem_release(struct siw_umem *umem, bool dirty); 11 11 struct siw_pbl *siw_pbl_alloc(u32 num_buf); 12 - u64 siw_pbl_get_buffer(struct siw_pbl *pbl, u64 off, int *len, int *idx); 12 + dma_addr_t siw_pbl_get_buffer(struct siw_pbl *pbl, u64 off, int *len, int *idx); 13 13 struct siw_mem *siw_mem_id2obj(struct siw_device *sdev, int stag_index); 14 14 int siw_mem_add(struct siw_device *sdev, struct siw_mem *m); 15 15 int siw_invalidate_stag(struct ib_pd *pd, u32 stag);
+1 -1
drivers/infiniband/sw/siw/siw_qp.c
··· 949 949 rv = -EINVAL; 950 950 goto out; 951 951 } 952 - wqe->sqe.sge[0].laddr = (u64)&wqe->sqe.sge[1]; 952 + wqe->sqe.sge[0].laddr = (uintptr_t)&wqe->sqe.sge[1]; 953 953 wqe->sqe.sge[0].lkey = 0; 954 954 wqe->sqe.num_sge = 1; 955 955 }
+14 -12
drivers/infiniband/sw/siw/siw_qp_rx.c
··· 38 38 39 39 p = siw_get_upage(umem, dest_addr); 40 40 if (unlikely(!p)) { 41 - pr_warn("siw: %s: [QP %u]: bogus addr: %p, %p\n", 41 + pr_warn("siw: %s: [QP %u]: bogus addr: %pK, %pK\n", 42 42 __func__, qp_id(rx_qp(srx)), 43 - (void *)dest_addr, (void *)umem->fp_addr); 43 + (void *)(uintptr_t)dest_addr, 44 + (void *)(uintptr_t)umem->fp_addr); 44 45 /* siw internal error */ 45 46 srx->skb_copied += copied; 46 47 srx->skb_new -= copied; ··· 51 50 pg_off = dest_addr & ~PAGE_MASK; 52 51 bytes = min(len, (int)PAGE_SIZE - pg_off); 53 52 54 - siw_dbg_qp(rx_qp(srx), "page %p, bytes=%u\n", p, bytes); 53 + siw_dbg_qp(rx_qp(srx), "page %pK, bytes=%u\n", p, bytes); 55 54 56 55 dest = kmap_atomic(p); 57 56 rv = skb_copy_bits(srx->skb, srx->skb_offset, dest + pg_off, ··· 105 104 { 106 105 int rv; 107 106 108 - siw_dbg_qp(rx_qp(srx), "kva: 0x%p, len: %u\n", kva, len); 107 + siw_dbg_qp(rx_qp(srx), "kva: 0x%pK, len: %u\n", kva, len); 109 108 110 109 rv = skb_copy_bits(srx->skb, srx->skb_offset, kva, len); 111 110 if (unlikely(rv)) { 112 - pr_warn("siw: [QP %u]: %s, len %d, kva 0x%p, rv %d\n", 111 + pr_warn("siw: [QP %u]: %s, len %d, kva 0x%pK, rv %d\n", 113 112 qp_id(rx_qp(srx)), __func__, len, kva, rv); 114 113 115 114 return rv; ··· 133 132 134 133 while (len) { 135 134 int bytes; 136 - u64 buf_addr = 135 + dma_addr_t buf_addr = 137 136 siw_pbl_get_buffer(pbl, offset, &bytes, pbl_idx); 138 137 if (!buf_addr) 139 138 break; ··· 486 485 mem_p = *mem; 487 486 if (mem_p->mem_obj == NULL) 488 487 rv = siw_rx_kva(srx, 489 - (void *)(sge->laddr + frx->sge_off), 490 - sge_bytes); 488 + (void *)(uintptr_t)(sge->laddr + frx->sge_off), 489 + sge_bytes); 491 490 else if (!mem_p->is_pbl) 492 491 rv = siw_rx_umem(srx, mem_p->umem, 493 492 sge->laddr + frx->sge_off, sge_bytes); ··· 599 598 600 599 if (mem->mem_obj == NULL) 601 600 rv = siw_rx_kva(srx, 602 - (void *)(srx->ddp_to + srx->fpdu_part_rcvd), 603 - bytes); 601 + (void *)(uintptr_t)(srx->ddp_to + srx->fpdu_part_rcvd), 602 + bytes); 604 603 else if (!mem->is_pbl) 605 604 rv = siw_rx_umem(srx, mem->umem, 606 605 srx->ddp_to + srx->fpdu_part_rcvd, bytes); ··· 842 841 bytes = min(srx->fpdu_part_rem, srx->skb_new); 843 842 844 843 if (mem_p->mem_obj == NULL) 845 - rv = siw_rx_kva(srx, (void *)(sge->laddr + wqe->processed), 846 - bytes); 844 + rv = siw_rx_kva(srx, 845 + (void *)(uintptr_t)(sge->laddr + wqe->processed), 846 + bytes); 847 847 else if (!mem_p->is_pbl) 848 848 rv = siw_rx_umem(srx, mem_p->umem, sge->laddr + wqe->processed, 849 849 bytes);
+37 -43
drivers/infiniband/sw/siw/siw_qp_tx.c
··· 26 26 { 27 27 struct siw_pbl *pbl = mem->pbl; 28 28 u64 offset = addr - mem->va; 29 - u64 paddr = siw_pbl_get_buffer(pbl, offset, NULL, idx); 29 + dma_addr_t paddr = siw_pbl_get_buffer(pbl, offset, NULL, idx); 30 30 31 31 if (paddr) 32 32 return virt_to_page(paddr); ··· 37 37 /* 38 38 * Copy short payload at provided destination payload address 39 39 */ 40 - static int siw_try_1seg(struct siw_iwarp_tx *c_tx, u64 paddr) 40 + static int siw_try_1seg(struct siw_iwarp_tx *c_tx, void *paddr) 41 41 { 42 42 struct siw_wqe *wqe = &c_tx->wqe_active; 43 43 struct siw_sge *sge = &wqe->sqe.sge[0]; ··· 50 50 return 0; 51 51 52 52 if (tx_flags(wqe) & SIW_WQE_INLINE) { 53 - memcpy((void *)paddr, &wqe->sqe.sge[1], bytes); 53 + memcpy(paddr, &wqe->sqe.sge[1], bytes); 54 54 } else { 55 55 struct siw_mem *mem = wqe->mem[0]; 56 56 57 57 if (!mem->mem_obj) { 58 58 /* Kernel client using kva */ 59 - memcpy((void *)paddr, (void *)sge->laddr, bytes); 59 + memcpy(paddr, 60 + (const void *)(uintptr_t)sge->laddr, bytes); 60 61 } else if (c_tx->in_syscall) { 61 - if (copy_from_user((void *)paddr, 62 - (const void __user *)sge->laddr, 62 + if (copy_from_user(paddr, u64_to_user_ptr(sge->laddr), 63 63 bytes)) 64 64 return -EFAULT; 65 65 } else { ··· 79 79 buffer = kmap_atomic(p); 80 80 81 81 if (likely(PAGE_SIZE - off >= bytes)) { 82 - memcpy((void *)paddr, buffer + off, bytes); 82 + memcpy(paddr, buffer + off, bytes); 83 83 kunmap_atomic(buffer); 84 84 } else { 85 85 unsigned long part = bytes - (PAGE_SIZE - off); 86 86 87 - memcpy((void *)paddr, buffer + off, part); 87 + memcpy(paddr, buffer + off, part); 88 88 kunmap_atomic(buffer); 89 89 90 90 if (!mem->is_pbl) ··· 98 98 return -EFAULT; 99 99 100 100 buffer = kmap_atomic(p); 101 - memcpy((void *)(paddr + part), buffer, 101 + memcpy(paddr + part, buffer, 102 102 bytes - part); 103 103 kunmap_atomic(buffer); 104 104 } ··· 166 166 c_tx->ctrl_len = sizeof(struct iwarp_send); 167 167 168 168 crc = (char *)&c_tx->pkt.send_pkt.crc; 169 - data = siw_try_1seg(c_tx, (u64)crc); 169 + data = siw_try_1seg(c_tx, crc); 170 170 break; 171 171 172 172 case SIW_OP_SEND_REMOTE_INV: ··· 189 189 c_tx->ctrl_len = sizeof(struct iwarp_send_inv); 190 190 191 191 crc = (char *)&c_tx->pkt.send_pkt.crc; 192 - data = siw_try_1seg(c_tx, (u64)crc); 192 + data = siw_try_1seg(c_tx, crc); 193 193 break; 194 194 195 195 case SIW_OP_WRITE: ··· 201 201 c_tx->ctrl_len = sizeof(struct iwarp_rdma_write); 202 202 203 203 crc = (char *)&c_tx->pkt.write_pkt.crc; 204 - data = siw_try_1seg(c_tx, (u64)crc); 204 + data = siw_try_1seg(c_tx, crc); 205 205 break; 206 206 207 207 case SIW_OP_READ_RESPONSE: ··· 216 216 c_tx->ctrl_len = sizeof(struct iwarp_rdma_rresp); 217 217 218 218 crc = (char *)&c_tx->pkt.write_pkt.crc; 219 - data = siw_try_1seg(c_tx, (u64)crc); 219 + data = siw_try_1seg(c_tx, crc); 220 220 break; 221 221 222 222 default: ··· 398 398 399 399 #define MAX_TRAILER (MPA_CRC_SIZE + 4) 400 400 401 - static void siw_unmap_pages(struct page **pages, int hdr_len, int num_maps) 401 + static void siw_unmap_pages(struct page **pp, unsigned long kmap_mask) 402 402 { 403 - if (hdr_len) { 404 - ++pages; 405 - --num_maps; 406 - } 407 - while (num_maps-- > 0) { 408 - kunmap(*pages); 409 - pages++; 403 + while (kmap_mask) { 404 + if (kmap_mask & BIT(0)) 405 + kunmap(*pp); 406 + pp++; 407 + kmap_mask >>= 1; 410 408 } 411 409 } 412 410 ··· 435 437 unsigned int data_len = c_tx->bytes_unsent, hdr_len = 0, trl_len = 0, 436 438 sge_off = c_tx->sge_off, sge_idx = c_tx->sge_idx, 437 439 pbl_idx = c_tx->pbl_idx; 440 + unsigned long kmap_mask = 0L; 438 441 439 442 if (c_tx->state == SIW_SEND_HDR) { 440 443 if (c_tx->use_sendpage) { ··· 462 463 463 464 if (!(tx_flags(wqe) & SIW_WQE_INLINE)) { 464 465 mem = wqe->mem[sge_idx]; 465 - if (!mem->mem_obj) 466 - is_kva = 1; 466 + is_kva = mem->mem_obj == NULL ? 1 : 0; 467 467 } else { 468 468 is_kva = 1; 469 469 } ··· 471 473 * tx from kernel virtual address: either inline data 472 474 * or memory region with assigned kernel buffer 473 475 */ 474 - iov[seg].iov_base = (void *)(sge->laddr + sge_off); 476 + iov[seg].iov_base = 477 + (void *)(uintptr_t)(sge->laddr + sge_off); 475 478 iov[seg].iov_len = sge_len; 476 479 477 480 if (do_crc) ··· 499 500 p = siw_get_upage(mem->umem, 500 501 sge->laddr + sge_off); 501 502 if (unlikely(!p)) { 502 - if (hdr_len) 503 - seg--; 504 - if (!c_tx->use_sendpage && seg) { 505 - siw_unmap_pages(page_array, 506 - hdr_len, seg); 507 - } 503 + siw_unmap_pages(page_array, kmap_mask); 508 504 wqe->processed -= c_tx->bytes_unsent; 509 505 rv = -EFAULT; 510 506 goto done_crc; ··· 509 515 if (!c_tx->use_sendpage) { 510 516 iov[seg].iov_base = kmap(p) + fp_off; 511 517 iov[seg].iov_len = plen; 518 + 519 + /* Remember for later kunmap() */ 520 + kmap_mask |= BIT(seg); 521 + 512 522 if (do_crc) 513 523 crypto_shash_update( 514 524 c_tx->mpa_crc_hd, ··· 524 526 page_address(p) + fp_off, 525 527 plen); 526 528 } else { 527 - u64 pa = ((sge->laddr + sge_off) & PAGE_MASK); 529 + u64 va = sge->laddr + sge_off; 528 530 529 - page_array[seg] = virt_to_page(pa); 531 + page_array[seg] = virt_to_page(va & PAGE_MASK); 530 532 if (do_crc) 531 533 crypto_shash_update( 532 534 c_tx->mpa_crc_hd, 533 - (void *)(sge->laddr + sge_off), 535 + (void *)(uintptr_t)va, 534 536 plen); 535 537 } 536 538 ··· 541 543 542 544 if (++seg > (int)MAX_ARRAY) { 543 545 siw_dbg_qp(tx_qp(c_tx), "to many fragments\n"); 544 - if (!is_kva && !c_tx->use_sendpage) { 545 - siw_unmap_pages(page_array, hdr_len, 546 - seg - 1); 547 - } 546 + siw_unmap_pages(page_array, kmap_mask); 548 547 wqe->processed -= c_tx->bytes_unsent; 549 548 rv = -EMSGSIZE; 550 549 goto done_crc; ··· 592 597 } else { 593 598 rv = kernel_sendmsg(s, &msg, iov, seg + 1, 594 599 hdr_len + data_len + trl_len); 595 - if (!is_kva) 596 - siw_unmap_pages(page_array, hdr_len, seg); 600 + siw_unmap_pages(page_array, kmap_mask); 597 601 } 598 602 if (rv < (int)hdr_len) { 599 603 /* Not even complete hdr pushed or negative rv */ ··· 823 829 rv = -EINVAL; 824 830 goto tx_error; 825 831 } 826 - wqe->sqe.sge[0].laddr = (u64)&wqe->sqe.sge[1]; 832 + wqe->sqe.sge[0].laddr = 833 + (u64)(uintptr_t)&wqe->sqe.sge[1]; 827 834 } 828 835 } 829 836 wqe->wr_status = SIW_WR_INPROGRESS; ··· 919 924 920 925 static int siw_fastreg_mr(struct ib_pd *pd, struct siw_sqe *sqe) 921 926 { 922 - struct ib_mr *base_mr = (struct ib_mr *)sqe->base_mr; 927 + struct ib_mr *base_mr = (struct ib_mr *)(uintptr_t)sqe->base_mr; 923 928 struct siw_device *sdev = to_siw_dev(pd->device); 924 929 struct siw_mem *mem = siw_mem_id2obj(sdev, sqe->rkey >> 8); 925 930 int rv = 0; ··· 949 954 mem->stag = sqe->rkey; 950 955 mem->perms = sqe->access; 951 956 952 - siw_dbg_mem(mem, "STag now valid, MR va: 0x%016llx -> 0x%016llx\n", 953 - mem->va, base_mr->iova); 957 + siw_dbg_mem(mem, "STag 0x%08x now valid\n", sqe->rkey); 954 958 mem->va = base_mr->iova; 955 959 mem->stag_valid = 1; 956 960 out:
+20 -20
drivers/infiniband/sw/siw/siw_verbs.c
··· 424 424 */ 425 425 qp->srq = to_siw_srq(attrs->srq); 426 426 qp->attrs.rq_size = 0; 427 - siw_dbg(base_dev, "QP [%u]: [SRQ 0x%p] attached\n", 428 - qp->qp_num, qp->srq); 427 + siw_dbg(base_dev, "QP [%u]: SRQ attached\n", qp->qp_num); 429 428 } else if (num_rqe) { 430 429 if (qp->kernel_verbs) 431 430 qp->recvq = vzalloc(num_rqe * sizeof(struct siw_rqe)); ··· 609 610 base_ucontext); 610 611 struct siw_qp_attrs qp_attrs; 611 612 612 - siw_dbg_qp(qp, "state %d, cep 0x%p\n", qp->attrs.state, qp->cep); 613 + siw_dbg_qp(qp, "state %d\n", qp->attrs.state); 613 614 614 615 /* 615 616 * Mark QP as in process of destruction to prevent from ··· 661 662 void *kbuf = &sqe->sge[1]; 662 663 int num_sge = core_wr->num_sge, bytes = 0; 663 664 664 - sqe->sge[0].laddr = (u64)kbuf; 665 + sqe->sge[0].laddr = (uintptr_t)kbuf; 665 666 sqe->sge[0].lkey = 0; 666 667 667 668 while (num_sge--) { ··· 824 825 break; 825 826 826 827 case IB_WR_REG_MR: 827 - sqe->base_mr = (uint64_t)reg_wr(wr)->mr; 828 + sqe->base_mr = (uintptr_t)reg_wr(wr)->mr; 828 829 sqe->rkey = reg_wr(wr)->key; 829 830 sqe->access = reg_wr(wr)->access & IWARP_ACCESS_MASK; 830 831 sqe->opcode = SIW_OP_REG_MR; ··· 841 842 rv = -EINVAL; 842 843 break; 843 844 } 844 - siw_dbg_qp(qp, "opcode %d, flags 0x%x, wr_id 0x%p\n", 845 - sqe->opcode, sqe->flags, (void *)sqe->id); 845 + siw_dbg_qp(qp, "opcode %d, flags 0x%x, wr_id 0x%pK\n", 846 + sqe->opcode, sqe->flags, 847 + (void *)(uintptr_t)sqe->id); 846 848 847 849 if (unlikely(rv < 0)) 848 850 break; ··· 1205 1205 unsigned long mem_limit = rlimit(RLIMIT_MEMLOCK); 1206 1206 int rv; 1207 1207 1208 - siw_dbg_pd(pd, "start: 0x%016llx, va: 0x%016llx, len: %llu\n", 1209 - (unsigned long long)start, (unsigned long long)rnic_va, 1208 + siw_dbg_pd(pd, "start: 0x%pK, va: 0x%pK, len: %llu\n", 1209 + (void *)(uintptr_t)start, (void *)(uintptr_t)rnic_va, 1210 1210 (unsigned long long)len); 1211 1211 1212 1212 if (atomic_inc_return(&sdev->num_mr) > SIW_MAX_MR) { ··· 1363 1363 struct siw_mem *mem = mr->mem; 1364 1364 struct siw_pbl *pbl = mem->pbl; 1365 1365 struct siw_pble *pble; 1366 - u64 pbl_size; 1366 + unsigned long pbl_size; 1367 1367 int i, rv; 1368 1368 1369 1369 if (!pbl) { ··· 1402 1402 pbl_size += sg_dma_len(slp); 1403 1403 } 1404 1404 siw_dbg_mem(mem, 1405 - "sge[%d], size %llu, addr 0x%016llx, total %llu\n", 1406 - i, pble->size, pble->addr, pbl_size); 1405 + "sge[%d], size %u, addr 0x%p, total %lu\n", 1406 + i, pble->size, (void *)(uintptr_t)pble->addr, 1407 + pbl_size); 1407 1408 } 1408 1409 rv = ib_sg_to_pages(base_mr, sl, num_sle, sg_off, siw_set_pbl_page); 1409 1410 if (rv > 0) { 1410 1411 mem->len = base_mr->length; 1411 1412 mem->va = base_mr->iova; 1412 1413 siw_dbg_mem(mem, 1413 - "%llu bytes, start 0x%016llx, %u SLE to %u entries\n", 1414 - mem->len, mem->va, num_sle, pbl->num_buf); 1414 + "%llu bytes, start 0x%pK, %u SLE to %u entries\n", 1415 + mem->len, (void *)(uintptr_t)mem->va, num_sle, 1416 + pbl->num_buf); 1415 1417 } 1416 1418 return rv; 1417 1419 } ··· 1531 1529 } 1532 1530 spin_lock_init(&srq->lock); 1533 1531 1534 - siw_dbg_pd(base_srq->pd, "[SRQ 0x%p]: success\n", srq); 1532 + siw_dbg_pd(base_srq->pd, "[SRQ]: success\n"); 1535 1533 1536 1534 return 0; 1537 1535 ··· 1652 1650 1653 1651 if (unlikely(!srq->kernel_verbs)) { 1654 1652 siw_dbg_pd(base_srq->pd, 1655 - "[SRQ 0x%p]: no kernel post_recv for mapped srq\n", 1656 - srq); 1653 + "[SRQ]: no kernel post_recv for mapped srq\n"); 1657 1654 rv = -EINVAL; 1658 1655 goto out; 1659 1656 } ··· 1674 1673 } 1675 1674 if (unlikely(wr->num_sge > srq->max_sge)) { 1676 1675 siw_dbg_pd(base_srq->pd, 1677 - "[SRQ 0x%p]: too many sge's: %d\n", srq, 1678 - wr->num_sge); 1676 + "[SRQ]: too many sge's: %d\n", wr->num_sge); 1679 1677 rv = -EINVAL; 1680 1678 break; 1681 1679 } ··· 1693 1693 spin_unlock_irqrestore(&srq->lock, flags); 1694 1694 out: 1695 1695 if (unlikely(rv < 0)) { 1696 - siw_dbg_pd(base_srq->pd, "[SRQ 0x%p]: error %d\n", srq, rv); 1696 + siw_dbg_pd(base_srq->pd, "[SRQ]: error %d\n", rv); 1697 1697 *bad_wr = wr; 1698 1698 } 1699 1699 return rv;
+1 -2
include/rdma/restrack.h
··· 105 105 }; 106 106 107 107 int rdma_restrack_count(struct ib_device *dev, 108 - enum rdma_restrack_type type, 109 - struct pid_namespace *ns); 108 + enum rdma_restrack_type type); 110 109 111 110 void rdma_restrack_kadd(struct rdma_restrack_entry *res); 112 111 void rdma_restrack_uadd(struct rdma_restrack_entry *res);