[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] x86 hvm: move dirty_vram into struct hvm_domain



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1244207043 -3600
# Node ID 8dd5c3cae086fc9eeb066117fbe131d4d4718438
# Parent  6eff3fe96aff468487a9205a7cd344aaf7d4b5e1
x86 hvm: move dirty_vram into struct hvm_domain

Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
---
 xen/arch/x86/mm/hap/hap.c        |   66 ++++++++++++++++++---------------
 xen/arch/x86/mm/shadow/common.c  |   76 ++++++++++++++++++++-------------------
 xen/arch/x86/mm/shadow/multi.c   |   49 +++++++++++++------------
 xen/include/asm-x86/hvm/domain.h |    3 +
 xen/include/xen/sched.h          |    3 -
 5 files changed, 104 insertions(+), 93 deletions(-)

diff -r 6eff3fe96aff -r 8dd5c3cae086 xen/arch/x86/mm/hap/hap.c
--- a/xen/arch/x86/mm/hap/hap.c Fri Jun 05 09:32:03 2009 +0100
+++ b/xen/arch/x86/mm/hap/hap.c Fri Jun 05 14:04:03 2009 +0100
@@ -58,8 +58,9 @@ int hap_enable_vram_tracking(struct doma
 int hap_enable_vram_tracking(struct domain *d)
 {
     int i;
-
-    if ( !d->dirty_vram )
+    struct sh_dirty_vram *dirty_vram = d->arch.hvm_domain.dirty_vram;
+
+    if ( !dirty_vram )
         return -EINVAL;
 
     /* turn on PG_log_dirty bit in paging mode */
@@ -68,7 +69,7 @@ int hap_enable_vram_tracking(struct doma
     hap_unlock(d);
 
     /* set l1e entries of P2M table to be read-only. */
-    for (i = d->dirty_vram->begin_pfn; i < d->dirty_vram->end_pfn; i++)
+    for (i = dirty_vram->begin_pfn; i < dirty_vram->end_pfn; i++)
         p2m_change_type(d, i, p2m_ram_rw, p2m_ram_logdirty);
 
     flush_tlb_mask(&d->domain_dirty_cpumask);
@@ -78,8 +79,9 @@ int hap_disable_vram_tracking(struct dom
 int hap_disable_vram_tracking(struct domain *d)
 {
     int i;
-
-    if ( !d->dirty_vram )
+    struct sh_dirty_vram *dirty_vram = d->arch.hvm_domain.dirty_vram;
+
+    if ( !dirty_vram )
         return -EINVAL;
 
     hap_lock(d);
@@ -87,7 +89,7 @@ int hap_disable_vram_tracking(struct dom
     hap_unlock(d);
 
     /* set l1e entries of P2M table with normal mode */
-    for (i = d->dirty_vram->begin_pfn; i < d->dirty_vram->end_pfn; i++)
+    for (i = dirty_vram->begin_pfn; i < dirty_vram->end_pfn; i++)
         p2m_change_type(d, i, p2m_ram_rw, p2m_ram_logdirty);
 
     flush_tlb_mask(&d->domain_dirty_cpumask);
@@ -97,12 +99,13 @@ void hap_clean_vram_tracking(struct doma
 void hap_clean_vram_tracking(struct domain *d)
 {
     int i;
-
-    if ( !d->dirty_vram )
+    struct sh_dirty_vram *dirty_vram = d->arch.hvm_domain.dirty_vram;
+
+    if ( !dirty_vram )
         return;
 
     /* set l1e entries of P2M table to be read-only. */
-    for (i = d->dirty_vram->begin_pfn; i < d->dirty_vram->end_pfn; i++)
+    for (i = dirty_vram->begin_pfn; i < dirty_vram->end_pfn; i++)
         p2m_change_type(d, i, p2m_ram_rw, p2m_ram_logdirty);
 
     flush_tlb_mask(&d->domain_dirty_cpumask);
@@ -121,30 +124,32 @@ int hap_track_dirty_vram(struct domain *
                          XEN_GUEST_HANDLE_64(uint8) dirty_bitmap)
 {
     long rc = 0;
+    struct sh_dirty_vram *dirty_vram = d->arch.hvm_domain.dirty_vram;
 
     if ( nr )
     {
-        if ( paging_mode_log_dirty(d) && d->dirty_vram )
-        {
-            if ( begin_pfn != d->dirty_vram->begin_pfn ||
-                 begin_pfn + nr != d->dirty_vram->end_pfn )
+        if ( paging_mode_log_dirty(d) && dirty_vram )
+        {
+            if ( begin_pfn != dirty_vram->begin_pfn ||
+                 begin_pfn + nr != dirty_vram->end_pfn )
             {
                 paging_log_dirty_disable(d);
-                d->dirty_vram->begin_pfn = begin_pfn;
-                d->dirty_vram->end_pfn = begin_pfn + nr;
+                dirty_vram->begin_pfn = begin_pfn;
+                dirty_vram->end_pfn = begin_pfn + nr;
                 rc = paging_log_dirty_enable(d);
                 if (rc != 0)
                     goto param_fail;
             }
         }
-        else if ( !paging_mode_log_dirty(d) && !d->dirty_vram )
+        else if ( !paging_mode_log_dirty(d) && !dirty_vram )
         {
             rc -ENOMEM;
-            if ( (d->dirty_vram = xmalloc(struct sh_dirty_vram)) == NULL )
+            if ( (dirty_vram = xmalloc(struct sh_dirty_vram)) == NULL )
                 goto param_fail;
 
-            d->dirty_vram->begin_pfn = begin_pfn;
-            d->dirty_vram->end_pfn = begin_pfn + nr;
+            dirty_vram->begin_pfn = begin_pfn;
+            dirty_vram->end_pfn = begin_pfn + nr;
+            d->arch.hvm_domain.dirty_vram = dirty_vram;
             hap_vram_tracking_init(d);
             rc = paging_log_dirty_enable(d);
             if (rc != 0)
@@ -152,7 +157,7 @@ int hap_track_dirty_vram(struct domain *
         }
         else
         {
-            if ( !paging_mode_log_dirty(d) && d->dirty_vram )
+            if ( !paging_mode_log_dirty(d) && dirty_vram )
                 rc = -EINVAL;
             else
                 rc = -ENODATA;
@@ -163,10 +168,10 @@ int hap_track_dirty_vram(struct domain *
     }
     else
     {
-        if ( paging_mode_log_dirty(d) && d->dirty_vram ) {
+        if ( paging_mode_log_dirty(d) && dirty_vram ) {
             rc = paging_log_dirty_disable(d);
-            xfree(d->dirty_vram);
-            d->dirty_vram = NULL;
+            xfree(dirty_vram);
+            dirty_vram = d->arch.hvm_domain.dirty_vram = NULL;
         } else
             rc = 0;
     }
@@ -174,10 +179,10 @@ int hap_track_dirty_vram(struct domain *
     return rc;
 
 param_fail:
-    if ( d->dirty_vram )
-    {
-        xfree(d->dirty_vram);
-        d->dirty_vram = NULL;
+    if ( dirty_vram )
+    {
+        xfree(dirty_vram);
+        dirty_vram = d->arch.hvm_domain.dirty_vram = NULL;
     }
     return rc;
 }
@@ -220,11 +225,12 @@ void hap_clean_dirty_bitmap(struct domai
 
 void hap_logdirty_init(struct domain *d)
 {
-    if ( paging_mode_log_dirty(d) && d->dirty_vram )
+    struct sh_dirty_vram *dirty_vram = d->arch.hvm_domain.dirty_vram;
+    if ( paging_mode_log_dirty(d) && dirty_vram )
     {
         paging_log_dirty_disable(d);
-        xfree(d->dirty_vram);
-        d->dirty_vram = NULL;
+        xfree(dirty_vram);
+        dirty_vram = d->arch.hvm_domain.dirty_vram = NULL;
     }
 
     /* Reinitialize logdirty mechanism */
diff -r 6eff3fe96aff -r 8dd5c3cae086 xen/arch/x86/mm/shadow/common.c
--- a/xen/arch/x86/mm/shadow/common.c   Fri Jun 05 09:32:03 2009 +0100
+++ b/xen/arch/x86/mm/shadow/common.c   Fri Jun 05 14:04:03 2009 +0100
@@ -3259,11 +3259,11 @@ void shadow_teardown(struct domain *d)
      * calls now that we've torn down the bitmap */
     d->arch.paging.mode &= ~PG_log_dirty;
 
-    if (d->dirty_vram) {
-        xfree(d->dirty_vram->sl1ma);
-        xfree(d->dirty_vram->dirty_bitmap);
-        xfree(d->dirty_vram);
-        d->dirty_vram = NULL;
+    if (d->arch.hvm_domain.dirty_vram) {
+        xfree(d->arch.hvm_domain.dirty_vram->sl1ma);
+        xfree(d->arch.hvm_domain.dirty_vram->dirty_bitmap);
+        xfree(d->arch.hvm_domain.dirty_vram);
+        d->arch.hvm_domain.dirty_vram = NULL;
     }
 
     shadow_unlock(d);
@@ -3583,6 +3583,7 @@ int shadow_track_dirty_vram(struct domai
     int flush_tlb = 0;
     unsigned long i;
     p2m_type_t t;
+    struct sh_dirty_vram *dirty_vram = d->arch.hvm_domain.dirty_vram;
 
     if (end_pfn < begin_pfn
             || begin_pfn > d->arch.p2m->max_mapped_pfn
@@ -3591,16 +3592,16 @@ int shadow_track_dirty_vram(struct domai
 
     shadow_lock(d);
 
-    if ( d->dirty_vram && (!nr ||
-             ( begin_pfn != d->dirty_vram->begin_pfn
-            || end_pfn   != d->dirty_vram->end_pfn )) )
+    if ( dirty_vram && (!nr ||
+             ( begin_pfn != dirty_vram->begin_pfn
+            || end_pfn   != dirty_vram->end_pfn )) )
     {
         /* Different tracking, tear the previous down. */
-        gdprintk(XENLOG_INFO, "stopping tracking VRAM %lx - %lx\n", 
d->dirty_vram->begin_pfn, d->dirty_vram->end_pfn);
-        xfree(d->dirty_vram->sl1ma);
-        xfree(d->dirty_vram->dirty_bitmap);
-        xfree(d->dirty_vram);
-        d->dirty_vram = NULL;
+        gdprintk(XENLOG_INFO, "stopping tracking VRAM %lx - %lx\n", 
dirty_vram->begin_pfn, dirty_vram->end_pfn);
+        xfree(dirty_vram->sl1ma);
+        xfree(dirty_vram->dirty_bitmap);
+        xfree(dirty_vram);
+        dirty_vram = d->arch.hvm_domain.dirty_vram = NULL;
     }
 
     if ( !nr )
@@ -3611,7 +3612,7 @@ int shadow_track_dirty_vram(struct domai
 
     /* This should happen seldomly (Video mode change),
      * no need to be careful. */
-    if ( !d->dirty_vram )
+    if ( !dirty_vram )
     {
         /* Just recount from start. */
         for ( i = begin_pfn; i < end_pfn; i++ ) {
@@ -3623,29 +3624,30 @@ int shadow_track_dirty_vram(struct domai
         gdprintk(XENLOG_INFO, "tracking VRAM %lx - %lx\n", begin_pfn, end_pfn);
 
         rc = -ENOMEM;
-        if ( (d->dirty_vram = xmalloc(struct sh_dirty_vram)) == NULL )
+        if ( (dirty_vram = xmalloc(struct sh_dirty_vram)) == NULL )
             goto out;
-        d->dirty_vram->begin_pfn = begin_pfn;
-        d->dirty_vram->end_pfn = end_pfn;
-
-        if ( (d->dirty_vram->sl1ma = xmalloc_array(paddr_t, nr)) == NULL )
+        dirty_vram->begin_pfn = begin_pfn;
+        dirty_vram->end_pfn = end_pfn;
+        d->arch.hvm_domain.dirty_vram = dirty_vram;
+
+        if ( (dirty_vram->sl1ma = xmalloc_array(paddr_t, nr)) == NULL )
             goto out_dirty_vram;
-        memset(d->dirty_vram->sl1ma, ~0, sizeof(paddr_t) * nr);
-
-        if ( (d->dirty_vram->dirty_bitmap = xmalloc_array(uint8_t, 
dirty_size)) == NULL )
+        memset(dirty_vram->sl1ma, ~0, sizeof(paddr_t) * nr);
+
+        if ( (dirty_vram->dirty_bitmap = xmalloc_array(uint8_t, dirty_size)) 
== NULL )
             goto out_sl1ma;
-        memset(d->dirty_vram->dirty_bitmap, 0, dirty_size);
-
-        d->dirty_vram->last_dirty = NOW();
+        memset(dirty_vram->dirty_bitmap, 0, dirty_size);
+
+        dirty_vram->last_dirty = NOW();
 
         /* Tell the caller that this time we could not track dirty bits. */
         rc = -ENODATA;
     }
-    else if (d->dirty_vram->last_dirty == -1)
+    else if (dirty_vram->last_dirty == -1)
     {
         /* still completely clean, just copy our empty bitmap */
         rc = -EFAULT;
-        if ( copy_to_guest(dirty_bitmap, d->dirty_vram->dirty_bitmap, 
dirty_size) == 0 )
+        if ( copy_to_guest(dirty_bitmap, dirty_vram->dirty_bitmap, dirty_size) 
== 0 )
             rc = 0;
     }
     else
@@ -3660,7 +3662,7 @@ int shadow_track_dirty_vram(struct domai
             mfn_t mfn = gfn_to_mfn(d, begin_pfn + i, &t);
             struct page_info *page;
             int dirty = 0;
-            paddr_t sl1ma = d->dirty_vram->sl1ma[i];
+            paddr_t sl1ma = dirty_vram->sl1ma[i];
 
             if (mfn_x(mfn) == INVALID_MFN)
             {
@@ -3724,8 +3726,8 @@ int shadow_track_dirty_vram(struct domai
 
             if ( dirty )
             {
-                d->dirty_vram->dirty_bitmap[i / 8] |= 1 << (i % 8);
-                d->dirty_vram->last_dirty = NOW();
+                dirty_vram->dirty_bitmap[i / 8] |= 1 << (i % 8);
+                dirty_vram->last_dirty = NOW();
             }
         }
 
@@ -3735,9 +3737,9 @@ int shadow_track_dirty_vram(struct domai
 #endif
 
         rc = -EFAULT;
-        if ( copy_to_guest(dirty_bitmap, d->dirty_vram->dirty_bitmap, 
dirty_size) == 0 ) {
-            memset(d->dirty_vram->dirty_bitmap, 0, dirty_size);
-            if (d->dirty_vram->last_dirty + SECONDS(2) < NOW())
+        if ( copy_to_guest(dirty_bitmap, dirty_vram->dirty_bitmap, dirty_size) 
== 0 ) {
+            memset(dirty_vram->dirty_bitmap, 0, dirty_size);
+            if (dirty_vram->last_dirty + SECONDS(2) < NOW())
             {
                 /* was clean for more than two seconds, try to disable guest
                  * write access */
@@ -3746,7 +3748,7 @@ int shadow_track_dirty_vram(struct domai
                     if (mfn_x(mfn) != INVALID_MFN)
                         flush_tlb |= sh_remove_write_access(d->vcpu[0], mfn, 
1, 0);
                 }
-                d->dirty_vram->last_dirty = -1;
+                dirty_vram->last_dirty = -1;
             }
             rc = 0;
         }
@@ -3756,10 +3758,10 @@ int shadow_track_dirty_vram(struct domai
     goto out;
 
 out_sl1ma:
-    xfree(d->dirty_vram->sl1ma);
+    xfree(dirty_vram->sl1ma);
 out_dirty_vram:
-    xfree(d->dirty_vram);
-    d->dirty_vram = NULL;
+    xfree(dirty_vram);
+    dirty_vram = d->arch.hvm_domain.dirty_vram = NULL;
 
 out:
     shadow_unlock(d);
diff -r 6eff3fe96aff -r 8dd5c3cae086 xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c    Fri Jun 05 09:32:03 2009 +0100
+++ b/xen/arch/x86/mm/shadow/multi.c    Fri Jun 05 14:04:03 2009 +0100
@@ -475,6 +475,7 @@ _sh_propagate(struct vcpu *v,
     guest_l1e_t guest_entry = { guest_intpte };
     shadow_l1e_t *sp = shadow_entry_ptr;
     struct domain *d = v->domain;
+    struct sh_dirty_vram *dirty_vram = d->arch.hvm_domain.dirty_vram;
     gfn_t target_gfn = guest_l1e_get_gfn(guest_entry);
     u32 pass_thru_flags;
     u32 gflags, sflags;
@@ -615,13 +616,13 @@ _sh_propagate(struct vcpu *v,
         }
     }
 
-    if ( unlikely((level == 1) && d->dirty_vram
-            && d->dirty_vram->last_dirty == -1
-            && gfn_x(target_gfn) >= d->dirty_vram->begin_pfn
-            && gfn_x(target_gfn) < d->dirty_vram->end_pfn) )
+    if ( unlikely((level == 1) && dirty_vram
+            && dirty_vram->last_dirty == -1
+            && gfn_x(target_gfn) >= dirty_vram->begin_pfn
+            && gfn_x(target_gfn) < dirty_vram->end_pfn) )
     {
         if ( ft & FETCH_TYPE_WRITE )
-            d->dirty_vram->last_dirty = NOW();
+            dirty_vram->last_dirty = NOW();
         else
             sflags &= ~_PAGE_RW;
     }
@@ -1042,22 +1043,23 @@ static inline void shadow_vram_get_l1e(s
     mfn_t mfn = shadow_l1e_get_mfn(new_sl1e);
     int flags = shadow_l1e_get_flags(new_sl1e);
     unsigned long gfn;
-
-    if ( !d->dirty_vram         /* tracking disabled? */
+    struct sh_dirty_vram *dirty_vram = d->arch.hvm_domain.dirty_vram;
+
+    if ( !dirty_vram         /* tracking disabled? */
          || !(flags & _PAGE_RW) /* read-only mapping? */
          || !mfn_valid(mfn) )   /* mfn can be invalid in mmio_direct */
         return;
 
     gfn = mfn_to_gfn(d, mfn);
 
-    if ( (gfn >= d->dirty_vram->begin_pfn) && (gfn < d->dirty_vram->end_pfn) )
-    {
-        unsigned long i = gfn - d->dirty_vram->begin_pfn;
+    if ( (gfn >= dirty_vram->begin_pfn) && (gfn < dirty_vram->end_pfn) )
+    {
+        unsigned long i = gfn - dirty_vram->begin_pfn;
         struct page_info *page = mfn_to_page(mfn);
         
         if ( (page->u.inuse.type_info & PGT_count_mask) == 1 )
             /* Initial guest reference, record it */
-            d->dirty_vram->sl1ma[i] = pfn_to_paddr(mfn_x(sl1mfn))
+            dirty_vram->sl1ma[i] = pfn_to_paddr(mfn_x(sl1mfn))
                 | ((unsigned long)sl1e & ~PAGE_MASK);
     }
 }
@@ -1070,17 +1072,18 @@ static inline void shadow_vram_put_l1e(s
     mfn_t mfn = shadow_l1e_get_mfn(old_sl1e);
     int flags = shadow_l1e_get_flags(old_sl1e);
     unsigned long gfn;
-
-    if ( !d->dirty_vram         /* tracking disabled? */
+    struct sh_dirty_vram *dirty_vram = d->arch.hvm_domain.dirty_vram;
+
+    if ( !dirty_vram         /* tracking disabled? */
          || !(flags & _PAGE_RW) /* read-only mapping? */
          || !mfn_valid(mfn) )   /* mfn can be invalid in mmio_direct */
         return;
 
     gfn = mfn_to_gfn(d, mfn);
 
-    if ( (gfn >= d->dirty_vram->begin_pfn) && (gfn < d->dirty_vram->end_pfn) )
-    {
-        unsigned long i = gfn - d->dirty_vram->begin_pfn;
+    if ( (gfn >= dirty_vram->begin_pfn) && (gfn < dirty_vram->end_pfn) )
+    {
+        unsigned long i = gfn - dirty_vram->begin_pfn;
         struct page_info *page = mfn_to_page(mfn);
         int dirty = 0;
         paddr_t sl1ma = pfn_to_paddr(mfn_x(sl1mfn))
@@ -1089,14 +1092,14 @@ static inline void shadow_vram_put_l1e(s
         if ( (page->u.inuse.type_info & PGT_count_mask) == 1 )
         {
             /* Last reference */
-            if ( d->dirty_vram->sl1ma[i] == INVALID_PADDR ) {
+            if ( dirty_vram->sl1ma[i] == INVALID_PADDR ) {
                 /* We didn't know it was that one, let's say it is dirty */
                 dirty = 1;
             }
             else
             {
-                ASSERT(d->dirty_vram->sl1ma[i] == sl1ma);
-                d->dirty_vram->sl1ma[i] = INVALID_PADDR;
+                ASSERT(dirty_vram->sl1ma[i] == sl1ma);
+                dirty_vram->sl1ma[i] = INVALID_PADDR;
                 if ( flags & _PAGE_DIRTY )
                     dirty = 1;
             }
@@ -1106,10 +1109,10 @@ static inline void shadow_vram_put_l1e(s
             /* We had more than one reference, just consider the page dirty. */
             dirty = 1;
             /* Check that it's not the one we recorded. */
-            if ( d->dirty_vram->sl1ma[i] == sl1ma )
+            if ( dirty_vram->sl1ma[i] == sl1ma )
             {
                 /* Too bad, we remembered the wrong one... */
-                d->dirty_vram->sl1ma[i] = INVALID_PADDR;
+                dirty_vram->sl1ma[i] = INVALID_PADDR;
             }
             else
             {
@@ -1119,8 +1122,8 @@ static inline void shadow_vram_put_l1e(s
         }
         if ( dirty )
         {
-            d->dirty_vram->dirty_bitmap[i / 8] |= 1 << (i % 8);
-            d->dirty_vram->last_dirty = NOW();
+            dirty_vram->dirty_bitmap[i / 8] |= 1 << (i % 8);
+            dirty_vram->last_dirty = NOW();
         }
     }
 }
diff -r 6eff3fe96aff -r 8dd5c3cae086 xen/include/asm-x86/hvm/domain.h
--- a/xen/include/asm-x86/hvm/domain.h  Fri Jun 05 09:32:03 2009 +0100
+++ b/xen/include/asm-x86/hvm/domain.h  Fri Jun 05 14:04:03 2009 +0100
@@ -66,6 +66,9 @@ struct hvm_domain {
     /* Memory ranges with pinned cache attributes. */
     struct list_head       pinned_cacheattr_ranges;
 
+    /* VRAM dirty support. */
+    struct sh_dirty_vram *dirty_vram;
+
     /* If one of vcpus of this domain is in no_fill_mode or
      * mtrr/pat between vcpus is not the same, set is_in_uc_mode
      */
diff -r 6eff3fe96aff -r 8dd5c3cae086 xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Fri Jun 05 09:32:03 2009 +0100
+++ b/xen/include/xen/sched.h   Fri Jun 05 14:04:03 2009 +0100
@@ -268,9 +268,6 @@ struct domain
      */
     spinlock_t hypercall_deadlock_mutex;
 
-    /* VRAM dirty support. */
-    struct sh_dirty_vram *dirty_vram;
-
     /* transcendent memory, auto-allocated on first tmem op by each domain */
     void *tmem;
 };

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.