WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [SHADOW] Clean up the DOM0_SHADOW_OP inte

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [SHADOW] Clean up the DOM0_SHADOW_OP interface.
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 23 Aug 2006 12:20:14 +0000
Delivery-date: Wed, 23 Aug 2006 05:21:09 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Node ID 0ea9a824c16c2a99fd803bcdc28f165c9de4b072
# Parent  92066b3fcd86457df3920d021f8b7f07322a46e3
[SHADOW] Clean up the DOM0_SHADOW_OP interface.
Also bump the dom0 interface version for tools (but
not for dom0 kernel!).
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 tools/libxc/xc_hvm_build.c        |   11 ++--
 tools/libxc/xc_linux_save.c       |    6 --
 tools/python/xen/lowlevel/xc/xc.c |    4 -
 xen/arch/ia64/xen/domain.c        |    5 --
 xen/arch/x86/shadow2-common.c     |   42 ++++++++---------
 xen/common/dom0_ops.c             |    3 -
 xen/include/asm-x86/shadow2.h     |   10 ++--
 xen/include/public/dom0_ops.h     |   89 ++++++++++++++++++++++++++------------
 8 files changed, 99 insertions(+), 71 deletions(-)

diff -r 92066b3fcd86 -r 0ea9a824c16c tools/libxc/xc_hvm_build.c
--- a/tools/libxc/xc_hvm_build.c        Tue Aug 22 18:48:00 2006 +0100
+++ b/tools/libxc/xc_hvm_build.c        Tue Aug 22 18:50:01 2006 +0100
@@ -442,13 +442,12 @@ static int xc_hvm_build_internal(int xc_
     }
 
     /* HVM domains must be put into shadow2 mode at the start of day */
-    if ( xc_shadow_control(xc_handle, domid, DOM0_SHADOW2_CONTROL_OP_ENABLE,
+    if ( xc_shadow_control(xc_handle, domid, DOM0_SHADOW_CONTROL_OP_ENABLE,
                            NULL, 0, NULL, 
-                           DOM0_SHADOW2_CONTROL_FLAG_ENABLE 
-                           | DOM0_SHADOW2_CONTROL_FLAG_REFCOUNT
-                           | DOM0_SHADOW2_CONTROL_FLAG_TRANSLATE
-                           | DOM0_SHADOW2_CONTROL_FLAG_EXTERNAL, 
-                           NULL) ) 
+                           DOM0_SHADOW_ENABLE_REFCOUNT  |
+                           DOM0_SHADOW_ENABLE_TRANSLATE |
+                           DOM0_SHADOW_ENABLE_EXTERNAL, 
+                           NULL) )
     {
         PERROR("Could not enable shadow paging for domain.\n");
         goto error_out;
diff -r 92066b3fcd86 -r 0ea9a824c16c tools/libxc/xc_linux_save.c
--- a/tools/libxc/xc_linux_save.c       Tue Aug 22 18:48:00 2006 +0100
+++ b/tools/libxc/xc_linux_save.c       Tue Aug 22 18:50:01 2006 +0100
@@ -346,11 +346,9 @@ static int analysis_phase(int xc_handle,
             xc_shadow_control(xc_handle, domid, DOM0_SHADOW_CONTROL_OP_PEEK,
                               NULL, 0, NULL, 0, &stats);
 
-            DPRINTF("now= %lld faults= %" PRId32 " dirty= %" PRId32
-                    " dirty_net= %" PRId32 " dirty_block= %" PRId32"\n",
+            DPRINTF("now= %lld faults= %"PRId32" dirty= %"PRId32"\n",
                     ((now-start)+500)/1000,
-                    stats.fault_count, stats.dirty_count,
-                    stats.dirty_net_count, stats.dirty_block_count);
+                    stats.fault_count, stats.dirty_count);
         }
     }
 
diff -r 92066b3fcd86 -r 0ea9a824c16c tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Tue Aug 22 18:48:00 2006 +0100
+++ b/tools/python/xen/lowlevel/xc/xc.c Tue Aug 22 18:50:01 2006 +0100
@@ -709,11 +709,11 @@ static PyObject *pyxc_shadow_mem_control
         return NULL;
     
     if ( mbarg < 0 ) 
-        op = DOM0_SHADOW2_CONTROL_OP_GET_ALLOCATION;
+        op = DOM0_SHADOW_CONTROL_OP_GET_ALLOCATION;
     else 
     {
         mb = mbarg;
-        op = DOM0_SHADOW2_CONTROL_OP_SET_ALLOCATION;
+        op = DOM0_SHADOW_CONTROL_OP_SET_ALLOCATION;
     }
     if ( xc_shadow_control(xc->xc_handle, dom, op, NULL, 0, &mb, 0, NULL) < 0 )
         return PyErr_SetFromErrno(xc_error);
diff -r 92066b3fcd86 -r 0ea9a824c16c xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c        Tue Aug 22 18:48:00 2006 +0100
+++ b/xen/arch/ia64/xen/domain.c        Tue Aug 22 18:50:01 2006 +0100
@@ -653,11 +653,6 @@ int shadow_mode_control(struct domain *d
                }
                break;
 
-       case DOM0_SHADOW_CONTROL_OP_FLUSH:
-               atomic64_set(&d->arch.shadow_fault_count, 0);
-               atomic64_set(&d->arch.shadow_dirty_count, 0);
-               break;
-   
        case DOM0_SHADOW_CONTROL_OP_CLEAN:
          {
                int nbr_longs;
diff -r 92066b3fcd86 -r 0ea9a824c16c xen/arch/x86/shadow2-common.c
--- a/xen/arch/x86/shadow2-common.c     Tue Aug 22 18:48:00 2006 +0100
+++ b/xen/arch/x86/shadow2-common.c     Tue Aug 22 18:50:01 2006 +0100
@@ -2481,14 +2481,15 @@ static int shadow2_enable(struct domain 
     unsigned int old_pages;
     int rv = 0;
 
+    mode |= SHM2_enable;
+
     domain_pause(d);
     shadow2_lock(d);
 
     /* Sanity check the arguments */
-    if ( d == current->domain 
-         || shadow2_mode_enabled(d)
-         || !(mode & SHM2_enable)
-         || ((mode & SHM2_external) && !(mode & SHM2_translate)) )
+    if ( (d == current->domain) ||
+         shadow2_mode_enabled(d) ||
+         ((mode & SHM2_external) && !(mode & SHM2_translate)) )
     {
         rv = -EINVAL;
         goto out;
@@ -2957,11 +2958,7 @@ static int shadow2_log_dirty_op(struct d
     domain_pause(d);
     shadow2_lock(d);
 
-    if ( sc->op == DOM0_SHADOW_CONTROL_OP_CLEAN
-         || sc->op == DOM0_SHADOW_CONTROL_OP_FLUSH ) 
-        clean = 1;
-    else 
-        ASSERT(sc->op == DOM0_SHADOW_CONTROL_OP_PEEK); 
+    clean = (sc->op == DOM0_SHADOW_CONTROL_OP_CLEAN);
 
     SHADOW2_DEBUG(LOGDIRTY, "log-dirty %s: dom %u faults=%u dirty=%u\n", 
                   (clean) ? "clean" : "peek",
@@ -3111,25 +3108,27 @@ int shadow2_control_op(struct domain *d,
 
     case DOM0_SHADOW_CONTROL_OP_ENABLE_TEST:
         return shadow2_test_enable(d);
-        
+
     case DOM0_SHADOW_CONTROL_OP_ENABLE_LOGDIRTY:
         return shadow2_log_dirty_enable(d);
-        
-    case DOM0_SHADOW_CONTROL_OP_FLUSH:
+
+    case DOM0_SHADOW_CONTROL_OP_ENABLE_TRANSLATE:
+        return shadow2_enable(d, SHM2_refcounts|SHM2_translate);
+
     case DOM0_SHADOW_CONTROL_OP_CLEAN:
     case DOM0_SHADOW_CONTROL_OP_PEEK:
         return shadow2_log_dirty_op(d, sc);
 
-
-
-    case DOM0_SHADOW2_CONTROL_OP_ENABLE:
-        return shadow2_enable(d, sc->mode << SHM2_shift);        
-
-    case DOM0_SHADOW2_CONTROL_OP_GET_ALLOCATION:
+    case DOM0_SHADOW_CONTROL_OP_ENABLE:
+        if ( sc->mode & DOM0_SHADOW_ENABLE_LOG_DIRTY )
+            return shadow2_log_dirty_enable(d);
+        return shadow2_enable(d, sc->mode << SHM2_shift);
+
+    case DOM0_SHADOW_CONTROL_OP_GET_ALLOCATION:
         sc->mb = shadow2_get_allocation(d);
         return 0;
-        
-    case DOM0_SHADOW2_CONTROL_OP_SET_ALLOCATION:
+
+    case DOM0_SHADOW_CONTROL_OP_SET_ALLOCATION:
         rc = shadow2_set_allocation(d, sc->mb, &preempted);
         if ( preempted )
             /* Not finished.  Set up to re-run the call. */
@@ -3139,8 +3138,7 @@ int shadow2_control_op(struct domain *d,
             /* Finished.  Return the new allocation */
             sc->mb = shadow2_get_allocation(d);
         return rc;
-        
-        
+
     default:
         SHADOW2_ERROR("Bad shadow op %u\n", sc->op);
         return -EINVAL;
diff -r 92066b3fcd86 -r 0ea9a824c16c xen/common/dom0_ops.c
--- a/xen/common/dom0_ops.c     Tue Aug 22 18:48:00 2006 +0100
+++ b/xen/common/dom0_ops.c     Tue Aug 22 18:50:01 2006 +0100
@@ -141,7 +141,8 @@ long do_dom0_op(XEN_GUEST_HANDLE(dom0_op
     if ( copy_from_guest(op, u_dom0_op, 1) )
         return -EFAULT;
 
-    if ( op->interface_version != DOM0_INTERFACE_VERSION )
+    if ( (op->interface_version != DOM0_TOOLS_INTERFACE_VERSION) &&
+         (op->interface_version != DOM0_KERNEL_INTERFACE_VERSION) )
         return -EACCES;
 
     if ( acm_pre_dom0_op(op, &ssid) )
diff -r 92066b3fcd86 -r 0ea9a824c16c xen/include/asm-x86/shadow2.h
--- a/xen/include/asm-x86/shadow2.h     Tue Aug 22 18:48:00 2006 +0100
+++ b/xen/include/asm-x86/shadow2.h     Tue Aug 22 18:50:01 2006 +0100
@@ -32,16 +32,16 @@
 
 #define SHM2_shift 10
 /* We're in one of the shadow modes */
-#define SHM2_enable    (DOM0_SHADOW2_CONTROL_FLAG_ENABLE << SHM2_shift)
+#define SHM2_enable    (1U << SHM2_shift)
 /* Refcounts based on shadow tables instead of guest tables */
-#define SHM2_refcounts (DOM0_SHADOW2_CONTROL_FLAG_REFCOUNT << SHM2_shift)
+#define SHM2_refcounts (DOM0_SHADOW_ENABLE_REFCOUNT << SHM2_shift)
 /* Enable log dirty mode */
-#define SHM2_log_dirty (DOM0_SHADOW2_CONTROL_FLAG_LOG_DIRTY << SHM2_shift)
+#define SHM2_log_dirty (DOM0_SHADOW_ENABLE_LOG_DIRTY << SHM2_shift)
 /* Xen does p2m translation, not guest */
-#define SHM2_translate (DOM0_SHADOW2_CONTROL_FLAG_TRANSLATE << SHM2_shift)
+#define SHM2_translate (DOM0_SHADOW_ENABLE_TRANSLATE << SHM2_shift)
 /* Xen does not steal address space from the domain for its own booking;
  * requires VT or similar mechanisms */
-#define SHM2_external  (DOM0_SHADOW2_CONTROL_FLAG_EXTERNAL << SHM2_shift)
+#define SHM2_external  (DOM0_SHADOW_ENABLE_EXTERNAL << SHM2_shift)
 
 #define shadow2_mode_enabled(_d)   ((_d)->arch.shadow2.mode)
 #define shadow2_mode_refcounts(_d) ((_d)->arch.shadow2.mode & SHM2_refcounts)
diff -r 92066b3fcd86 -r 0ea9a824c16c xen/include/public/dom0_ops.h
--- a/xen/include/public/dom0_ops.h     Tue Aug 22 18:48:00 2006 +0100
+++ b/xen/include/public/dom0_ops.h     Tue Aug 22 18:50:01 2006 +0100
@@ -18,8 +18,19 @@
  * Make sure you increment the interface version whenever you modify this file!
  * This makes sure that old versions of dom0 tools will stop working in a
  * well-defined way (rather than crashing the machine, for instance).
- */
-#define DOM0_INTERFACE_VERSION   0x03000001
+ * 
+ * Separate kernel from tools as the kernel uses a small subset of the dom0
+ * operations and so it is unnecessary to break backward compatibility so
+ * often.
+ */
+#define DOM0_TOOLS_INTERFACE_VERSION  0x13000001
+#define DOM0_KERNEL_INTERFACE_VERSION 0x03000001
+
+#ifdef __XEN_TOOLS__
+#define DOM0_INTERFACE_VERSION DOM0_TOOLS_INTERFACE_VERSION
+#else
+#define DOM0_INTERFACE_VERSION DOM0_KERNEL_INTERFACE_VERSION
+#endif
 
 /************************************************************************/
 
@@ -253,32 +264,54 @@ DEFINE_XEN_GUEST_HANDLE(dom0_sched_id_t)
  */
 #define DOM0_SHADOW_CONTROL  25
 
+/* Disable shadow mode. */
 #define DOM0_SHADOW_CONTROL_OP_OFF         0
-#define DOM0_SHADOW_CONTROL_OP_ENABLE_TEST 1
-#define DOM0_SHADOW_CONTROL_OP_ENABLE_LOGDIRTY 2
-#define DOM0_SHADOW_CONTROL_OP_ENABLE_TRANSLATE 3
-
-#define DOM0_SHADOW_CONTROL_OP_FLUSH       10     /* table ops */
+
+/* Enable shadow mode (mode contains ORed DOM0_SHADOW_ENABLE_* flags). */
+#define DOM0_SHADOW_CONTROL_OP_ENABLE      32
+
+/* Log-dirty bitmap operations. */
+ /* Return the bitmap and clean internal copy for next round. */
 #define DOM0_SHADOW_CONTROL_OP_CLEAN       11
+ /* Return the bitmap but do not modify internal copy. */
 #define DOM0_SHADOW_CONTROL_OP_PEEK        12
 
-/* Shadow2 operations */
-#define DOM0_SHADOW2_CONTROL_OP_GET_ALLOCATION   30
-#define DOM0_SHADOW2_CONTROL_OP_SET_ALLOCATION   31
-#define DOM0_SHADOW2_CONTROL_OP_ENABLE           32
-
-/* Mode flags for Shadow2 enable op */
-#define DOM0_SHADOW2_CONTROL_FLAG_ENABLE    (1 << 0)
-#define DOM0_SHADOW2_CONTROL_FLAG_REFCOUNT  (1 << 1)
-#define DOM0_SHADOW2_CONTROL_FLAG_LOG_DIRTY (1 << 2)
-#define DOM0_SHADOW2_CONTROL_FLAG_TRANSLATE (1 << 3)
-#define DOM0_SHADOW2_CONTROL_FLAG_EXTERNAL  (1 << 4)
+/* Memory allocation accessors. */
+#define DOM0_SHADOW_CONTROL_OP_GET_ALLOCATION   30
+#define DOM0_SHADOW_CONTROL_OP_SET_ALLOCATION   31
+
+/* Legacy enable operations. */
+ /* Equiv. to ENABLE with no mode flags. */
+#define DOM0_SHADOW_CONTROL_OP_ENABLE_TEST       1
+ /* Equiv. to ENABLE with mode flag ENABLE_LOG_DIRTY. */
+#define DOM0_SHADOW_CONTROL_OP_ENABLE_LOGDIRTY   2
+ /* Equiv. to ENABLE with mode flags ENABLE_REFCOUNT and ENABLE_TRANSLATE. */
+#define DOM0_SHADOW_CONTROL_OP_ENABLE_TRANSLATE  3
+
+/* Mode flags for DOM0_SHADOW_CONTROL_OP_ENABLE. */
+ /*
+  * Shadow pagetables are refcounted: guest does not use explicit mmu
+  * operations nor write-protect its pagetables.
+  */
+#define DOM0_SHADOW_ENABLE_REFCOUNT  (1 << 1)
+ /*
+  * Log pages in a bitmap as they are dirtied.
+  * Used for live relocation to determine which pages must be re-sent.
+  */
+#define DOM0_SHADOW_ENABLE_LOG_DIRTY (1 << 2)
+ /*
+  * Automatically translate GPFNs into MFNs.
+  */
+#define DOM0_SHADOW_ENABLE_TRANSLATE (1 << 3)
+ /*
+  * Xen does not steal virtual address space from the guest.
+  * Requires HVM support.
+  */
+#define DOM0_SHADOW_ENABLE_EXTERNAL  (1 << 4)
 
 struct dom0_shadow_control_stats {
     uint32_t fault_count;
     uint32_t dirty_count;
-    uint32_t dirty_net_count;
-    uint32_t dirty_block_count;
 };
 typedef struct dom0_shadow_control_stats dom0_shadow_control_stats_t;
 DEFINE_XEN_GUEST_HANDLE(dom0_shadow_control_stats_t);
@@ -286,13 +319,17 @@ struct dom0_shadow_control {
 struct dom0_shadow_control {
     /* IN variables. */
     domid_t        domain;
-    uint32_t       op;
+    uint32_t       op;       /* DOM0_SHADOW_CONTROL_OP_* */
+
+    /* OP_ENABLE */
+    uint32_t       mode;     /* DOM0_SHADOW_ENABLE_* */
+
+    /* OP_GET_ALLOCATION / OP_SET_ALLOCATION */
+    uint32_t       mb;       /* Shadow memory allocation in MB */
+
+    /* OP_PEEK / OP_CLEAN */
     XEN_GUEST_HANDLE(ulong) dirty_bitmap;
-    /* IN/OUT variables. */
-    uint64_t       pages;    /* size of buffer, updated with actual size */
-    uint32_t       mb;       /* Shadow2 memory allocation in MB */
-    uint32_t       mode;     /* Shadow2 mode to enable */
-    /* OUT variables. */
+    uint64_t       pages;    /* Size of buffer. Updated with actual size. */
     struct dom0_shadow_control_stats stats;
 };
 typedef struct dom0_shadow_control dom0_shadow_control_t;

_______________________________________________
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] [SHADOW] Clean up the DOM0_SHADOW_OP interface., Xen patchbot-unstable <=