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
|