[openib-general] [PATCH] for 2-6-19 rdma/addr: use client registration to fix module unload race
Or Gerlitz
ogerlitz at voltaire.com
Wed Nov 1 02:48:12 PST 2006
Sean Hefty wrote:
> Or Gerlitz wrote:
>> If yes, this seems to me as one big over-doing, assuming the consumer
>> always either call XXX_destory_id() OR returns non zero from a
>> callback on this ID, there must be away to avoid the race within the
>> ID provider module, so at least the api can be saved...
>
> As long as the user can destroy a cm_id from their callback, the ib_cm
> and rdma_cm have this issue. This feature ends up being fairly useful,
> so I'm hesitant to remove it. The alternative is that a user must
Assuming it is indeed useful and nice feature which we don't want to
remove (does someone is aware to any similar example in the kernel where
you can delete a resource from its associated callback? ie i am quite
sure you are **not** allowed to delete a timer or destroy a socket from
within their callbacks).
> always call xxx_destroy_id(), but that cannot be done from within the
> callback thread itself. This would require a user to schedule a thread
> to call destroy, which may not always be possible. (Consider the case
> where the cm creates a new id as part of a connection request. For the
> user to schedule the destruction, it would need to queue the new cm_id
> somewhere, which may not be possible.)
what about enhancing xxx_destory_id() to sense that it was called from
this id callback context so the xxx module code defers the destory_id()
execution to run after the callback is over. This can be done by
writing at the id the pid of the thread running the callback before
going to the consumer and deleting it when the callback returns. Then if
in_callback(id) holds, have the destory_id() call schedule itself to
later stage, where it checks again etc.
At the bottom line, users must call xxx_destory_id() explicitly the xxx
module would be able to handle in_callback situations.
Or.
More information about the general
mailing list