From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andres Lagar-Cavilla Subject: [PATCH 1 of 3] Improve handling of nested page faults Date: Thu, 01 Dec 2011 14:24:57 -0500 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com Cc: andres@gridcentric.ca, keir.xen@gmail.com, tim@xen.org, JBeulich@suse.com, adin@gridcentric.ca List-Id: xen-devel@lists.xenproject.org xen/arch/x86/hvm/hvm.c | 14 +++++++++----- 1 files changed, 9 insertions(+), 5 deletions(-) Add checks for access type. Be less reliant on implicit semantics. Signed-off-by: Andres Lagar-Cavilla diff -r 2f8d261e3701 -r d6cc661d770a xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -1288,7 +1288,8 @@ int hvm_hap_nested_page_fault(unsigned l * If this GFN is emulated MMIO or marked as read-only, pass the fault * to the mmio handler. */ - if ( (p2mt == p2m_mmio_dm) || (p2mt == p2m_ram_ro) ) + if ( (p2mt == p2m_mmio_dm) || + (access_w && (p2mt == p2m_ram_ro)) ) { if ( !handle_mmio() ) hvm_inject_exception(TRAP_gp_fault, 0, 0); @@ -1302,7 +1303,7 @@ int hvm_hap_nested_page_fault(unsigned l p2m_mem_paging_populate(v->domain, gfn); /* Mem sharing: unshare the page and try again */ - if ( p2mt == p2m_ram_shared ) + if ( access_w && (p2mt == p2m_ram_shared) ) { ASSERT(!p2m_is_nestedp2m(p2m)); mem_sharing_unshare_page(p2m->domain, gfn, 0); @@ -1319,14 +1320,17 @@ int hvm_hap_nested_page_fault(unsigned l * a large page, we do not change other pages type within that large * page. */ - paging_mark_dirty(v->domain, mfn_x(mfn)); - p2m_change_type(v->domain, gfn, p2m_ram_logdirty, p2m_ram_rw); + if ( access_w ) + { + paging_mark_dirty(v->domain, mfn_x(mfn)); + p2m_change_type(v->domain, gfn, p2m_ram_logdirty, p2m_ram_rw); + } rc = 1; goto out_put_gfn; } /* Shouldn't happen: Maybe the guest was writing to a r/o grant mapping? */ - if ( p2mt == p2m_grant_map_ro ) + if ( access_w && (p2mt == p2m_grant_map_ro) ) { gdprintk(XENLOG_WARNING, "trying to write to read-only grant mapping\n");