Recursion in non-recursive mutex when using the grant table free callbacks

Roger Pau Monné royger at freebsd.org
Mon Jul 30 09:32:05 UTC 2018


On Sun, Jul 29, 2018 at 06:08:56PM +0530, Pratyush Yadav wrote:
> Hi,
> 
> Currently, the grant table free callbacks can not work. This is
> because of a recursion on a non-recursive mutex that causes a kernel
> panic. The cause of the recursion is: check_free_callbacks() is always
> called with the lock gnttab_list_lock held. So, the callback function
> is called with the lock held. So, when the client uses any of the
> grant reference allocation methods get_free_entries() is called, which
> tries to acquire gnttab_list_lock(grant_table.c:77 [0]), causing a
> recursion on the lock.
> 
> I'm not sure what the correct fix would be though. One way I can think
> of is that check_free_callback() should be called without the lock
> held. But with this fix, it is possible for the callback to be called
> even though the grant references it needs are not available. This
> would happen when another thread takes those references while the
> current thread has completed the check if(gnttab_free_count >=
> callback->count) but has not yet called the callback
> (grant_table,c:105 [1]).
> 
> I think a better way to fix this would be to have a check in
> get_free_entries() whether the current thread holds the lock, so it
> does not try to acquire the lock if the current thread already holds
> it.

I agree in the analysis, however I think the proper solution is to use
a recursive lock.

Roger.


More information about the freebsd-xen mailing list