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

[Xen-devel] RE: [Xen-changelog] [xen-unstable] Adds 'memory_sharing' option to domain config scripts. It passes domain id to


  • To: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>, Grzegorz Milos <Grzegorz.Milos@xxxxxxxxxx>
  • From: "Cui, Dexuan" <dexuan.cui@xxxxxxxxx>
  • Date: Tue, 5 Jan 2010 23:59:42 +0800
  • Accept-language: zh-CN, en-US
  • Acceptlanguage: zh-CN, en-US
  • Cc:
  • Delivery-date: Tue, 05 Jan 2010 08:00:18 -0800
  • List-id: Xen developer discussion <xen-devel.lists.xensource.com>
  • Thread-index: Acp+5GTB/4Aj0dgTSm6WX4GSErIP4APOm8Dw
  • Thread-topic: [Xen-changelog] [xen-unstable] Adds 'memory_sharing' option to domain config scripts. It passes domain id to

Hi, the changeset breaks guest creation in shadow mode:
In image.py, xc.dom_set_memshr(self.vm.getDomid(), self.memory_sharing) would 
fail because 
in pyxc_dom_set_memshr():
    if (xc_memshr_control(self->xc_handle, dom, enable) != 0)
        return pyxc_error_to_exception();
and in hypervisor's mem_sharing_domctl(), 
        case XEN_DOMCTL_MEM_SHARING_OP_CONTROL:
        {
            rc = 0;
            if(!hap_enabled(d))
                return -EINVAL;  ----> this would fail xc.dom_set_memshr() so 
"xm create" would fail like this:

# xm create test.hvm
Using config file "./test.hvm".
Error: (22, 'Invalid argument')           

Thanks,
-- Dexuan

-----Original Message-----
From: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx 
[mailto:xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf Of Xen 
patchbot-unstable
Sent: 2009年12月17日 14:42
To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] Adds 'memory_sharing' option to domain 
config scripts. It passes domain id to

# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1261031277 0
# Node ID 054042ba73b68711be62eb0a46f6af40858a37b2
# Parent  7d28228db41de5020b4bf7ee621ec79a6f2b86bc
Adds 'memory_sharing' option to domain config scripts. It passes domain id to
the tapdisk2 process if sharing is enabled (tapdisk2 is not normally aware what
domain it is working for).

Signed-off-by: Grzegorz Milos <Grzegorz.Milos@xxxxxxxxxx>
---
 tools/blktap2/drivers/tapdisk2.c                 |    7 +++++-
 tools/examples/xmexample.hvm                     |    4 +++
 tools/memshr/interface.c                         |   16 +++++++++++++++
 tools/memshr/memshr.h                            |    1 
 tools/python/xen/lowlevel/xc/xc.c                |   24 +++++++++++++++++++++++
 tools/python/xen/xend/XendConfig.py              |   14 ++++++++++++-
 tools/python/xen/xend/image.py                   |    3 ++
 tools/python/xen/xend/server/BlktapController.py |    5 +++-
 tools/python/xen/xm/create.py                    |    7 +++++-
 9 files changed, 77 insertions(+), 4 deletions(-)

diff -r 7d28228db41d -r 054042ba73b6 tools/blktap2/drivers/tapdisk2.c
--- a/tools/blktap2/drivers/tapdisk2.c  Thu Dec 17 06:27:56 2009 +0000
+++ b/tools/blktap2/drivers/tapdisk2.c  Thu Dec 17 06:27:57 2009 +0000
@@ -34,6 +34,7 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 #include <sys/ioctl.h>
+#include <memshr.h>
 
 #include "tapdisk.h"
 #include "blktap2.h"
@@ -411,13 +412,17 @@ main(int argc, char *argv[])
 
        params = NULL;
 
-       while ((c = getopt(argc, argv, "n:h")) != -1) {
+       while ((c = getopt(argc, argv, "n:s:h")) != -1) {
                switch (c) {
                case 'n':
                        params = optarg;
                        break;
                case 'h':
                        usage(argv[0], 0);
+            break;
+        case 's':
+            memshr_set_domid(atoi(optarg));
+            break;
                default:
                        usage(argv[0], EINVAL);
                }
diff -r 7d28228db41d -r 054042ba73b6 tools/examples/xmexample.hvm
--- a/tools/examples/xmexample.hvm      Thu Dec 17 06:27:56 2009 +0000
+++ b/tools/examples/xmexample.hvm      Thu Dec 17 06:27:57 2009 +0000
@@ -24,6 +24,10 @@ memory = 128
 # If not explicictly set, xend will pick an appropriate value.  
 # Should be at least 2KB per MB of domain memory, plus a few MB per vcpu.
 # shadow_memory = 8
+
+# Whether to transparently share this domain's memory with other domains.
+# default = 0
+# memory_sharing = 0
 
 # A name for your domain. All domains must have different names.
 name = "ExampleHVMDomain"
diff -r 7d28228db41d -r 054042ba73b6 tools/memshr/interface.c
--- a/tools/memshr/interface.c  Thu Dec 17 06:27:56 2009 +0000
+++ b/tools/memshr/interface.c  Thu Dec 17 06:27:57 2009 +0000
@@ -21,6 +21,12 @@
 #include "memshr-priv.h"
 #include "shm.h"
 
+typedef struct {
+    int     enabled;
+    domid_t domid;
+} memshr_vbd_info_t;
+
+memshr_vbd_info_t vbd_info = {0, DOMID_INVALID};
 
 typedef struct {
     struct shared_memshr_info *shared_info;
@@ -31,6 +37,11 @@ private_memshr_info_t memshr;
 private_memshr_info_t memshr;
 
 #define SHARED_INFO  (memshr.shared_info)
+
+void memshr_set_domid(int domid)
+{
+    vbd_info.domid = domid;
+}
 
 void memshr_daemon_initialize(void)
 {
@@ -88,5 +99,10 @@ void memshr_vbd_initialize(void)
         DPRINTF("Failed to open blockshr_hash.\n");
         return;
     }
+
+    if(vbd_info.domid == DOMID_INVALID)
+        return;
+
+    vbd_info.enabled = 1;
 }
 
diff -r 7d28228db41d -r 054042ba73b6 tools/memshr/memshr.h
--- a/tools/memshr/memshr.h     Thu Dec 17 06:27:56 2009 +0000
+++ b/tools/memshr/memshr.h     Thu Dec 17 06:27:57 2009 +0000
@@ -23,6 +23,7 @@
 
 typedef uint64_t xen_mfn_t;
 
+extern void memshr_set_domid(int domid);
 extern void memshr_daemon_initialize(void);
 extern void memshr_vbd_initialize(void);
 
diff -r 7d28228db41d -r 054042ba73b6 tools/python/xen/lowlevel/xc/xc.c
--- a/tools/python/xen/lowlevel/xc/xc.c Thu Dec 17 06:27:56 2009 +0000
+++ b/tools/python/xen/lowlevel/xc/xc.c Thu Dec 17 06:27:57 2009 +0000
@@ -1658,6 +1658,22 @@ static PyObject *pyxc_tmem_shared_auth(X
     return zero;
 }
 
+static PyObject *pyxc_dom_set_memshr(XcObject *self, PyObject *args)
+{
+    uint32_t dom;
+    int enable;
+
+    if (!PyArg_ParseTuple(args, "ii", &dom, &enable))
+        return NULL;
+
+    if (xc_memshr_control(self->xc_handle, dom, enable) != 0)
+        return pyxc_error_to_exception();
+    
+    Py_INCREF(zero);
+    return zero;
+}
+
+
 static PyMethodDef pyxc_methods[] = {
     { "handle",
       (PyCFunction)pyxc_handle,
@@ -2161,6 +2177,14 @@ static PyMethodDef pyxc_methods[] = {
       " uuid_str [str]: uuid.\n"
       " auth [int]: 0|1 .\n"
       "Returns: [int] 0 on success; exception on error.\n" },
+
+    { "dom_set_memshr", 
+      (PyCFunction)pyxc_dom_set_memshr,
+      METH_VARARGS, "\n"
+      "Enable/disable memory sharing for the domain.\n"
+      " dom     [int]:        Domain identifier.\n"
+      " enable  [int,0|1]:    Disable or enable?\n"
+      "Returns: [int] 0 on success; -1 on error.\n" },
 
     { NULL, NULL, 0, NULL }
 };
diff -r 7d28228db41d -r 054042ba73b6 tools/python/xen/xend/XendConfig.py
--- a/tools/python/xen/xend/XendConfig.py       Thu Dec 17 06:27:56 2009 +0000
+++ b/tools/python/xen/xend/XendConfig.py       Thu Dec 17 06:27:57 2009 +0000
@@ -230,6 +230,7 @@ XENAPI_CFG_TYPES = {
     'suppress_spurious_page_faults': bool0,
     's3_integrity' : int,
     'superpages' : int,
+    'memory_sharing': int,
 }
 
 # List of legacy configuration keys that have no equivalent in the
@@ -328,7 +329,7 @@ class XendConfig(dict):
         
         dict.__init__(self)
         self.update(self._defaults())
-
+        
         if filename:
             try:
                 sxp_obj = sxp.parse(open(filename,'r'))
@@ -390,6 +391,7 @@ class XendConfig(dict):
             'shadow_memory': 0,
             'memory_static_max': 0,
             'memory_dynamic_max': 0,
+            'memory_sharing': 0,
             'devices': {},
             'on_xend_start': 'ignore',
             'on_xend_stop': 'ignore',
@@ -441,6 +443,12 @@ class XendConfig(dict):
         if not self["memory_static_max"] > 0:
             raise XendConfigError("memory_static_max must be greater " \
                                   "than zero")
+        if self["memory_sharing"] and not self.is_hvm():
+            raise XendConfigError("memory_sharing can only be enabled " \
+                                  "for HVM domains")
+        if self["memory_sharing"] and not self.is_hap():
+            raise XendConfigError("memory_sharing can only be enabled " \
+                                  "for HAP enabled boxes")
 
     def _actions_sanity_check(self):
         for event in ['shutdown', 'reboot', 'crash']:
@@ -2150,6 +2158,10 @@ class XendConfig(dict):
         val = sxp.child_value(image_sxp, 'superpages')
         if val is not None:
             self['superpages'] = val
+        
+        val = sxp.child_value(image_sxp, 'memory_sharing')
+        if val is not None:
+            self['memory_sharing'] = val
 
         for key in XENAPI_PLATFORM_CFG_TYPES.keys():
             val = sxp.child_value(image_sxp, key, None)
diff -r 7d28228db41d -r 054042ba73b6 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py    Thu Dec 17 06:27:56 2009 +0000
+++ b/tools/python/xen/xend/image.py    Thu Dec 17 06:27:57 2009 +0000
@@ -84,6 +84,7 @@ class ImageHandler:
 
     ostype = None
     superpages = 0
+    memory_sharing = 0
 
     def __init__(self, vm, vmConfig):
         self.vm = vm
@@ -820,6 +821,8 @@ class HVMImageHandler(ImageHandler):
         self.apic = int(vmConfig['platform'].get('apic', 0))
         self.acpi = int(vmConfig['platform'].get('acpi', 0))
         self.guest_os_type = vmConfig['platform'].get('guest_os_type')
+        self.memory_sharing = int(vmConfig['memory_sharing'])
+        xc.dom_set_memshr(self.vm.getDomid(), self.memory_sharing)
 
 
     # Return a list of cmd line args to the device models based on the
diff -r 7d28228db41d -r 054042ba73b6 
tools/python/xen/xend/server/BlktapController.py
--- a/tools/python/xen/xend/server/BlktapController.py  Thu Dec 17 06:27:56 
2009 +0000
+++ b/tools/python/xen/xend/server/BlktapController.py  Thu Dec 17 06:27:57 
2009 +0000
@@ -198,7 +198,10 @@ class Blktap2Controller(BlktapController
                     self.deviceClass = 'tap2'
                     return devid
 
-        cmd = [ TAPDISK_BINARY, '-n', '%s:%s' % (params, file) ]
+        if self.vm.image.memory_sharing:
+            cmd = [ TAPDISK_BINARY, '-n', '%s:%s' % (params, file), '-s', '%d' 
% self.vm.getDomid() ]
+        else:
+            cmd = [ TAPDISK_BINARY, '-n', '%s:%s' % (params, file) ]
         (rc,stdout,stderr) = doexec(cmd)
 
         if rc != 0:
diff -r 7d28228db41d -r 054042ba73b6 tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py     Thu Dec 17 06:27:56 2009 +0000
+++ b/tools/python/xen/xm/create.py     Thu Dec 17 06:27:57 2009 +0000
@@ -195,6 +195,10 @@ gopts.var('shadow_memory', val='MEMORY',
 gopts.var('shadow_memory', val='MEMORY',
           fn=set_int, default=0,
           use="Domain shadow memory in MB.")
+
+gopts.var('memory_sharing', val='no|yes',
+          fn=set_bool, default=0,
+          use="Should memory be shared?")
 
 gopts.var('cpu', val='CPU',
           fn=set_int, default=None,
@@ -1058,7 +1062,8 @@ def configure_hvm(config_image, vals):
              'usb', 'usbdevice',
              'vcpus', 'vnc', 'vncconsole', 'vncdisplay', 'vnclisten',
              'vncunused', 'viridian', 'vpt_align',
-             'xauthority', 'xen_extended_power_mgmt', 'xen_platform_pci' ]
+             'xauthority', 'xen_extended_power_mgmt', 'xen_platform_pci',
+             'memory_sharing' ]
 
     for a in args:
         if a in vals.__dict__ and vals.__dict__[a] is not None:

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
_______________________________________________
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®.