On 4/11/22 11:25, Pearson, Robert B wrote: > Zhu, > > Would you be willing to try the v13 pool patch series. It also fixes the blktests bug. > (You have to apply Bart's scsi_debug revert patch to fix that issue.) > I think it may also fix this issue because it is way more careful about deferring qp cleanup > code until after all the packets have completed. > > The bug you are seeing feels like a race with qp destroy. > > Bob > > -----Original Message----- > From: Zhu Yanjun <zyjzyj2000@xxxxxxxxx> > Sent: Monday, April 11, 2022 12:34 AM > To: Bob Pearson <rpearsonhpe@xxxxxxxxx> > Cc: linux-rdma@xxxxxxxxxxxxxxx > Subject: Re: null pointer in rxe_mr_copy() > > On Mon, Apr 11, 2022 at 1:14 PM Zhu Yanjun <zyjzyj2000@xxxxxxxxx> wrote: >> >> On Mon, Apr 11, 2022 at 11:34 AM Bob Pearson <rpearsonhpe@xxxxxxxxx> wrote: >>> >>> Zhu, >>> >>> Since checking for mr == NULL in rxe_mr_copy fixes the problem you were seeing in rping. >>> Perhaps it would be a good idea to apply the following patch which >>> would tell us which of the three calls to rxe_mr_copy is failing. My >>> suspicion is the one in read_reply() >> Hi, Bob >> >> Yes. It is the function read_reply. > > 720 static enum resp_states read_reply(struct rxe_qp *qp, > 721 struct rxe_pkt_info *req_pkt) > 722 { > 723 struct rxe_pkt_info ack_pkt; > 724 struct sk_buff *skb; > 725 int mtu = qp->mtu; > 726 enum resp_states state; > 727 int payload; > 728 int opcode; > 729 int err; > 730 struct resp_res *res = qp->resp.res; > 731 struct rxe_mr *mr; > 732 > 733 if (!res) { > 734 res = rxe_prepare_read_res(qp, req_pkt); > 735 qp->resp.res = res; > 736 } > 737 > 738 if (res->state == rdatm_res_state_new) { > 739 mr = qp->resp.mr; > <----It seems that mr is from here. > 740 qp->resp.mr = NULL; > 741 > > >> >> kernel: ------------[ cut here ]------------ >> kernel: WARNING: CPU: 74 PID: 38510 at >> drivers/infiniband/sw/rxe/rxe_resp.c:768 rxe_responder+0x1d67/0x1dd0 >> [rdma_rxe] >> kernel: Modules linked in: rdma_rxe(OE) ip6_udp_tunnel udp_tunnel >> rds_rdma rds xt_CHECKSUM xt_MASQUERADE xt_conntrack ipt_REJECT >> nf_reject_ipv4 nft_compat nft_chain_nat nf_nat nf_conntrack >> nf_defrag_ipv6 nf_defrag_ipv4 nf_tables nfnetlink tun bridge stp llc >> vfat fat rpcrdma sunrpc rdma_ucm ib_srpt ib_isert iscsi_target_mod >> target_core_mod intel_rapl_msr intel_rapl_common ib_iser libiscsi >> scsi_transport_iscsi rdma_cm ib_cm i10nm_edac iw_cm nfit libnvdimm >> x86_pkg_temp_thermal intel_powerclamp coretemp ipmi_ssif kvm_intel kvm >> irdma iTCO_wdt iTCO_vendor_support i40e irqbypass crct10dif_pclmul >> crc32_pclmul ib_uverbs ghash_clmulni_intel rapl intel_cstate ib_core >> intel_uncore wmi_bmof pcspkr mei_me isst_if_mbox_pci isst_if_mmio >> acpi_ipmi isst_if_common ipmi_si i2c_i801 mei intel_pch_thermal >> i2c_smbus ipmi_devintf ipmi_msghandler acpi_power_meter ip_tables xfs >> libcrc32c sd_mod t10_pi crc64_rocksoft crc64 sg mgag200 i2c_algo_bit >> drm_shmem_helper drm_kms_helper syscopyarea sysfillrect ice >> kernel: sysimgblt fb_sys_fops ahci drm libahci crc32c_intel libata >> megaraid_sas tg3 wmi dm_mirror dm_region_hash dm_log dm_mod fuse [last >> unloaded: ip6_udp_tunnel] >> kernel: CPU: 74 PID: 38510 Comm: rping Kdump: loaded Tainted: G S >> W OE 5.18.0.RXE #14 >> kernel: Hardware name: Dell Inc. PowerEdge R750/06V45N, BIOS 1.2.4 >> 05/28/2021 >> kernel: RIP: 0010:rxe_responder+0x1d67/0x1dd0 [rdma_rxe] >> kernel: Code: 24 30 48 89 44 24 30 49 8b 86 88 00 00 00 48 89 44 24 >> 38 48 8b 73 20 48 8b 43 18 ff d0 0f 1f 00 e9 10 e3 ff ff e8 e9 52 98 >> ee <0f> 0b 45 8b 86 f0 00 00 00 48 8b 8c 24 e0 00 00 00 ba 01 03 00 00 >> kernel: RSP: 0018:ff5f5b78c7624e70 EFLAGS: 00010246 >> kernel: RAX: ff20346c70a1d700 RBX: ff20346c7127c040 RCX: >> ff20346c70a1d700 >> kernel: RDX: 0000000000000000 RSI: 0000000000000000 RDI: >> ff20346c53194000 >> kernel: RBP: 0000000000000040 R08: 2ebbb556a556fe7f R09: >> 69de575d0320dc48 >> kernel: R10: ff5f5b78c7624de0 R11: 00000000ee4984a4 R12: >> ff20346c70a1d700 >> kernel: R13: 0000000000000000 R14: ff20346ef0539000 R15: >> ff20346c70a1c528 >> kernel: FS: 00007ff34d49b740(0000) GS:ff20347b3fa80000(0000) >> knlGS:0000000000000000 >> kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 >> kernel: CR2: 00007ff40be030c0 CR3: 00000003d0634005 CR4: >> 0000000000771ee0 >> kernel: DR0: 0000000000000000 DR1: 0000000000000000 DR2: >> 0000000000000000 >> kernel: DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: >> 0000000000000400 >> kernel: PKRU: 55555554 >> kernel: Call Trace: >> kernel: <IRQ> >> kernel: ? __local_bh_enable_ip+0x9f/0xe0 >> kernel: ? rxe_do_task+0x67/0xe0 [rdma_rxe] >> kernel: ? __local_bh_enable_ip+0x77/0xe0 >> kernel: rxe_do_task+0x71/0xe0 [rdma_rxe] >> kernel: tasklet_action_common.isra.15+0xb8/0xf0 >> kernel: __do_softirq+0xe4/0x48c >> kernel: ? rxe_do_task+0x67/0xe0 [rdma_rxe] >> kernel: do_softirq+0xb5/0x100 >> kernel: </IRQ> >> kernel: <TASK> >> kernel: __local_bh_enable_ip+0xd0/0xe0 >> kernel: rxe_do_task+0x67/0xe0 [rdma_rxe] >> kernel: rxe_post_send+0x2ff/0x4c0 [rdma_rxe] >> kernel: ? rdma_lookup_get_uobject+0x131/0x1e0 [ib_uverbs] >> kernel: ib_uverbs_post_send+0x4d5/0x700 [ib_uverbs] >> kernel: ib_uverbs_write+0x38f/0x5e0 [ib_uverbs] >> kernel: ? find_held_lock+0x2d/0x90 >> kernel: vfs_write+0xb8/0x370 >> kernel: ksys_write+0xbb/0xd0 >> kernel: ? syscall_trace_enter.isra.15+0x169/0x220 >> kernel: do_syscall_64+0x37/0x80 >> >> Zhu Yanjun >> >> in rxe_resp.c >>> This could be caused by a race between shutting down the qp and finishing up an RDMA read. >>> The responder resources state machine is completely unprotected from >>> simultaneous access by verbs code and bh code in rxe_resp.c. >>> rxe_resp is a tasklet so all the accesses from there are serialized >>> but if anyone makes a verbs call that touches the responder resources it could cause problems. The most likely (only?) place this could happen is qp shutdown. >>> >>> Bob >>> >>> >>> >>> diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c >>> b/drivers/infiniband/sw/rxe/rxe_mr.c >>> >>> index 60a31b718774..66184f5a4ddf 100644 >>> >>> --- a/drivers/infiniband/sw/rxe/rxe_mr.c >>> >>> +++ b/drivers/infiniband/sw/rxe/rxe_mr.c >>> >>> @@ -489,6 +489,7 @@ int copy_data( >>> >>> if (bytes > 0) { >>> >>> iova = sge->addr + offset; >>> >>> >>> >>> + WARN_ON(!mr); >>> >>> err = rxe_mr_copy(mr, iova, addr, bytes, >>> dir); >>> >>> if (err) >>> >>> goto err2; >>> >>> diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c >>> b/drivers/infiniband/sw/rxe/rxe_resp.c >>> >>> index 1d95fab606da..6e3e86bdccd7 100644 >>> >>> --- a/drivers/infiniband/sw/rxe/rxe_resp.c >>> >>> +++ b/drivers/infiniband/sw/rxe/rxe_resp.c >>> >>> @@ -536,6 +536,7 @@ static enum resp_states write_data_in(struct >>> rxe_qp *qp, >>> >>> int err; >>> >>> int data_len = payload_size(pkt); >>> >>> >>> >>> + WARN_ON(!qp->resp.mr); >>> >>> err = rxe_mr_copy(qp->resp.mr, qp->resp.va + >>> qp->resp.offset, >>> >>> payload_addr(pkt), data_len, >>> RXE_TO_MR_OBJ); >>> >>> if (err) { >>> >>> @@ -772,6 +773,7 @@ static enum resp_states read_reply(struct rxe_qp >>> *qp, >>> >>> if (!skb) >>> >>> return RESPST_ERR_RNR; >>> >>> >>> >>> + WARN_ON(!mr); >>> >>> err = rxe_mr_copy(mr, res->read.va, payload_addr(&ack_pkt), >>> >>> payload, RXE_FROM_MR_OBJ); >>> >>> if (err) >>> When you run rping are you going between two machines? It doesn't work in loopback as far as I can tell. Bob