x86/mem_sharing: don't try to unshare twice during page fault

The page was already tried to be unshared in get_gfn_type_access. If that
didn't work, then trying again is pointless. Don't try to send vm_event again
either, simply check if there is a ring or not.

Signed-off-by: Tamas K Lengyel <tamas.lengyel@intel.com>
Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Tamas K Lengyel authored and Jan Beulich committed 2020-01-24 10:21:16 +01:00
1 parent f268900fbc
commit e6fcf0efe4
1 file changed
+15 -10
+15 -10
View File
@@ -38,6 +38,7 @@
#include <xen/warning.h>
#include <xen/vpci.h>
#include <xen/nospec.h>
#include <xen/vm_event.h>
#include <asm/shadow.h>
#include <asm/hap.h>
#include <asm/current.h>
@@ -1702,7 +1703,7 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned long gla,
struct domain *currd = curr->domain;
struct p2m_domain *p2m, *hostp2m;
int rc, fall_through = 0, paged = 0;
int sharing_enomem = 0;
bool sharing_enomem = false;
vm_event_request_t *req_ptr = NULL;
bool sync = false;
unsigned int page_order;
@@ -1894,14 +1895,16 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned long gla,
if ( p2m_is_paged(p2mt) || (p2mt == p2m_ram_paging_out) )
paged = 1;
/* Mem sharing: unshare the page and try again */
if ( npfec.write_access && (p2mt == p2m_ram_shared) )
#ifdef CONFIG_MEM_SHARING
/* Mem sharing: if still shared on write access then its enomem */
if ( npfec.write_access && p2m_is_shared(p2mt) )
{
ASSERT(p2m_is_hostp2m(p2m));
sharing_enomem = mem_sharing_unshare_page(currd, gfn);
sharing_enomem = true;
rc = 1;
goto out_put_gfn;
}
#endif
/* Spurious fault? PoD and log-dirty also take this path. */
if ( p2m_is_ram(p2mt) )
@@ -1955,19 +1958,21 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned long gla,
*/
if ( paged )
p2m_mem_paging_populate(currd, gfn);
if ( sharing_enomem )
{
int rv;
if ( (rv = mem_sharing_notify_enomem(currd, gfn, true)) < 0 )
#ifdef CONFIG_MEM_SHARING
if ( !vm_event_check_ring(currd->vm_event_share) )
{
gdprintk(XENLOG_ERR, "Domain %hu attempt to unshare "
"gfn %lx, ENOMEM and no helper (rc %d)\n",
currd->domain_id, gfn, rv);
gprintk(XENLOG_ERR, "Domain %pd attempt to unshare "
"gfn %lx, ENOMEM and no helper\n",
currd, gfn);
/* Crash the domain */
rc = 0;
}
#endif
}
if ( req_ptr )
{
if ( monitor_traps(curr, sync, req_ptr) < 0 )
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.