[libvirt] [PATCH] pciFindStubDriver should return NULL on error
by Chris Wright
pciFindStubDriver currently returns 0 in one of the error cases.
While it's correct...NULL is more readable.
Signed-off-by: Chris Wright <chrisw(a)redhat.com>
---
src/util/pci.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/util/pci.c b/src/util/pci.c
index a559476..22c66fa 100644
--- a/src/util/pci.c
+++ b/src/util/pci.c
@@ -826,7 +826,7 @@ recheck:
char ebuf[1024];
VIR_WARN("failed to load pci-stub or pciback drivers: %s",
virStrerror(errno, ebuf, sizeof ebuf));
- return 0;
+ return NULL;
}
goto recheck;
14 years, 3 months
[libvirt] [PATCH] libvirt-guests: start late and stop early
by Jiri Denemark
libvirt-guests init script should be started as late as possible during
host startup and stopped as early as possible during host shutdown to
make sure required services are already/still up and running at the time
libvirt-guests runs.
---
tools/libvirt-guests.init.in | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/tools/libvirt-guests.init.in b/tools/libvirt-guests.init.in
index 993c12d..4e0682d 100644
--- a/tools/libvirt-guests.init.in
+++ b/tools/libvirt-guests.init.in
@@ -17,7 +17,7 @@
#
# libvirt-guests: suspend/resume libvirt guests on shutdown/boot
#
-# chkconfig: 345 98 02
+# chkconfig: 345 99 01
# description: This is a script for suspending active libvirt guests \
# on shutdown and resuming them on next boot \
# See http://libvirt.org
--
1.7.3
14 years, 3 months
[libvirt] I can help, but I don't know how
by arnaud.champion@devatom.fr
?Hi there,
with your help, I have created a Windows tools to manage libvirt/kvm hypervisor and it is free for libvirt/kvm connections. I have done it in C# (not mono) and to do that, I have make a lot of modifications in C# bindings (which in fact works in mono) to improve bindings (my modifications are mainly around callback handling). You can download the tool at this web site : http://www.devatom.fr and sorry, for now it's in french only, I have to work on the translation. Anyway, I think I can help by handling C# bindings for libvirt, I don't know if I must put them on my web site or push them to you, let me know if it interest you.
Best regards,
Arnaud Champion
14 years, 3 months
[libvirt] heads up: tag v0.8.4 moved
by Eric Blake
If you recently cloned libvirt.git, you may have inadvertently picked up
a broken v0.8.4 tag. The tag has now been fixed upstream, so clones
after today are unaffected; and if you cloned before 0.8.4 was released,
you are probably not affected unless you explicitly fetched the broken tag.
Here's how to check if you have the bad tag, and if so, how to fix it:
case $(git rev-parse v0.8.4 2>/dev/null) in
37b0b91*) git tag -d v0.8.4 && git fetch origin tag v0.8.4 &&\
echo 'tag fixed' ;;
v0.8.4) echo 'tag not present, not a problem' ;;
7862e07*) echo 'tag already okay' ;;
*) echo 'where did you get this tag from?' ;;
esac
--
Eric Blake eblake(a)redhat.com +1-801-349-2682
Libvirt virtualization library http://libvirt.org
14 years, 3 months
[libvirt] [PATCH] nodeinfo: work when hot-plugging is disabled
by Eric Blake
Fixes https://bugzilla.redhat.com/show_bug.cgi?id=635857.
* src/nodeinfo.c (cpu_online): Allow missing directory for all
CPUs, not just cpu0.
Signed-off-by: Eric Blake <eblake(a)redhat.com>
---
src/nodeinfo.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/nodeinfo.c b/src/nodeinfo.c
index 65eeb24..3dac9f3 100644
--- a/src/nodeinfo.c
+++ b/src/nodeinfo.c
@@ -65,7 +65,8 @@ int linuxNodeInfoCPUPopulate(FILE *cpuinfo,
/* Return the positive decimal contents of the given
* CPU_SYS_PATH/cpu%u/FILE, or -1 on error. If MISSING_OK and the
* file could not be found, return 1 instead of an error; this is
- * because some machines cannot hot-unplug cpu0. */
+ * because some machines cannot hot-unplug cpu0, or because
+ * hot-unplugging is disabled. */
static int
get_cpu_value(unsigned int cpu, const char *file, bool missing_ok)
{
@@ -113,7 +114,7 @@ cleanup:
static int
cpu_online(unsigned int cpu)
{
- return get_cpu_value(cpu, "online", cpu == 0);
+ return get_cpu_value(cpu, "online", true);
}
static unsigned long count_thread_siblings(unsigned int cpu)
--
1.7.2.3
14 years, 3 months
[libvirt] [PATCH] Set sensible defaults for cpu match and feature policy
by Daniel P. Berrange
To enable the CPU XML from the capabilities to be pasted directly
into the guest XML with no editing, pick a sensible default for
match and feature policy. The CPU match will be exact and the
feature policy will be require. This should ensure safety for
migration and give DWIM semantics for users
* src/conf/cpu_conf.c: Default to exact match and require policy
---
src/conf/cpu_conf.c | 15 ++++++++-------
1 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/src/conf/cpu_conf.c b/src/conf/cpu_conf.c
index 3274659..68d3daf 100644
--- a/src/conf/cpu_conf.c
+++ b/src/conf/cpu_conf.c
@@ -147,12 +147,10 @@ virCPUDefParseXML(const xmlNodePtr node,
char *match = virXMLPropString(node, "match");
if (!match) {
- if (virXPathBoolean("boolean(./model)", ctxt)) {
- virCPUReportError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("Missing match attribute for CPU specification"));
- goto error;
- }
- def->match = -1;
+ if (virXPathBoolean("boolean(./model)", ctxt))
+ def->match = VIR_CPU_MATCH_EXACT;
+ else
+ def->match = -1;
} else {
def->match = virCPUMatchTypeFromString(match);
VIR_FREE(match);
@@ -251,7 +249,10 @@ virCPUDefParseXML(const xmlNodePtr node,
char *strpolicy;
strpolicy = virXMLPropString(nodes[i], "policy");
- policy = virCPUFeaturePolicyTypeFromString(strpolicy);
+ if (strpolicy == NULL)
+ policy = VIR_CPU_FEATURE_REQUIRE;
+ else
+ policy = virCPUFeaturePolicyTypeFromString(strpolicy);
VIR_FREE(strpolicy);
if (policy < 0) {
--
1.7.2.3
14 years, 3 months
[libvirt] [PATCH] Enable support for nested SVM
by Daniel P. Berrange
This enables support for nested SVM using the regular CPU
model/features block. If the CPU model or features include
'svm' or 'vmx', then the '-enable-nesting' flag will be
added to the QEMU command line. Several of the models
already include svm support, but QEMU was just masking out
the svm bit silently. So this will enable SVM on such
models
* src/qemu/qemu_conf.h: flag for -enable-nesting
* src/qemu/qemu_conf.c: Use -enable-nesting if VMX or SVM are in
the CPUID
---
src/qemu/qemu_conf.c | 39 +++++++++++++++++++++++++++++++++++++--
src/qemu/qemu_conf.h | 1 +
2 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 7a37c70..a2aab95 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1210,6 +1210,8 @@ static unsigned long long qemudComputeCmdFlags(const char *help,
flags |= QEMUD_CMD_FLAG_NO_KVM_PIT;
if (strstr(help, "-tdf"))
flags |= QEMUD_CMD_FLAG_TDF;
+ if (strstr(help, "-enable-nesting"))
+ flags |= QEMUD_CMD_FLAG_NESTING;
if (strstr(help, ",menu=on"))
flags |= QEMUD_CMD_FLAG_BOOT_MENU;
@@ -3494,13 +3496,36 @@ error:
}
+#define CPUID_FUNCTION_SVM 0x80000001
+#define CPUID_ECX_SVM 0x00000004
+
+#define CPUID_FUNCTION_VMX 0x00000001
+#define CPUID_ECX_VMX 0x00000020
+
+static bool qemuCpuHasHwVirt(union cpuData *data)
+{
+ int i;
+ for (i = 0 ; i < data->x86.basic_len ; i++) {
+ if (data->x86.basic[i].function == CPUID_FUNCTION_VMX &&
+ (data->x86.basic[i].ecx & CPUID_ECX_VMX))
+ return true;
+ }
+ for (i = 0 ; i < data->x86.extended_len ; i++) {
+ if (data->x86.extended[i].function == CPUID_FUNCTION_SVM &&
+ (data->x86.extended[i].ecx & CPUID_ECX_SVM))
+ return true;
+ }
+ return false;
+}
+
static int
qemuBuildCpuArgStr(const struct qemud_driver *driver,
const virDomainDefPtr def,
const char *emulator,
unsigned long long qemuCmdFlags,
const struct utsname *ut,
- char **opt)
+ char **opt,
+ bool *hasHwVirt)
{
const virCPUDefPtr host = driver->caps->host.cpu;
virCPUDefPtr guest = NULL;
@@ -3511,6 +3536,8 @@ qemuBuildCpuArgStr(const struct qemud_driver *driver,
virBuffer buf = VIR_BUFFER_INITIALIZER;
int i;
+ *hasHwVirt = false;
+
if (def->cpu && def->cpu->model) {
if (qemudProbeCPUModels(emulator, qemuCmdFlags, ut->machine,
&ncpus, &cpus) < 0)
@@ -3552,6 +3579,8 @@ qemuBuildCpuArgStr(const struct qemud_driver *driver,
if (cpuDecode(guest, data, cpus, ncpus, preferred) < 0)
goto cleanup;
+ *hasHwVirt = qemuCpuHasHwVirt(data);
+
virBufferVSprintf(&buf, "%s", guest->model);
for (i = 0; i < guest->nfeatures; i++) {
char sign;
@@ -3678,6 +3707,7 @@ int qemudBuildCommandLine(virConnectPtr conn,
char *cpu;
char *smp;
int last_good_net = -1;
+ bool hasHwVirt = false;
uname_normalize(&ut);
@@ -3871,13 +3901,18 @@ int qemudBuildCommandLine(virConnectPtr conn,
ADD_ARG_LIT(def->os.machine);
}
- if (qemuBuildCpuArgStr(driver, def, emulator, qemuCmdFlags, &ut, &cpu) < 0)
+ if (qemuBuildCpuArgStr(driver, def, emulator, qemuCmdFlags,
+ &ut, &cpu, &hasHwVirt) < 0)
goto error;
if (cpu) {
ADD_ARG_LIT("-cpu");
ADD_ARG_LIT(cpu);
VIR_FREE(cpu);
+
+ if ((qemuCmdFlags & QEMUD_CMD_FLAG_NESTING) &&
+ hasHwVirt)
+ ADD_ARG_LIT("-enable-nesting");
}
if (disableKQEMU)
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 2c9e608..16f72f5 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -93,6 +93,7 @@ enum qemud_cmd_flags {
QEMUD_CMD_FLAG_NODEFCONFIG = (1LL << 37), /* -nodefconfig */
QEMUD_CMD_FLAG_BOOT_MENU = (1LL << 38), /* -boot menu=on support */
QEMUD_CMD_FLAG_ENABLE_KQEMU = (1LL << 39), /* -enable-kqemu flag */
+ QEMUD_CMD_FLAG_NESTING = (1LL << 40), /* -enable-nesting (SVM/VMX) */
};
/* Main driver state */
--
1.7.2.3
14 years, 3 months
[libvirt] [PATCH] nwfilter: fix an bug appearing on big endian machines
by Stefan Berger
Either one of the following patches fixes a bug appearing on big
endian machines where the returned XML is not the one that is expected
(see test/nwfilterxml2xmltest). The problem is due to for example the
casting of a pointers to unsigned integers to void * and then back to 16
bit integers.
I have prepared 2 different solutions for the problem. I think the one
with the union is the better one, which I am posting before the shorted
solution. Both solutions make the nwfilterxml2xmltest pass on a ppc64
machine.
Signed-off-by: Stefan Berger <stefanb(a)us.ibm.com>
Index: libvirt-acl/src/conf/nwfilter_conf.c
===================================================================
--- libvirt-acl.orig/src/conf/nwfilter_conf.c
+++ libvirt-acl/src/conf/nwfilter_conf.c
@@ -379,9 +379,14 @@ virNWFilterPoolObjRemove(virNWFilterPool
}
}
+union data {
+ void *v;
+ char *c;
+ unsigned char *uc;
+ unsigned int ui;
+};
-
-typedef bool (*valueValidator)(enum attrDatatype datatype, void *valptr,
+typedef bool (*valueValidator)(enum attrDatatype datatype, union data
*valptr,
virNWFilterRuleDefPtr nwf);
typedef bool (*valueFormatter)(virBufferPtr buf,
virNWFilterRuleDefPtr nwf);
@@ -407,18 +412,18 @@ static const struct int_map macProtoMap[
static bool
-checkMacProtocolID(enum attrDatatype datatype, void *value,
+checkMacProtocolID(enum attrDatatype datatype, union data *value,
virNWFilterRuleDefPtr nwf ATTRIBUTE_UNUSED)
{
int32_t res = -1;
if (datatype == DATATYPE_STRING) {
- if (intMapGetByString(macProtoMap, (char *)value, 1, &res) == 0)
+ if (intMapGetByString(macProtoMap, value->c, 1, &res) == 0)
res = -1;
datatype = DATATYPE_UINT16;
} else if (datatype == DATATYPE_UINT16 ||
datatype == DATATYPE_UINT16_HEX) {
- res = (uint32_t)*(uint16_t *)value;
+ res = value->ui;
if (res < 0x600)
res = -1;
}
@@ -485,10 +490,10 @@ checkValidMask(unsigned char *data, int
static bool
checkMACMask(enum attrDatatype datatype ATTRIBUTE_UNUSED,
- void *macMask,
+ union data *macMask,
virNWFilterRuleDefPtr nwf ATTRIBUTE_UNUSED)
{
- return checkValidMask((unsigned char *)macMask, 6);
+ return checkValidMask(macMask->uc, 6);
}
@@ -511,18 +516,18 @@ static const struct int_map arpOpcodeMap
static bool
arpOpcodeValidator(enum attrDatatype datatype,
- void *value,
+ union data *value,
virNWFilterRuleDefPtr nwf)
{
int32_t res = -1;
if (datatype == DATATYPE_STRING) {
- if (intMapGetByString(arpOpcodeMap, (char *)value, 1, &res) == 0)
+ if (intMapGetByString(arpOpcodeMap, value->c, 1, &res) == 0)
res = -1;
datatype = DATATYPE_UINT16;
} else if (datatype == DATATYPE_UINT16 ||
datatype == DATATYPE_UINT16_HEX) {
- res = (uint32_t)*(uint16_t *)value;
+ res = (uint32_t)value->ui;
}
if (res != -1) {
@@ -570,18 +575,18 @@ static const struct int_map ipProtoMap[]
static bool checkIPProtocolID(enum attrDatatype datatype,
- void *value,
+ union data *value,
virNWFilterRuleDefPtr nwf)
{
int32_t res = -1;
if (datatype == DATATYPE_STRING) {
- if (intMapGetByString(ipProtoMap, (char *)value, 1, &res) == 0)
+ if (intMapGetByString(ipProtoMap, value->c, 1, &res) == 0)
res = -1;
datatype = DATATYPE_UINT8_HEX;
} else if (datatype == DATATYPE_UINT8 ||
datatype == DATATYPE_UINT8_HEX) {
- res = (uint32_t)*(uint16_t *)value;
+ res = (uint32_t)value->ui;
}
if (res != -1) {
@@ -615,10 +620,10 @@ formatIPProtocolID(virBufferPtr buf,
static bool
-dscpValidator(enum attrDatatype datatype, void *val,
+dscpValidator(enum attrDatatype datatype, union data *val,
virNWFilterRuleDefPtr nwf)
{
- uint8_t dscp = *(uint16_t *)val;
+ uint8_t dscp = val->ui;
if (dscp > 63)
return 0;
@@ -1150,7 +1155,8 @@ virNWFilterRuleDetailsParse(xmlNodePtr n
nwItemDesc *item;
int int_val;
unsigned int uint_val;
- void *data_ptr = NULL, *storage_ptr;
+ void *storage_ptr;
+ union data data;
valueValidator validator;
char *match = virXMLPropString(node, "match");
nwIPAddress ipaddr;
@@ -1206,7 +1212,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr n
if (uint_val <= 0xff) {
*(uint8_t *)storage_ptr = uint_val;
found = 1;
- data_ptr = &uint_val;
+ data.ui = uint_val;
} else
rc = -1;
} else
@@ -1221,7 +1227,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr n
if (uint_val <= 0xffff) {
*(uint16_t *)storage_ptr = uint_val;
found = 1;
- data_ptr = &uint_val;
+ data.ui = uint_val;
} else
rc = -1;
} else
@@ -1245,7 +1251,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr n
*(uint8_t *)storage_ptr =
(uint8_t)uint_val;
found = 1;
- data_ptr = &uint_val;
+ data.ui = uint_val;
} else
rc = -1;
} else {
@@ -1278,7 +1284,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr n
(nwMACAddressPtr)storage_ptr)) {
rc = -1;
}
- data_ptr = storage_ptr;
+ data.v = storage_ptr;
found = 1;
break;
@@ -1299,7 +1305,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr n
*(uint8_t *)storage_ptr =
(uint8_t)uint_val;
found = 1;
- data_ptr = &uint_val;
+ data.ui = uint_val;
} else
rc = -1;
} else {
@@ -1322,7 +1328,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr n
rc = -1;
break;
}
- data_ptr = prop;
+ data.c = prop;
found = 1;
break;
@@ -1344,7 +1350,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr n
*flags = NWFILTER_ENTRY_ITEM_FLAG_EXISTS | flags_set;
item->datatype = datatype >> 1;
if (validator) {
- if (!validator(datatype >> 1, data_ptr, nwf)) {
+ if (!validator(datatype >> 1, &data, nwf)) {
rc = -1;
*flags = 0;
}
=============== 2nd solution =================
Index: libvirt-acl/src/conf/nwfilter_conf.c
===================================================================
--- libvirt-acl.orig/src/conf/nwfilter_conf.c
+++ libvirt-acl/src/conf/nwfilter_conf.c
@@ -181,6 +181,8 @@ static const char dscp_str[] = "
#define DSCP dscp_str
+#define PARSED_INT_TYPE unsigned int
+
/**
* intMapGetByInt:
* @intmap: Pointer to int-to-string map
@@ -418,7 +420,7 @@ checkMacProtocolID(enum attrDatatype dat
datatype = DATATYPE_UINT16;
} else if (datatype == DATATYPE_UINT16 ||
datatype == DATATYPE_UINT16_HEX) {
- res = (uint32_t)*(uint16_t *)value;
+ res = (uint32_t)*(PARSED_INT_TYPE *)value;
if (res < 0x600)
res = -1;
}
@@ -522,7 +524,7 @@ arpOpcodeValidator(enum attrDatatype dat
datatype = DATATYPE_UINT16;
} else if (datatype == DATATYPE_UINT16 ||
datatype == DATATYPE_UINT16_HEX) {
- res = (uint32_t)*(uint16_t *)value;
+ res = (uint32_t)*(PARSED_INT_TYPE *)value;
}
if (res != -1) {
@@ -581,7 +583,7 @@ static bool checkIPProtocolID(enum attrD
datatype = DATATYPE_UINT8_HEX;
} else if (datatype == DATATYPE_UINT8 ||
datatype == DATATYPE_UINT8_HEX) {
- res = (uint32_t)*(uint16_t *)value;
+ res = (uint32_t)*(PARSED_INT_TYPE *)value;
}
if (res != -1) {
@@ -618,7 +620,7 @@ static bool
dscpValidator(enum attrDatatype datatype, void *val,
virNWFilterRuleDefPtr nwf)
{
- uint8_t dscp = *(uint16_t *)val;
+ uint8_t dscp = *(PARSED_INT_TYPE *)val;
if (dscp > 63)
return 0;
@@ -1149,7 +1151,7 @@ virNWFilterRuleDetailsParse(xmlNodePtr n
enum virNWFilterEntryItemFlags *flags ,match_flag = 0, flags_set = 0;
nwItemDesc *item;
int int_val;
- unsigned int uint_val;
+ PARSED_INT_TYPE uint_val;
void *data_ptr = NULL, *storage_ptr;
valueValidator validator;
char *match = virXMLPropString(node, "match");
14 years, 3 months
[libvirt] XML support for arbitrary command line arguments
by Harsh Bora
Hi,
Is there a way by which I can pass arbitrary command line args to a
hypervisor (Qemu), and let the hypervisor decide what to do with it?
I mean, is there a generic XML tag define which can be used to specify
'n' number of command line args which are blindly passed to hypervisor
to process?
regards,
Harsh
14 years, 3 months
[libvirt] [PATCH 00/12] Implement memory control api
by Nikunj A. Dadhania
This patch series implement public api for controlling various memory tunables
exported by the OS. This is based on the following RFC[1].
* Implement virDomainSetMemoryParameters api
* Provide implementation for remote, QEmu and LXC drivers
* Enable memory controller support fro QEmu
* virsh command for runtime changes to the memory parameters
* Domain configuration parsing for memory control parameters
* Cgroup memory controller code for memory hard_limit/soft_limit, swap
hard_limit
To Do
* Python bindings is just a place holder, need to implement
* virDomainGetMemoryParameters
1. https://www.redhat.com/archives/libvir-list/2010-August/msg00607.html
2. https://www.redhat.com/archives/libvir-list/2010-August/msg00699.html
---
Nikunj A. Dadhania (12):
Adding virDomainSetMemoryParameters API
Adding structure for virDomainSetMemoryParameter
Adds xml entries for memory tunables
XML parsing for memory tunables
Hand-coded python bindings for virDomainSetMemoryParameters
Implement driver interface domainSetMemoryParamters for QEmu
Implement cgroup memory controller tunables
Adding memtunables to libvirt-lxc command
Adding memtunables to qemuSetupCgroup
Adding memtune command to virsh tool
Implements virDomainSetMemoryParameters for the remote driver
Implement domainSetMemoryParameters function
daemon/remote.c | 66 +++++++++++++++++
daemon/remote_dispatch_prototypes.h | 8 ++
daemon/remote_dispatch_table.h | 5 +
docs/schemas/domain.rng | 31 ++++++++
include/libvirt/libvirt.h.in | 56 ++++++++++++++
python/generator.py | 1
python/libvirt-override-api.xml | 6 ++
python/libvirt-override.c | 7 ++
src/conf/domain_conf.c | 50 +++++++++++--
src/conf/domain_conf.h | 12 ++-
src/driver.h | 6 ++
src/esx/esx_driver.c | 1
src/esx/esx_vmx.c | 30 ++++----
src/libvirt.c | 48 ++++++++++++
src/libvirt_private.syms | 6 ++
src/libvirt_public.syms | 5 +
src/lxc/lxc_controller.c | 24 ++++++
src/lxc/lxc_driver.c | 101 ++++++++++++++++++++++++--
src/openvz/openvz_driver.c | 9 +-
src/phyp/phyp_driver.c | 1
src/qemu/qemu.conf | 4 +
src/qemu/qemu_conf.c | 11 ++-
src/qemu/qemu_driver.c | 138 +++++++++++++++++++++++++++++++++--
src/remote/remote_driver.c | 66 +++++++++++++++++
src/remote/remote_protocol.c | 62 +++++++++++++++-
src/remote/remote_protocol.h | 36 +++++++++
src/test/test_driver.c | 13 ++-
src/uml/uml_conf.c | 2 -
src/uml/uml_driver.c | 15 ++--
src/util/cgroup.c | 106 +++++++++++++++++++++++++++
src/util/cgroup.h | 7 ++
src/xen/xen_driver.c | 1
tools/virsh.c | 89 +++++++++++++++++++++++
33 files changed, 955 insertions(+), 68 deletions(-)
14 years, 3 months