gnttab: avoid spurious maptrack handle allocation failures

When no memory is available in the hypervisor, rather than immediately
failing the request, try to steal a handle from another vCPU.

Reported-by: George Dunlap <george.dunlap@citrix.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
master commit: d02f1a0b75
master date: 2017-08-17 14:41:01 +0200
This commit is contained in:
Jan Beulich committed 2017-08-28 12:23:22 +02:00
1 parent 300529d6b5
commit ffb73c1406
1 file changed
+9 -10
+9 -10
View File
@@ -411,7 +411,7 @@ get_maptrack_handle(
struct vcpu *curr = current;
unsigned int i, head;
grant_handle_t handle;
struct grant_mapping *new_mt;
struct grant_mapping *new_mt = NULL;
handle = __get_maptrack_handle(lgt, curr);
if ( likely(handle != -1) )
@@ -420,10 +420,15 @@ get_maptrack_handle(
spin_lock(&lgt->maptrack_lock);
/*
* If we've run out of frames, try stealing an entry from another
* VCPU (in case the guest isn't mapping across its VCPUs evenly).
* If we've run out of handles and still have frame headroom, try
* allocating a new maptrack frame. If there is no headroom, or we're
* out of memory, try stealing an entry from another VCPU (in case the
* guest isn't mapping across its VCPUs evenly).
*/
if ( nr_maptrack_frames(lgt) >= max_maptrack_frames )
if ( nr_maptrack_frames(lgt) < max_maptrack_frames )
new_mt = alloc_xenheap_page();
if ( !new_mt )
{
spin_unlock(&lgt->maptrack_lock);
@@ -446,12 +451,6 @@ get_maptrack_handle(
return steal_maptrack_handle(lgt, curr);
}
new_mt = alloc_xenheap_page();
if ( !new_mt )
{
spin_unlock(&lgt->maptrack_lock);
return -1;
}
clear_page(new_mt);
/*
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.