|   | 
      | 
  
  
      | 
      | 
  
 
     | 
    | 
  
  
     | 
    | 
  
  
    |   | 
      | 
  
  
    | 
         
xen-changelog
[Xen-changelog] [xen-unstable] Handle PoD case in	hvm_hap_nested_page_fa
 
# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1262781923 0
# Node ID cba56c13ca3eba67a3b56e78256418fd62445a95
# Parent  a1d0a575b4bace0a79ecfb48704b24fc9ae7866b
Handle PoD case in hvm_hap_nested_page_fault()
The new combined nested page fault handling doesn't consider the case
where the gfn_to_mfn() translation caused the page to be transparently
populated.
Signed-off-by: George Dunlap <george.dunlap@xxxxxxxxxxxxx>
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hvm/hvm.c |   19 +++++++++----------
 1 files changed, 9 insertions(+), 10 deletions(-)
diff -r a1d0a575b4ba -r cba56c13ca3e xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Wed Jan 06 10:13:55 2010 +0000
+++ b/xen/arch/x86/hvm/hvm.c    Wed Jan 06 12:45:23 2010 +0000
@@ -951,22 +951,21 @@ bool_t hvm_hap_nested_page_fault(unsigne
     if ( p2m_is_paged(p2mt) || (p2mt == p2m_ram_paging_out) )
         p2m_mem_paging_populate(current->domain, gfn);
 
-    /* Log-dirty: mark the page dirty and let the guest write it again */
-    if ( paging_mode_log_dirty(current->domain)
-         && p2m_is_ram(p2mt) && (p2mt != p2m_ram_ro) )
+    /* Mem sharing: unshare the page and try again */
+    if ( p2mt == p2m_ram_shared )
+    {
+        mem_sharing_unshare_page(current->domain, gfn, 0);
+        return 1;
+    }
+ 
+    /* Spurious fault? PoD and log-dirty also take this path. */
+    if ( p2m_is_ram(p2mt) )
     {
         paging_mark_dirty(current->domain, mfn_x(mfn));
         p2m_change_type(current->domain, gfn, p2m_ram_logdirty, p2m_ram_rw);
         return 1;
     }
 
-    /* Mem sharing: unshare the page and try again */
-    if ( p2mt == p2m_ram_shared )
-    {
-        mem_sharing_unshare_page(current->domain, gfn, 0);
-        return 1;
-    }
- 
     /* Shouldn't happen: Maybe the guest was writing to a r/o grant mapping? */
     if ( p2mt == p2m_grant_map_ro )
     {
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
 |   
 
| <Prev in Thread] | 
Current Thread | 
[Next in Thread> |  
- [Xen-changelog] [xen-unstable] Handle PoD case in	hvm_hap_nested_page_fault(),
Xen patchbot-unstable <=
  
 |  
  
 | 
    | 
  
  
    |   | 
    |