Re: question re: CM_EVENT_DEVICE_REMOVAL

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> On Mar 30, 2018, at 10:17 AM, Steve Wise <swise@xxxxxxxxxxxxxxxxxxxxx> wrote:
> 
> 
> 
>> -----Original Message-----
>> From: Chuck Lever <chuck.lever@xxxxxxxxxx>
>> Sent: Friday, March 30, 2018 9:15 AM
>> To: Steve Wise <swise@xxxxxxxxxxxxxxxxxxxxx>
>> Cc: linux-rdma <linux-rdma@xxxxxxxxxxxxxxx>
>> Subject: Re: question re: CM_EVENT_DEVICE_REMOVAL
>> 
>> 
>> 
>>> On Mar 30, 2018, at 9:22 AM, Steve Wise
>> <swise@xxxxxxxxxxxxxxxxxxxxx> wrote:
>>> 
>>>>> On 3/29/2018 4:01 PM, Chuck Lever wrote:
>>>>>> Hi-
>>>>>> 
>>>>>> I've been experimenting with the DEVICE_REMOVAL event on the
>>>>>> NFS/RDMA server, and noticed that there is a DEVICE_REMOVAL
>>>>>> event for IDs associated with a remote connection, but there
>>>>>> does not seem to be a a DEVICE_REMOVAL upcall for listener IDs.
>>>>>> 
>>>>>> Is this correct API behavior?
>>>>>> 
>>>>>> --
>>>>>> Chuck Lever
>>>>>> 
>>>>> 
>>>>> I think you will see DEVICE_REMOVAL events only if the listen was done
>>>>> on a cm_id that was bound to a specific address and thus actually is
>>>>> associated with a device.   Thus listening cm_ids bound to INADDR_ANY
>>>>> won't get DEVICE_REMOVAL events.  The idea is that if the app listens
>> on
>>>>> INADDR_ANY, it doesn't need to know if a single device comes or goes...
>>>> 
>>>> Thanks Steve.
>>>> 
>>>> Then a listener ID has no hardware resources associated
>>>> with it?
>>> 
>>> A listener ID bound to INADDR_ANY is not directly bound to any device,
>> so no hw resources.  However, the CMA creates internal IDs that are bound
>> to each available device and setup to listen.  So those internally-managed
>> IDs get destroyed or added as rdma devices are removed or inserted.
>>> 
>>> EG: let's say you have a mlx5 and a cxgb4 device up and active.  3 IDs are
>> created when an application listens on INADDR_ANY:  The ID created by the
>> ULP which is the parent ID, and 2 internal child IDs created by the CMA, one
>> listening on mlx5 and one listening on cxgb4.  Now if cxgb4 is removed, the
>> CMA gets a DEVICE_REMOVAL ib_client event on that ID.  Since the ID is
>> internal, the CMA doesn't pass a DEVICE_REMOVAL up to the ULP.  However
>> that child/internal ID is destroyed since cxgb4 is going away.  At that point
>> there are now 2 IDs:  The ULP's ID and the mlx5 ID.  If cxgb4 gets inserted
>> again, then we'll end up with 3 IDs again.
>>> 
>>>> 
>>>> Here's a dumb follow-up question: What about listeners on
>>>> specific addresses?
>>>> 
>>> 
>>> If the ULP binds to a particular address, then that ID is bound to the
>> underlying device, and I believe it will get the DEVICE_REMOVAL event in
>> that case.
>>> 
>>> I encourage you to confirm this by observation. 😊
>> 
>> Are our kernel ULPs smart enough to deal with the difference?
>> 
> 
> I don't know for sure.  iSER and NVMe/F drivers do handle DEVICE_REMOVAL though.  For NVMe/F, the CMA device removal events proved difficult to handle correctly, so we ended up using the ib_client API and using that device removal path to free up all resources for that device.  Looking at the code quickly, I see the target side uses a combination of both CMA and ib_client device removal events, and the host side just uses the ib_client removal event.

I have not had a chance to construct a test case here, but for
the NFS/RDMA server, it turns out that all the listeners are
INADDR_ANY (or IN6ADDR_ANY) in the current code base.

However, NFS's RDMA listeners are always set up in init_net.
I've got a patch to fix that up, but I'm wondering if the same
arrangement of subordinate IDs is done with an INADDR_ANY
listener in a non-init network namespace.


--
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




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux