[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen stable-4.9] gnttab: avoid spurious maptrack handle allocation failures
commit d23bcc5ae7342a6c369200cda46cf95bcf854dd0 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Mon Aug 28 11:40:13 2017 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Mon Aug 28 11:40:13 2017 +0200 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@xxxxxxxxxx> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> master commit: d02f1a0b7576bafb2fba903c7e6e7221ab0d2847 master date: 2017-08-17 14:41:01 +0200 --- xen/common/grant_table.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 26b4613..6d62fe1 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -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); /* -- generated by git-patchbot for /home/xen/git/xen.git#stable-4.9 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |