Message ID | 599323B9020000780016FEC9@prv-mh.provo.novell.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 15/08/17 15:39, Jan Beulich wrote: > @@ -422,8 +422,13 @@ get_maptrack_handle( > /* > * 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). > + * Also use this path in case we're out of memory, to avoid spurious > + * failures. This comment isn't strictly correct any more. It is now "If we've run out of handles and still have frame headroom, try allocating a new maptrack frame. If there is no headroom, or Xen is out of memory, try stealing an entry from another vcpu". ~Andrew > */ > - 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); >
--- 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) ) @@ -422,8 +422,13 @@ get_maptrack_handle( /* * 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). + * Also use this path in case we're out of memory, to avoid spurious + * failures. */ - 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); /*
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>