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

Re: [Xen-devel] [PATCH] Paging and memory sharing for HVM guests



>>> Grzegorz Milos <gm281@xxxxxxxxx> 17.12.09 00:14 >>>
>--- a/xen/include/public/domctl.h      Tue Dec 15 10:47:36 2009 -0800
>+++ b/xen/include/public/domctl.h      Tue Dec 15 10:47:42 2009 -0800
>@@ -691,6 +691,31 @@
> 
> };
> 
>+/*
>+ * Memory event operations
>+ */
>+
>+#define XEN_DOMCTL_mem_event_op  56
>+
>+/* Add and remove memory handlers */
>+#define XEN_DOMCTL_MEM_EVENT_OP_ENABLE     0
>+#define XEN_DOMCTL_MEM_EVENT_OP_DISABLE    1
>+
>+struct xen_domctl_mem_event_op {
>+    uint32_t       op;           /* XEN_DOMCTL_MEM_EVENT_OP_* */
>+    uint32_t       mode;         /* XEN_DOMCTL_MEM_EVENT_ENABLE_* */
>+
>+    /* OP_ENABLE */
>+    unsigned long  shared_addr;  /* IN:  Virtual address of shared page */
>+    unsigned long  ring_addr;    /* IN:  Virtual address of ring page */
>+
>+    /* Other OPs */
>+    unsigned long  gfn;          /* IN:  gfn of page being operated on */
>+};
>+typedef struct xen_domctl_mem_event_op xen_domctl_mem_event_op_t;
>+DEFINE_XEN_GUEST_HANDLE(xen_domctl_mem_event_op_t);
>+
>+
> struct xen_domctl {
>     uint32_t cmd;
>     uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */

The use of (unsigned) long in domctl.h and sysctl.h is invalid, as it breaks
32-bit dom0 on 64-bit hv.

>--- a/xen/include/public/domctl.h      Tue Dec 15 13:05:35 2009 -0800
>+++ b/xen/include/public/domctl.h      Tue Dec 15 13:05:38 2009 -0800
>...
>@@ -103,6 +104,7 @@
>     uint32_t flags;              /* XEN_DOMINF_* */
>     uint64_aligned_t tot_pages;
>     uint64_aligned_t max_pages;
>+    uint64_aligned_t shr_pages;
>     uint64_aligned_t shared_info_frame; /* GMFN of shared_info struct */
>     uint64_aligned_t cpu_time;
>     uint32_t nr_online_vcpus;    /* Number of VCPUs currently online. */

This change is not valid without changing XEN_DOMCTL_INTERFACE_VERSION,
since tools outside the Xen tree (namely, libvirt, which is currently broken
because of this) rely on knowing all (valid) (version, structure-layout) pairs.

>@@ -727,6 +729,52 @@
> typedef struct xen_domctl_mem_event_op xen_domctl_mem_event_op_t;
> DEFINE_XEN_GUEST_HANDLE(xen_domctl_mem_event_op_t);
> 
>+/*
>+ * Memory sharing operations
>+ */
>+#define XEN_DOMCTL_mem_sharing_op  58
>+
>+#define XEN_DOMCTL_MEM_SHARING_OP_CONTROL        0
>+#define XEN_DOMCTL_MEM_SHARING_OP_NOMINATE_GFN   1
>+#define XEN_DOMCTL_MEM_SHARING_OP_NOMINATE_GREF  2
>+#define XEN_DOMCTL_MEM_SHARING_OP_SHARE          3
>+#define XEN_DOMCTL_MEM_SHARING_OP_RESUME         4
>+#define XEN_DOMCTL_MEM_SHARING_OP_DEBUG_GFN      5
>+#define XEN_DOMCTL_MEM_SHARING_OP_DEBUG_MFN      6
>+#define XEN_DOMCTL_MEM_SHARING_OP_DEBUG_GREF     7
>+
>+#define XEN_DOMCTL_MEM_SHARING_S_HANDLE_INVALID  (-10)
>+#define XEN_DOMCTL_MEM_SHARING_C_HANDLE_INVALID  (-9)
>+
>+struct xen_domctl_mem_sharing_op {
>+    uint8_t       op;            /* XEN_DOMCTL_MEM_EVENT_OP_* */
>+
>+    union {
>+        int enable;                       /* for OP_CONTROL            */
>+
>+        struct mem_sharing_op_nominate {  /* for OP_NOMINATE           */
>+            union {
>+                unsigned long gfn;        /* IN: gfn to nominate       */
>+                uint32_t      grant_ref;  /* IN: grant ref to nominate */
>+            };
>+            uint64_t       handle;        /* OUT: the handle           */
>+        } nominate;
>+        struct mem_sharing_op_share {
>+            uint64_t source_handle;       /* IN: handle to the source page */
>+            uint64_t client_handle;       /* IN: handle to the client page */
>+        } share; 
>+        struct mem_sharing_op_debug {
>+            union {
>+                unsigned long  gfn;        /* IN: gfn to debug          */
>+                unsigned long  mfn;        /* IN: mfn to debug          */
>+                grant_ref_t    gref;       /* IN: gref to debug         */
>+            };
>+        } debug;
>+    };
>+};
>+typedef struct xen_domctl_mem_sharing_op xen_domctl_mem_sharing_op_t;
>+DEFINE_XEN_GUEST_HANDLE(xen_domctl_mem_sharing_op_t);
>+
> 
> struct xen_domctl {
>     uint32_t cmd;

Like above, using unsigned long here is invalid. Using int doesn't seem
to be too good an idea either, for portability reasons. I think fixed-size
integer types should be used everywhere.

Jan

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


 


Rackspace

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