> From: Chuck Lever [mailto:chuck.lever@xxxxxxxxxx] > Sent: Tuesday, March 20, 2018 4:15 PM > To: Kalderon, Michal <Michal.Kalderon@xxxxxxxxxx> > Cc: linux-rdma@xxxxxxxxxxxxxxx > Subject: Re: [PATCH v1] xprtrdma: Fix corner cases when handling device > removal > > > > > On Mar 20, 2018, at 3:39 AM, Kalderon, Michal > <Michal.Kalderon@xxxxxxxxxx> wrote: > > > >> From: Chuck Lever [mailto:chuck.lever@xxxxxxxxxx] > >> Sent: Tuesday, March 20, 2018 2:40 AM > >>> On Mar 19, 2018, at 2:06 PM, Chuck Lever <chuck.lever@xxxxxxxxxx> > >> wrote: > >>>> On Mar 19, 2018, at 1:26 PM, Kalderon, Michal > >> <Michal.Kalderon@xxxxxxxxxx> wrote: > >>>> > >>>>> From: Kalderon, Michal > >>>>> Sent: Monday, March 19, 2018 7:22 PM > >>>>> To: 'Chuck Lever' <chuck.lever@xxxxxxxxxx> > >>>>> Cc: linux-rdma@xxxxxxxxxxxxxxx > >>>>> Subject: RE: [PATCH v1] xprtrdma: Fix corner cases when handling > >>>>> device removal > >>>>> > >>>>>> From: Chuck Lever [mailto:chuck.lever@xxxxxxxxxx] > >>>>>> Sent: Monday, March 19, 2018 4:59 PM > >>>>>> To: Kalderon, Michal <Michal.Kalderon@xxxxxxxxxx> > >>>>>> Cc: linux-rdma@xxxxxxxxxxxxxxx > >>>>>> Subject: Re: [PATCH v1] xprtrdma: Fix corner cases when handling > >>>>>> device removal > >>>>>> > >>>>>> Hi Michal- > >>>>>> > >>>>>> Have you tried this one? If we can nail this down now, I can > >>>>>> easily get it into the v4.17 merge window. > >>>>> > >>>>> Yes, looks good thanks. > >>>> > >>>> Chuck, while testing changes, I ran into a different issue though. > >>>> If I perform mount to a server that does not have the nfs rdma port > >>>> in portlist using mount -o rdma, And then perform rmmod qedr, it > >>>> hangs > >> with following stack : > >>>> > >>>> root@lb-tlvb-pcie37 ~]# cat /proc/5981/stack [<0>] > >>>> rpcrdma_conn_upcall+0x26a/0x310 [rpcrdma] [<0>] > >>>> cma_remove_one+0x26d/0x2a0 [rdma_cm] [<0>] > >>>> ib_unregister_device+0xcc/0x180 [ib_core] [<0>] > >> qedr_remove+0x37/0x80 > >>>> [qedr] [<0>] qede_rdma_unregister_driver+0x4b/0x90 [qede] [<0>] > >>>> SyS_delete_module+0x1c2/0x240 [<0>] do_syscall_64+0x6e/0x190 > [<0>] > >>>> entry_SYSCALL_64_after_hwframe+0x3d/0xa2 > >>>> > >>>> (wait_for_completion(&ia->ri_remove_done) > >>> > >>> I will try to reproduce it here. > >> > >> I can't reproduce with my IB or my RoCE rig, but I might not have > >> understood how you are getting into this state. I'm trying this: > >> > >> # mount.nfs -v -o vers=4.0,proto=rdma,port=12345,sec=sys nfs- > >> roce:/export/tmp /mnt > > > > I killed the mount attempt with "Ctrl-C" and performed the rmmod from > > the same window > > [root@manet ~]# mount.nfs -v -o vers=4.0,proto=rdma,port=12345,sec=sys > nfs-roce:/export/tmp /mnt > mount.nfs: timeout set for Tue Mar 20 10:12:03 2018 > mount.nfs: trying text-based options > 'vers=4.0,proto=rdma,port=12345,sec=sys,addr=192.168.3.9,clientaddr=192.1 > 68.3.2' > mount.nfs: mount(2): Connection refused > mount.nfs: trying text-based options > 'vers=4.0,proto=rdma,port=12345,sec=sys,addr=192.168.3.9,clientaddr=192.1 > 68.3.2' > mount.nfs: mount(2): Connection refused > mount.nfs: trying text-based options > 'vers=4.0,proto=rdma,port=12345,sec=sys,addr=192.168.3.9,clientaddr=192.1 > 68.3.2' > mount.nfs: mount(2): Connection refused > mount.nfs: trying text-based options > 'vers=4.0,proto=rdma,port=12345,sec=sys,addr=192.168.3.9,clientaddr=192.1 > 68.3.2' > mount.nfs: mount(2): Connection refused > ^C > [root@manet ~]# rmmod mlx4_en > [root@manet ~]# modprobe mlx4_en; ifup ens6 [root@manet ~]# > > No hang. > > Can you try this: > > # trace-cmd record -e sunrpc -e rpcrdma Haven't tried this yet, but just wanted to mention that I do ^C before getting connection refused thanks > > Let that run while you reproduce. Afterwards ^C this command and send me > the resulting trace.dat, off-list. > > > >> and while it is looping trying to connect, I do this in another > >> window: > >> > >> # rmmod mlx4_en > >> > >> On it's next attempt to connect, the connect worker fails with > >> RDMA_CM_EVENT_ADDR_ERROR. I don't ever see > >> RDMA_CM_EVENT_DEVICE_REMOVAL. > >> > >> > >>>> Thanks, > >>>> Michal > >>>>>> > >>>>>> > >>>>>>> On Mar 14, 2018, at 10:42 AM, Chuck Lever > >>>>>>> <chuck.lever@xxxxxxxxxx> > >>>>>> wrote: > >>>>>>> > >>>>>>> Michal Kalderon has found some corner cases around device > unload > >>>>>>> with active NFS mounts that I didn't have the imagination to > >>>>>>> test when xprtrdma device removal was added last year. > >>>>>>> > >>>>>>> - The ULP device removal handler is responsible for deallocating > >>>>>>> the PD. That wasn't clear to me initially, and my own testing > >>>>>>> suggested it was not necessary, but that is incorrect. > >>>>>>> > >>>>>>> - The transport destruction path can no longer assume that there > >>>>>>> is a valid ID. > >>>>>>> > >>>>>>> - When destroying a transport, ensure that ib_free_cq() is not > >>>>>>> invoked on a CQ that was already released. > >>>>>>> > >>>>>>> Reported-by: Michal Kalderon <Michal.Kalderon@xxxxxxxxxx> > >>>>>>> Fixes: bebd031866ca ("xprtrdma: Support unplugging an HCA from > >>>>>>> ...") > >>>>>>> Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> > >>>>>>> Cc: stable@xxxxxxxxxxxxxxx > >>>>>>> --- > >>>>>>> net/sunrpc/xprtrdma/verbs.c | 13 +++++++++---- > >>>>>>> 1 file changed, 9 insertions(+), 4 deletions(-) > >>>>>>> > >>>>>>> diff --git a/net/sunrpc/xprtrdma/verbs.c > >>>>>>> b/net/sunrpc/xprtrdma/verbs.c index d19ea02..c284ee7 100644 > >>>>>>> --- a/net/sunrpc/xprtrdma/verbs.c > >>>>>>> +++ b/net/sunrpc/xprtrdma/verbs.c > >>>>>>> @@ -251,7 +251,6 @@ > >>>>>>> wait_for_completion(&ia->ri_remove_done); > >>>>>>> > >>>>>>> ia->ri_id = NULL; > >>>>>>> - ia->ri_pd = NULL; > >>>>>>> ia->ri_device = NULL; > >>>>>>> /* Return 1 to ensure the core destroys the id. */ > >>>>>>> return 1; > >>>>>>> @@ -449,7 +448,9 @@ > >>>>>>> ia->ri_id->qp = NULL; > >>>>>>> } > >>>>>>> ib_free_cq(ep->rep_attr.recv_cq); > >>>>>>> + ep->rep_attr.recv_cq = NULL; > >>>>>>> ib_free_cq(ep->rep_attr.send_cq); > >>>>>>> + ep->rep_attr.send_cq = NULL; > >>>>>>> > >>>>>>> /* The ULP is responsible for ensuring all DMA > >>>>>>> * mappings and MRs are gone. > >>>>>>> @@ -462,6 +463,8 @@ > >>>>>>> rpcrdma_dma_unmap_regbuf(req->rl_recvbuf); > >>>>>>> } > >>>>>>> rpcrdma_mrs_destroy(buf); > >>>>>>> + ib_dealloc_pd(ia->ri_pd); > >>>>>>> + ia->ri_pd = NULL; > >>>>>>> > >>>>>>> /* Allow waiters to continue */ > >>>>>>> complete(&ia->ri_remove_done); > >>>>>>> @@ -629,14 +632,16 @@ > >>>>>>> { > >>>>>>> cancel_delayed_work_sync(&ep->rep_connect_worker); > >>>>>>> > >>>>>>> - if (ia->ri_id->qp) { > >>>>>>> + if (ia->ri_id && ia->ri_id->qp) { > >>>>>>> rpcrdma_ep_disconnect(ep, ia); > >>>>>>> rdma_destroy_qp(ia->ri_id); > >>>>>>> ia->ri_id->qp = NULL; > >>>>>>> } > >>>>>>> > >>>>>>> - ib_free_cq(ep->rep_attr.recv_cq); > >>>>>>> - ib_free_cq(ep->rep_attr.send_cq); > >>>>>>> + if (ep->rep_attr.recv_cq) > >>>>>>> + ib_free_cq(ep->rep_attr.recv_cq); > >>>>>>> + if (ep->rep_attr.send_cq) > >>>>>>> + ib_free_cq(ep->rep_attr.send_cq); > >>>>>>> } > >>>>>>> > >>>>>>> /* Re-establish a connection after a device removal event. > >>>>>>> > >>>>>>> -- > >>>>>>> To unsubscribe from this list: send the line "unsubscribe linux- > rdma" > >>>>>>> in the body of a message to majordomo@xxxxxxxxxxxxxxx More > >>>>>> majordomo > >>>>>>> info at http://vger.kernel.org/majordomo-info.html > >>>>>> > >>>>>> -- > >>>>>> Chuck Lever > >>>>>> > >>>>>> > >>>> > >>>> -- > >>>> To unsubscribe from this list: send the line "unsubscribe linux-rdma" > >>>> in the body of a message to majordomo@xxxxxxxxxxxxxxx More > >> majordomo > >>>> info at http://vger.kernel.org/majordomo-info.html > >>> > >>> -- > >>> Chuck Lever > >>> > >>> > >>> > >>> -- > >>> To unsubscribe from this list: send the line "unsubscribe linux-rdma" > >>> in the body of a message to majordomo@xxxxxxxxxxxxxxx More > >> majordomo > >>> info at http://vger.kernel.org/majordomo-info.html > >> > >> -- > >> Chuck Lever > > -- > Chuck Lever > > -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html