static grant_entry_t *shared;
static struct gnttab_free_callback *gnttab_free_callback_list = NULL;
+static spinlock_t gnttab_free_callback_list_lock = SPIN_LOCK_UNLOCKED;
/*
* Lock-free grant-entry allocator
static void do_free_callbacks(void)
{
- struct gnttab_free_callback *callback = gnttab_free_callback_list, *next;
+ struct gnttab_free_callback *callback, *next;
+ spin_lock_irq(&gnttab_free_callback_list_lock);
+ callback = gnttab_free_callback_list;
gnttab_free_callback_list = NULL;
+ spin_unlock_irq(&gnttab_free_callback_list_lock);
while (callback) {
next = callback->next;
callback->next = NULL;
grant_ref_t fh, nfh = gnttab_free_head;
do { gnttab_free_list[ref] = fh = nfh; wmb(); }
while ( unlikely((nfh = cmpxchg(&gnttab_free_head, fh, ref)) != fh) );
+ spin_lock_irq(&gnttab_free_callback_list_lock);
if ( unlikely(gnttab_free_callback_list) )
do_free_callbacks();
+ spin_unlock_irq(&gnttab_free_callback_list_lock);
}
/*
return;
callback->fn = fn;
callback->arg = arg;
+ spin_lock_irq(&gnttab_free_callback_list_lock);
callback->next = gnttab_free_callback_list;
gnttab_free_callback_list = callback;
+ spin_unlock_irq(&gnttab_free_callback_list_lock);
}
/*