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

[Xen-changelog] Get the network interface working in shadow translate mode. This



# HG changeset patch
# User sos22@xxxxxxxxxxxxxxxxxxxx
# Node ID 1580009f137c2d90a3de05c06d677dfbdd65e4bd
# Parent  cc9bb3e0e348e6484d6fa2bc43b4900c6a40da79
Get the network interface working in shadow translate mode.  This
required a few extra __gpfn_to_mfn translations, and also required a
minor change in the grant tables interface: if we're in shadow
translate mode, then shared->frame is supposed to be the pfn you want
to map the new mfn to when accepting a grant transfer, and Xen handles
updating the M2P and P2M tables for you.

Signed-off-by: Steven Smith, sos22@xxxxxxxxx

diff -r cc9bb3e0e348 -r 1580009f137c xen/common/grant_table.c
--- a/xen/common/grant_table.c  Wed Jan 25 17:57:44 2006
+++ b/xen/common/grant_table.c  Thu Jan 26 13:33:20 2006
@@ -711,6 +711,7 @@
     int i;
     grant_entry_t *sha;
     gnttab_transfer_t gop;
+    unsigned long real_mfn;
 
     for ( i = 0; i < count; i++ )
     {
@@ -731,7 +732,8 @@
             continue;
         }
 
-        page = pfn_to_page(gop.mfn);
+        real_mfn = __gpfn_to_mfn(d, gop.mfn);
+        page = pfn_to_page(real_mfn);
         if ( unlikely(IS_XEN_HEAP_FRAME(page)) )
         { 
             DPRINTK("gnttab_transfer: xen frame %lx\n",
@@ -792,7 +794,21 @@
 
         /* Tell the guest about its new page frame. */
         sha = &e->grant_table->shared[gop.ref];
-        sha->frame = gop.mfn;
+        if (shadow_mode_translate(e)) {
+            struct domain_mmap_cache c1, c2;
+            unsigned long pfn = sha->frame;
+            domain_mmap_cache_init(&c1);
+            domain_mmap_cache_init(&c2);
+            shadow_lock(e);
+            shadow_sync_and_drop_references(e, page);
+            set_p2m_entry(e, pfn, real_mfn, &c1, &c2);
+            set_pfn_from_mfn(real_mfn, pfn);
+            shadow_unlock(e);
+            domain_mmap_cache_destroy(&c1);
+            domain_mmap_cache_destroy(&c2);
+        } else {
+            sha->frame = real_mfn;
+        }
         wmb();
         sha->flags |= GTF_transfer_completed;
 
diff -r cc9bb3e0e348 -r 1580009f137c xen/common/memory.c
--- a/xen/common/memory.c       Wed Jan 25 17:57:44 2006
+++ b/xen/common/memory.c       Thu Jan 26 13:33:20 2006
@@ -76,7 +76,7 @@
     int           *preempted)
 {
     struct pfn_info *page;
-    unsigned long    i, j, mpfn;
+    unsigned long    i, j, mpfn, mfn;
 
     if ( !array_access_ok(extent_list, nr_extents, sizeof(*extent_list)) )
         return 0;
@@ -94,14 +94,15 @@
 
         for ( j = 0; j < (1 << extent_order); j++ )
         {
-            if ( unlikely((mpfn + j) >= max_page) )
+            mfn = __gpfn_to_mfn(d, mpfn + j);
+            if ( unlikely(mfn >= max_page) )
             {
                 DPRINTK("Domain %u page number out of range (%lx >= %lx)\n", 
-                        d->domain_id, mpfn + j, max_page);
+                        d->domain_id, mfn, max_page);
                 return i;
             }
             
-            page = pfn_to_page(mpfn + j);
+            page = pfn_to_page(mfn);
             if ( unlikely(!get_page(page, d)) )
             {
                 DPRINTK("Bad page free for domain %u\n", d->domain_id);

_______________________________________________
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®.