[libvirt] [PATCHv2 0/8] add virGetSchedulerParamterFlags

V2 of this original series: https://www.redhat.com/archives/libvir-list/2011-May/msg01142.html Changes in this version: rebase to latest avoid regression in virTypedParameter consolidation write new API in terms of virTypedParameter instead of virSchedParameter Eric Blake (8): libvirt.h: avoid regression, and document preferred name maint: prefer newer API names internally remote: consolidate typed parameter handling sched: introduce virDomainGetSchedulerParametersFlags qemu: introduce qemuGetSchedulerParametersFlags remote: introduce remoteGetSchedulerParametersFlags virsh: improve schedinfo querying ability sched: provide new API shims for remaining drivers daemon/remote.c | 563 +++++++++++++++++------------------------- include/libvirt/libvirt.h.in | 275 +++++++++++---------- python/generator.py | 1 + python/libvirt-override.c | 28 +- src/driver.h | 22 ++- src/esx/esx_driver.c | 60 +++-- src/libvirt.c | 96 ++++++- src/libvirt_public.syms | 1 + src/libxl/libxl_driver.c | 42 +++- src/lxc/lxc_driver.c | 60 ++++-- src/qemu/qemu_driver.c | 115 +++++++--- src/remote/remote_driver.c | 525 ++++++++++++++++----------------------- src/remote/remote_protocol.x | 87 +++----- src/remote_protocol-structs | 63 ++--- src/test/test_driver.c | 41 +++- src/xen/xen_driver.c | 36 +++- src/xen/xen_hypervisor.c | 14 +- src/xen/xen_hypervisor.h | 6 +- src/xen/xend_internal.c | 12 +- tools/virsh.c | 102 +++++--- 20 files changed, 1102 insertions(+), 1047 deletions(-) -- 1.7.4.4

Commit 824dcaff was a regression (thankfully unreleased) for any client code that used 'struct _virSchedParameter' directly rather than the preferred virSchedParameter typedef. Adding a #define avoids even that API change, while rearranging the file makes it clear what the old vs. new API is. * include/libvirt/libvirt.h.in: Rearrange older names to the bottom and improve documentation on preferred names. (virDomainGetSchedulerParameters, virDomainSetSchedulerParameters) (virDomainSetSchedulerParametersFlags) (virDomainSetBlkioParameters, virDomainGetBlkioParameters) (virDomainSetMemoryParameters, virDomainGetMemoryParameters): Use newer type names. * python/libvirt-override.c: Adjust code generation to cope. Suggested by Daniel P. Berrange. --- include/libvirt/libvirt.h.in | 267 +++++++++++++++++++++++------------------- python/libvirt-override.c | 28 +++--- 2 files changed, 160 insertions(+), 135 deletions(-) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index a3c771a..c1d028a 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -308,6 +308,10 @@ typedef enum { * virTypedParameter: * * A named parameter, including a type and value. + * + * The types virSchedParameter, virBlkioParameter, and + * virMemoryParameter are aliases of this type, for use when + * targetting libvirt earlier than 0.9.2. */ typedef struct _virTypedParameter virTypedParameter; @@ -331,21 +335,8 @@ struct _virTypedParameter { */ typedef virTypedParameter *virTypedParameterPtr; -/* Management of scheduler parameters */ -/** - * virDomainSchedParameterType: - * - * A scheduler parameter field type - */ -typedef enum { - VIR_DOMAIN_SCHED_FIELD_INT = VIR_TYPED_PARAM_INT, - VIR_DOMAIN_SCHED_FIELD_UINT = VIR_TYPED_PARAM_UINT, - VIR_DOMAIN_SCHED_FIELD_LLONG = VIR_TYPED_PARAM_LLONG, - VIR_DOMAIN_SCHED_FIELD_ULLONG = VIR_TYPED_PARAM_ULLONG, - VIR_DOMAIN_SCHED_FIELD_DOUBLE = VIR_TYPED_PARAM_DOUBLE, - VIR_DOMAIN_SCHED_FIELD_BOOLEAN = VIR_TYPED_PARAM_BOOLEAN, -} virSchedParameterType; +/* Management of scheduler parameters */ typedef enum { VIR_DOMAIN_SCHEDPARAM_CURRENT = 0, /* affect current domain state */ @@ -353,49 +344,25 @@ typedef enum { VIR_DOMAIN_SCHEDPARAM_CONFIG = (1 << 1), /* Affect next boot */ } virDomainSchedParameterFlags; -/** - * VIR_DOMAIN_SCHED_FIELD_LENGTH: - * - * Macro providing the field length of virSchedParameter - */ - -#define VIR_DOMAIN_SCHED_FIELD_LENGTH VIR_TYPED_PARAM_FIELD_LENGTH - -/** - * virDomainSchedParameter: - * - * a virDomainSchedParameter is the set of scheduler parameters - */ - -typedef struct _virTypedParameter virSchedParameter; - -/** - * virSchedParameterPtr: - * - * a virSchedParameterPtr is a pointer to a virSchedParameter structure. - */ - -typedef virSchedParameter *virSchedParameterPtr; - /* * Fetch scheduler parameters, caller allocates 'params' field of size 'nparams' */ int virDomainGetSchedulerParameters (virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int *nparams); /* * Change scheduler parameters */ int virDomainSetSchedulerParameters (virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams); /* * Change scheduler parameters */ int virDomainSetSchedulerParametersFlags (virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags); @@ -810,29 +777,8 @@ int virDomainGetState (virDomainPtr domain, char * virDomainGetSchedulerType(virDomainPtr domain, int *nparams); -/* Manage blkio parameters. */ - -/** - * virDomainBlkioParameterType: - * - * A blkio parameter field type - */ -typedef enum { - VIR_DOMAIN_BLKIO_PARAM_INT = VIR_TYPED_PARAM_INT, - VIR_DOMAIN_BLKIO_PARAM_UINT = VIR_TYPED_PARAM_UINT, - VIR_DOMAIN_BLKIO_PARAM_LLONG = VIR_TYPED_PARAM_LLONG, - VIR_DOMAIN_BLKIO_PARAM_ULLONG = VIR_TYPED_PARAM_ULLONG, - VIR_DOMAIN_BLKIO_PARAM_DOUBLE = VIR_TYPED_PARAM_DOUBLE, - VIR_DOMAIN_BLKIO_PARAM_BOOLEAN = VIR_TYPED_PARAM_BOOLEAN, -} virBlkioParameterType; -/** - * VIR_DOMAIN_BLKIO_FIELD_LENGTH: - * - * Macro providing the field length of virBlkioParameter - */ - -#define VIR_DOMAIN_BLKIO_FIELD_LENGTH VIR_TYPED_PARAM_FIELD_LENGTH +/* Manage blkio parameters. */ /** * VIR_DOMAIN_BLKIO_WEIGHT: @@ -843,55 +789,17 @@ typedef enum { #define VIR_DOMAIN_BLKIO_WEIGHT "weight" -/** - * virDomainBlkioParameter: - * - * a virDomainBlkioParameter is the set of blkio parameters - */ - -typedef struct _virTypedParameter virBlkioParameter; - -/** - * virBlkioParameterPtr: - * - * a virBlkioParameterPtr is a pointer to a virBlkioParameter structure. - */ - -typedef virBlkioParameter *virBlkioParameterPtr; - /* Set Blkio tunables for the domain*/ int virDomainSetBlkioParameters(virDomainPtr domain, - virBlkioParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags); int virDomainGetBlkioParameters(virDomainPtr domain, - virBlkioParameterPtr params, + virTypedParameterPtr params, int *nparams, unsigned int flags); /* Manage memory parameters. */ /** - * virDomainMemoryParameterType: - * - * A memory parameter field type - */ -typedef enum { - VIR_DOMAIN_MEMORY_PARAM_INT = VIR_TYPED_PARAM_INT, - VIR_DOMAIN_MEMORY_PARAM_UINT = VIR_TYPED_PARAM_UINT, - VIR_DOMAIN_MEMORY_PARAM_LLONG = VIR_TYPED_PARAM_LLONG, - VIR_DOMAIN_MEMORY_PARAM_ULLONG = VIR_TYPED_PARAM_ULLONG, - VIR_DOMAIN_MEMORY_PARAM_DOUBLE = VIR_TYPED_PARAM_DOUBLE, - VIR_DOMAIN_MEMORY_PARAM_BOOLEAN = VIR_TYPED_PARAM_BOOLEAN, -} virMemoryParameterType; - -/** - * VIR_DOMAIN_MEMORY_FIELD_LENGTH: - * - * Macro providing the field length of virMemoryParameter - */ - -#define VIR_DOMAIN_MEMORY_FIELD_LENGTH VIR_TYPED_PARAM_FIELD_LENGTH - -/** * VIR_DOMAIN_MEMORY_PARAM_UNLIMITED: * * Macro providing the virMemoryParameter value that indicates "unlimited" @@ -936,28 +844,12 @@ typedef enum { #define VIR_DOMAIN_MEMORY_SWAP_HARD_LIMIT "swap_hard_limit" -/** - * virDomainMemoryParameter: - * - * a virDomainMemoryParameter is the set of scheduler parameters - */ - -typedef struct _virTypedParameter virMemoryParameter; - -/** - * virMemoryParameterPtr: - * - * a virMemoryParameterPtr is a pointer to a virMemoryParameter structure. - */ - -typedef virMemoryParameter *virMemoryParameterPtr; - /* Set memory tunables for the domain*/ int virDomainSetMemoryParameters(virDomainPtr domain, - virMemoryParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags); int virDomainGetMemoryParameters(virDomainPtr domain, - virMemoryParameterPtr params, + virTypedParameterPtr params, int *nparams, unsigned int flags); /* Memory size modification flags. */ @@ -2629,6 +2521,139 @@ int virDomainOpenConsole(virDomainPtr dom, int virDomainInjectNMI(virDomainPtr domain, unsigned int flags); + +/** + * virDomainSchedParameterType: + * + * A scheduler parameter field type. Provided for backwards + * compatibility; virTypedParameterType is the preferred enum since + * 0.9.2. + */ +typedef enum { + VIR_DOMAIN_SCHED_FIELD_INT = VIR_TYPED_PARAM_INT, + VIR_DOMAIN_SCHED_FIELD_UINT = VIR_TYPED_PARAM_UINT, + VIR_DOMAIN_SCHED_FIELD_LLONG = VIR_TYPED_PARAM_LLONG, + VIR_DOMAIN_SCHED_FIELD_ULLONG = VIR_TYPED_PARAM_ULLONG, + VIR_DOMAIN_SCHED_FIELD_DOUBLE = VIR_TYPED_PARAM_DOUBLE, + VIR_DOMAIN_SCHED_FIELD_BOOLEAN = VIR_TYPED_PARAM_BOOLEAN, +} virSchedParameterType; + +/** + * VIR_DOMAIN_SCHED_FIELD_LENGTH: + * + * Macro providing the field length of virSchedParameter. Provided + * for backwards compatibility; VIR_TYPED_PARAM_FIELD_LENGTH is the + * preferred value since 0.9.2. + */ +#define VIR_DOMAIN_SCHED_FIELD_LENGTH VIR_TYPED_PARAM_FIELD_LENGTH + +/** + * virDomainSchedParameter: + * + * a virDomainSchedParameter is the set of scheduler parameters. + * Provided for backwards compatibility; virTypedParameter is the + * preferred alias since 0.9.2. + */ +#define _virSchedParameter _virTypedParameter +typedef struct _virTypedParameter virSchedParameter; + +/** + * virSchedParameterPtr: + * + * a virSchedParameterPtr is a pointer to a virSchedParameter structure. + * Provided for backwards compatibility; virTypedParameterPtr is the + * preferred alias since 0.9.2. + */ +typedef virSchedParameter *virSchedParameterPtr; + +/** + * virDomainBlkioParameterType: + * + * A blkio parameter field type. Provided for backwards + * compatibility; virTypedParameterType is the preferred enum since + * 0.9.2. + */ +typedef enum { + VIR_DOMAIN_BLKIO_PARAM_INT = VIR_TYPED_PARAM_INT, + VIR_DOMAIN_BLKIO_PARAM_UINT = VIR_TYPED_PARAM_UINT, + VIR_DOMAIN_BLKIO_PARAM_LLONG = VIR_TYPED_PARAM_LLONG, + VIR_DOMAIN_BLKIO_PARAM_ULLONG = VIR_TYPED_PARAM_ULLONG, + VIR_DOMAIN_BLKIO_PARAM_DOUBLE = VIR_TYPED_PARAM_DOUBLE, + VIR_DOMAIN_BLKIO_PARAM_BOOLEAN = VIR_TYPED_PARAM_BOOLEAN, +} virBlkioParameterType; + +/** + * VIR_DOMAIN_BLKIO_FIELD_LENGTH: + * + * Macro providing the field length of virBlkioParameter. Provided + * for backwards compatibility; VIR_TYPED_PARAM_FIELD_LENGTH is the + * preferred value since 0.9.2. + */ +#define VIR_DOMAIN_BLKIO_FIELD_LENGTH VIR_TYPED_PARAM_FIELD_LENGTH + +/** + * virDomainBlkioParameter: + * + * a virDomainBlkioParameter is the set of blkio parameters. + * Provided for backwards compatibility; virTypedParameter is the + * preferred alias since 0.9.2. + */ +#define _virBlkioParameter _virTypedParameter +typedef struct _virTypedParameter virBlkioParameter; + +/** + * virBlkioParameterPtr: + * + * a virBlkioParameterPtr is a pointer to a virBlkioParameter structure. + * Provided for backwards compatibility; virTypedParameterPtr is the + * preferred alias since 0.9.2. + */ +typedef virBlkioParameter *virBlkioParameterPtr; + +/** + * virDomainMemoryParameterType: + * + * A memory parameter field type. Provided for backwards + * compatibility; virTypedParameterType is the preferred enum since + * 0.9.2. + */ +typedef enum { + VIR_DOMAIN_MEMORY_PARAM_INT = VIR_TYPED_PARAM_INT, + VIR_DOMAIN_MEMORY_PARAM_UINT = VIR_TYPED_PARAM_UINT, + VIR_DOMAIN_MEMORY_PARAM_LLONG = VIR_TYPED_PARAM_LLONG, + VIR_DOMAIN_MEMORY_PARAM_ULLONG = VIR_TYPED_PARAM_ULLONG, + VIR_DOMAIN_MEMORY_PARAM_DOUBLE = VIR_TYPED_PARAM_DOUBLE, + VIR_DOMAIN_MEMORY_PARAM_BOOLEAN = VIR_TYPED_PARAM_BOOLEAN, +} virMemoryParameterType; + +/** + * VIR_DOMAIN_MEMORY_FIELD_LENGTH: + * + * Macro providing the field length of virMemoryParameter. Provided + * for backwards compatibility; VIR_TYPED_PARAM_FIELD_LENGTH is the + * preferred value since 0.9.2. + */ +#define VIR_DOMAIN_MEMORY_FIELD_LENGTH VIR_TYPED_PARAM_FIELD_LENGTH + +/** + * virDomainMemoryParameter: + * + * a virDomainMemoryParameter is the set of scheduler parameters. + * Provided for backwards compatibility; virTypedParameter is the + * preferred alias since 0.9.2. + */ +#define _virMemoryParameter _virTypedParameter +typedef struct _virTypedParameter virMemoryParameter; + +/** + * virMemoryParameterPtr: + * + * a virMemoryParameterPtr is a pointer to a virMemoryParameter structure. + * Provided for backwards compatibility; virTypedParameterPtr is the + * preferred alias since 0.9.2. + */ +typedef virMemoryParameter *virMemoryParameterPtr; + #ifdef __cplusplus } #endif diff --git a/python/libvirt-override.c b/python/libvirt-override.c index c42931d..8676aba 100644 --- a/python/libvirt-override.c +++ b/python/libvirt-override.c @@ -206,7 +206,7 @@ libvirt_virDomainGetSchedulerParameters(PyObject *self ATTRIBUTE_UNUSED, char *c_retval; int i_retval; int nparams, i; - virSchedParameterPtr params; + virTypedParameterPtr params; if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetScedulerParameters", &pyobj_domain)) @@ -242,27 +242,27 @@ libvirt_virDomainGetSchedulerParameters(PyObject *self ATTRIBUTE_UNUSED, PyObject *key, *val; switch (params[i].type) { - case VIR_DOMAIN_SCHED_FIELD_INT: + case VIR_TYPED_PARAM_INT: val = PyInt_FromLong((long)params[i].value.i); break; - case VIR_DOMAIN_SCHED_FIELD_UINT: + case VIR_TYPED_PARAM_UINT: val = PyInt_FromLong((long)params[i].value.ui); break; - case VIR_DOMAIN_SCHED_FIELD_LLONG: + case VIR_TYPED_PARAM_LLONG: val = PyLong_FromLongLong((long long)params[i].value.l); break; - case VIR_DOMAIN_SCHED_FIELD_ULLONG: + case VIR_TYPED_PARAM_ULLONG: val = PyLong_FromLongLong((long long)params[i].value.ul); break; - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: + case VIR_TYPED_PARAM_DOUBLE: val = PyFloat_FromDouble((double)params[i].value.d); break; - case VIR_DOMAIN_SCHED_FIELD_BOOLEAN: + case VIR_TYPED_PARAM_BOOLEAN: val = PyBool_FromLong((long)params[i].value.b); break; @@ -287,7 +287,7 @@ libvirt_virDomainSetSchedulerParameters(PyObject *self ATTRIBUTE_UNUSED, char *c_retval; int i_retval; int nparams, i; - virSchedParameterPtr params; + virTypedParameterPtr params; if (!PyArg_ParseTuple(args, (char *)"OO:virDomainSetScedulerParameters", &pyobj_domain, &info)) @@ -325,27 +325,27 @@ libvirt_virDomainSetSchedulerParameters(PyObject *self ATTRIBUTE_UNUSED, continue; switch (params[i].type) { - case VIR_DOMAIN_SCHED_FIELD_INT: + case VIR_TYPED_PARAM_INT: params[i].value.i = (int)PyInt_AS_LONG(val); break; - case VIR_DOMAIN_SCHED_FIELD_UINT: + case VIR_TYPED_PARAM_UINT: params[i].value.ui = (unsigned int)PyInt_AS_LONG(val); break; - case VIR_DOMAIN_SCHED_FIELD_LLONG: + case VIR_TYPED_PARAM_LLONG: params[i].value.l = (long long)PyLong_AsLongLong(val); break; - case VIR_DOMAIN_SCHED_FIELD_ULLONG: + case VIR_TYPED_PARAM_ULLONG: params[i].value.ul = (unsigned long long)PyLong_AsLongLong(val); break; - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: + case VIR_TYPED_PARAM_DOUBLE: params[i].value.d = (double)PyFloat_AsDouble(val); break; - case VIR_DOMAIN_SCHED_FIELD_BOOLEAN: + case VIR_TYPED_PARAM_BOOLEAN: { /* Hack - Python's definition of Py_True breaks strict * aliasing rules, so can't directly compare :-( -- 1.7.4.4

Rather mechanical in nature. * src/driver.h: Use newer virTypedParameter API names. * src/libvirt.c: Likewise. * daemon/remote.c: Likewise. * src/esx/esx_driver.c: Likewise. * src/libxl/libxl_driver.c: Likewise. * src/lxc/lxc_driver.c: Likewise. * src/qemu/qemu_driver.c: Likewise. * src/remote/remote_driver.c: Likewise. * src/test/test_driver.c: Likewise. * src/xen/xen_driver.c: Likewise. * src/xen/xen_hypervisor.c: Likewise. * src/xen/xen_hypervisor.h: Likewise. * src/xen/xend_internal.c: Likewise. * tools/virsh.c: Likewise. --- daemon/remote.c | 14 ++++---- src/driver.h | 14 ++++---- src/esx/esx_driver.c | 36 +++++++++++----------- src/libvirt.c | 20 ++++++------ src/libxl/libxl_driver.c | 14 ++++---- src/lxc/lxc_driver.c | 26 ++++++++-------- src/qemu/qemu_driver.c | 40 +++++++++++++------------- src/remote/remote_driver.c | 20 ++++++------ src/test/test_driver.c | 8 ++-- src/xen/xen_driver.c | 6 ++- src/xen/xen_hypervisor.c | 14 ++++---- src/xen/xen_hypervisor.h | 6 ++-- src/xen/xend_internal.c | 12 ++++---- tools/virsh.c | 68 ++++++++++++++++++++++---------------------- 14 files changed, 150 insertions(+), 148 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 0b7a9f5..90572c2 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -505,7 +505,7 @@ remoteDispatchDomainGetSchedulerParameters(struct qemud_server *server ATTRIBUTE remote_domain_get_scheduler_parameters_ret *ret) { virDomainPtr dom = NULL; - virSchedParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int i; int nparams = args->nparams; int rv = -1; @@ -590,7 +590,7 @@ remoteDispatchDomainSetSchedulerParameters(struct qemud_server *server ATTRIBUTE void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom = NULL; - virSchedParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int i, nparams; int rv = -1; @@ -661,7 +661,7 @@ remoteDispatchDomainSetSchedulerParametersFlags(struct qemud_server *server ATTR void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom = NULL; - virSchedParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int i, nparams; int rv = -1; @@ -1227,7 +1227,7 @@ remoteDispatchDomainSetMemoryParameters(struct qemud_server *server * args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom = NULL; - virMemoryParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int i, nparams; unsigned int flags; int rv = -1; @@ -1325,7 +1325,7 @@ remoteDispatchDomainGetMemoryParameters(struct qemud_server *server * ret) { virDomainPtr dom = NULL; - virMemoryParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int i; int nparams = args->nparams; unsigned int flags; @@ -1445,7 +1445,7 @@ remoteDispatchDomainSetBlkioParameters(struct qemud_server *server * args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom = NULL; - virBlkioParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int i, nparams; unsigned int flags; int rv = -1; @@ -1543,7 +1543,7 @@ remoteDispatchDomainGetBlkioParameters(struct qemud_server *server * ret) { virDomainPtr dom = NULL; - virBlkioParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int i; int nparams = args->nparams; unsigned int flags; diff --git a/src/driver.h b/src/driver.h index dcd4894..6ef19af 100644 --- a/src/driver.h +++ b/src/driver.h @@ -141,25 +141,25 @@ typedef int typedef int (*virDrvDomainSetMemoryParameters) (virDomainPtr domain, - virMemoryParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags); typedef int (*virDrvDomainGetMemoryParameters) (virDomainPtr domain, - virMemoryParameterPtr params, + virTypedParameterPtr params, int *nparams, unsigned int flags); typedef int (*virDrvDomainSetBlkioParameters) (virDomainPtr domain, - virBlkioParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags); typedef int (*virDrvDomainGetBlkioParameters) (virDomainPtr domain, - virBlkioParameterPtr params, + virTypedParameterPtr params, int *nparams, unsigned int flags); typedef int @@ -276,19 +276,19 @@ typedef char * typedef int (*virDrvDomainGetSchedulerParameters) (virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int *nparams); typedef int (*virDrvDomainSetSchedulerParameters) (virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams); typedef int (*virDrvDomainSetSchedulerParametersFlags) (virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags); diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 845dd4a..89df457 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -3492,12 +3492,12 @@ esxDomainSetAutostart(virDomainPtr domain, int autostart) * * Available parameters: * - * - reservation (VIR_DOMAIN_SCHED_FIELD_LLONG >= 0, in megaherz) + * - reservation (VIR_TYPED_PARAM_LLONG >= 0, in megaherz) * * The amount of CPU resource that is guaranteed to be available to the domain. * * - * - limit (VIR_DOMAIN_SCHED_FIELD_LLONG >= 0, or -1, in megaherz) + * - limit (VIR_TYPED_PARAM_LLONG >= 0, or -1, in megaherz) * * The CPU utilization of the domain will be limited to this value, even if * more CPU resources are available. If the limit is set to -1, the CPU @@ -3505,7 +3505,7 @@ esxDomainSetAutostart(virDomainPtr domain, int autostart) * must be greater than or equal to the reservation. * * - * - shares (VIR_DOMAIN_SCHED_FIELD_INT >= 0, or in {-1, -2, -3}, no unit) + * - shares (VIR_TYPED_PARAM_INT >= 0, or in {-1, -2, -3}, no unit) * * Shares are used to determine relative CPU allocation between domains. In * general, a domain with more shares gets proportionally more of the CPU @@ -3533,7 +3533,7 @@ esxDomainGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED, int *nparams) static int esxDomainGetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int *nparams) + virTypedParameterPtr params, int *nparams) { int result = -1; esxPrivate *priv = domain->conn->privateData; @@ -3569,10 +3569,10 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, dynamicProperty = dynamicProperty->_next) { if (STREQ(dynamicProperty->name, "config.cpuAllocation.reservation") && ! (mask & (1 << 0))) { - snprintf (params[i].field, VIR_DOMAIN_SCHED_FIELD_LENGTH, "%s", + snprintf (params[i].field, VIR_TYPED_PARAM_FIELD_LENGTH, "%s", "reservation"); - params[i].type = VIR_DOMAIN_SCHED_FIELD_LLONG; + params[i].type = VIR_TYPED_PARAM_LLONG; if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Long) < 0) { @@ -3585,10 +3585,10 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, } else if (STREQ(dynamicProperty->name, "config.cpuAllocation.limit") && ! (mask & (1 << 1))) { - snprintf (params[i].field, VIR_DOMAIN_SCHED_FIELD_LENGTH, "%s", + snprintf (params[i].field, VIR_TYPED_PARAM_FIELD_LENGTH, "%s", "limit"); - params[i].type = VIR_DOMAIN_SCHED_FIELD_LLONG; + params[i].type = VIR_TYPED_PARAM_LLONG; if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Long) < 0) { @@ -3601,10 +3601,10 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, } else if (STREQ(dynamicProperty->name, "config.cpuAllocation.shares") && ! (mask & (1 << 2))) { - snprintf (params[i].field, VIR_DOMAIN_SCHED_FIELD_LENGTH, "%s", + snprintf (params[i].field, VIR_TYPED_PARAM_FIELD_LENGTH, "%s", "shares"); - params[i].type = VIR_DOMAIN_SCHED_FIELD_INT; + params[i].type = VIR_TYPED_PARAM_INT; if (esxVI_SharesInfo_CastFromAnyType(dynamicProperty->val, &sharesInfo) < 0) { @@ -3658,7 +3658,7 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, static int esxDomainSetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int nparams) + virTypedParameterPtr params, int nparams) { int result = -1; esxPrivate *priv = domain->conn->privateData; @@ -3684,7 +3684,7 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, for (i = 0; i < nparams; ++i) { if (STREQ (params[i].field, "reservation") && - params[i].type == VIR_DOMAIN_SCHED_FIELD_LLONG) { + params[i].type == VIR_TYPED_PARAM_LLONG) { if (esxVI_Long_Alloc(&spec->cpuAllocation->reservation) < 0) { goto cleanup; } @@ -3698,7 +3698,7 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, spec->cpuAllocation->reservation->value = params[i].value.l; } else if (STREQ (params[i].field, "limit") && - params[i].type == VIR_DOMAIN_SCHED_FIELD_LLONG) { + params[i].type == VIR_TYPED_PARAM_LLONG) { if (esxVI_Long_Alloc(&spec->cpuAllocation->limit) < 0) { goto cleanup; } @@ -3713,7 +3713,7 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, spec->cpuAllocation->limit->value = params[i].value.l; } else if (STREQ (params[i].field, "shares") && - params[i].type == VIR_DOMAIN_SCHED_FIELD_INT) { + params[i].type == VIR_TYPED_PARAM_INT) { if (esxVI_SharesInfo_Alloc(&sharesInfo) < 0 || esxVI_Int_Alloc(&sharesInfo->shares) < 0) { goto cleanup; @@ -4506,7 +4506,7 @@ esxDomainSnapshotDelete(virDomainSnapshotPtr snapshot, unsigned int flags) static int -esxDomainSetMemoryParameters(virDomainPtr domain, virMemoryParameterPtr params, +esxDomainSetMemoryParameters(virDomainPtr domain, virTypedParameterPtr params, int nparams, unsigned int flags) { int result = -1; @@ -4534,7 +4534,7 @@ esxDomainSetMemoryParameters(virDomainPtr domain, virMemoryParameterPtr params, for (i = 0; i < nparams; ++i) { if (STREQ (params[i].field, VIR_DOMAIN_MEMORY_MIN_GUARANTEE) && - params[i].type == VIR_DOMAIN_SCHED_FIELD_ULLONG) { + params[i].type == VIR_TYPED_PARAM_ULLONG) { if (esxVI_Long_Alloc(&spec->memoryAllocation->reservation) < 0) { goto cleanup; } @@ -4578,7 +4578,7 @@ esxDomainSetMemoryParameters(virDomainPtr domain, virMemoryParameterPtr params, static int -esxDomainGetMemoryParameters(virDomainPtr domain, virMemoryParameterPtr params, +esxDomainGetMemoryParameters(virDomainPtr domain, virTypedParameterPtr params, int *nparams, unsigned int flags) { int result = -1; @@ -4622,7 +4622,7 @@ esxDomainGetMemoryParameters(virDomainPtr domain, virMemoryParameterPtr params, goto cleanup; } - params[0].type = VIR_DOMAIN_SCHED_FIELD_ULLONG; + params[0].type = VIR_TYPED_PARAM_ULLONG; params[0].value.ul = reservation->value * 1024; /* Scale from megabytes to kilobytes */ *nparams = 1; diff --git a/src/libvirt.c b/src/libvirt.c index 39c3213..54fc1fa 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -3003,7 +3003,7 @@ error: */ int virDomainSetMemoryParameters(virDomainPtr domain, - virMemoryParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags) { virConnectPtr conn; @@ -3057,15 +3057,15 @@ error: * As the value of @nparams is dynamic, call the API setting @nparams to 0 and * @params as NULL, the API returns the number of parameters supported by the * HV by updating @nparams on SUCCESS. The caller should then allocate @params - * array, i.e. (sizeof(@virMemoryParameter) * @nparams) bytes and call the API + * array, i.e. (sizeof(@virTypedParameter) * @nparams) bytes and call the API * again. * * Here is the sample code snippet: * * if ((virDomainGetMemoryParameters(dom, NULL, &nparams, 0) == 0) && * (nparams != 0)) { - * params = vshMalloc(ctl, sizeof(virMemoryParameter) * nparams); - * memset(params, 0, sizeof(virMemoryParameter) * nparams); + * params = vshMalloc(ctl, sizeof(*params) * nparams); + * memset(params, 0, sizeof(*params) * nparams); * if (virDomainGetMemoryParameters(dom, params, &nparams, 0)) { * vshError(ctl, "%s", _("Unable to get memory parameters")); * goto error; @@ -3079,7 +3079,7 @@ error: */ int virDomainGetMemoryParameters(virDomainPtr domain, - virMemoryParameterPtr params, + virTypedParameterPtr params, int *nparams, unsigned int flags) { virConnectPtr conn; @@ -3130,7 +3130,7 @@ error: */ int virDomainSetBlkioParameters(virDomainPtr domain, - virBlkioParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags) { virConnectPtr conn; @@ -3189,7 +3189,7 @@ error: */ int virDomainGetBlkioParameters(virDomainPtr domain, - virBlkioParameterPtr params, + virTypedParameterPtr params, int *nparams, unsigned int flags) { virConnectPtr conn; @@ -5434,7 +5434,7 @@ error: */ int virDomainGetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int *nparams) + virTypedParameterPtr params, int *nparams) { virConnectPtr conn; @@ -5484,7 +5484,7 @@ error: */ int virDomainSetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int nparams) + virTypedParameterPtr params, int nparams) { virConnectPtr conn; @@ -5540,7 +5540,7 @@ error: */ int virDomainSetSchedulerParametersFlags(virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags) { diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 0d48da2..492f61a 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -2950,7 +2950,7 @@ cleanup: } static int -libxlDomainGetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, +libxlDomainGetSchedulerParameters(virDomainPtr dom, virTypedParameterPtr params, int *nparams) { libxlDriverPrivatePtr driver = dom->conn->privateData; @@ -3002,7 +3002,7 @@ libxlDomainGetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, } params[0].value.ui = sc_info.weight; - params[0].type = VIR_DOMAIN_SCHED_FIELD_UINT; + params[0].type = VIR_TYPED_PARAM_UINT; if (virStrcpyStatic(params[0].field, "weight") == NULL) { libxlError(VIR_ERR_INTERNAL_ERROR, "%s", _("Field weight too long for destination")); @@ -3010,7 +3010,7 @@ libxlDomainGetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, } params[1].value.ui = sc_info.cap; - params[1].type = VIR_DOMAIN_SCHED_FIELD_UINT; + params[1].type = VIR_TYPED_PARAM_UINT; if (virStrcpyStatic(params[1].field, "cap") == NULL) { libxlError(VIR_ERR_INTERNAL_ERROR, "%s", _("Field cap too long for destination")); @@ -3027,7 +3027,7 @@ cleanup: } static int -libxlDomainSetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, +libxlDomainSetSchedulerParameters(virDomainPtr dom, virTypedParameterPtr params, int nparams) { libxlDriverPrivatePtr driver = dom->conn->privateData; @@ -3075,10 +3075,10 @@ libxlDomainSetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, } for (i = 0; i < nparams; ++i) { - virSchedParameterPtr param = ¶ms[i]; + virTypedParameterPtr param = ¶ms[i]; if (STREQ(param->field, "weight")) { - if (param->type != VIR_DOMAIN_SCHED_FIELD_UINT) { + if (param->type != VIR_TYPED_PARAM_UINT) { libxlError(VIR_ERR_INVALID_ARG, "%s", _("invalid type for weight tunable, expected a 'uint'")); goto cleanup; @@ -3086,7 +3086,7 @@ libxlDomainSetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, sc_info.weight = params[i].value.ui; } else if (STREQ(param->field, "cap")) { - if (param->type != VIR_DOMAIN_SCHED_FIELD_UINT) { + if (param->type != VIR_TYPED_PARAM_UINT) { libxlError(VIR_ERR_INVALID_ARG, "%s", _("invalid type for cap tunable, expected a 'uint'")); goto cleanup; diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 9e09c95..00e3f2a 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -745,7 +745,7 @@ cleanup: } static int lxcDomainSetMemoryParameters(virDomainPtr dom, - virMemoryParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags ATTRIBUTE_UNUSED) { @@ -774,11 +774,11 @@ static int lxcDomainSetMemoryParameters(virDomainPtr dom, ret = 0; for (i = 0; i < nparams; i++) { - virMemoryParameterPtr param = ¶ms[i]; + virTypedParameterPtr param = ¶ms[i]; if (STREQ(param->field, VIR_DOMAIN_MEMORY_HARD_LIMIT)) { int rc; - if (param->type != VIR_DOMAIN_MEMORY_PARAM_ULLONG) { + if (param->type != VIR_TYPED_PARAM_ULLONG) { lxcError(VIR_ERR_INVALID_ARG, "%s", _("invalid type for memory hard_limit tunable, expected a 'ullong'")); ret = -1; @@ -793,7 +793,7 @@ static int lxcDomainSetMemoryParameters(virDomainPtr dom, } } else if (STREQ(param->field, VIR_DOMAIN_MEMORY_SOFT_LIMIT)) { int rc; - if (param->type != VIR_DOMAIN_MEMORY_PARAM_ULLONG) { + if (param->type != VIR_TYPED_PARAM_ULLONG) { lxcError(VIR_ERR_INVALID_ARG, "%s", _("invalid type for memory soft_limit tunable, expected a 'ullong'")); ret = -1; @@ -808,7 +808,7 @@ static int lxcDomainSetMemoryParameters(virDomainPtr dom, } } else if (STREQ(param->field, VIR_DOMAIN_MEMORY_SWAP_HARD_LIMIT)) { int rc; - if (param->type != VIR_DOMAIN_MEMORY_PARAM_ULLONG) { + if (param->type != VIR_TYPED_PARAM_ULLONG) { lxcError(VIR_ERR_INVALID_ARG, "%s", _("invalid type for swap_hard_limit tunable, expected a 'ullong'")); ret = -1; @@ -842,7 +842,7 @@ cleanup: } static int lxcDomainGetMemoryParameters(virDomainPtr dom, - virMemoryParameterPtr params, + virTypedParameterPtr params, int *nparams, unsigned int flags ATTRIBUTE_UNUSED) { @@ -884,10 +884,10 @@ static int lxcDomainGetMemoryParameters(virDomainPtr dom, } for (i = 0; i < LXC_NB_MEM_PARAM; i++) { - virMemoryParameterPtr param = ¶ms[i]; + virTypedParameterPtr param = ¶ms[i]; val = 0; param->value.ul = 0; - param->type = VIR_DOMAIN_MEMORY_PARAM_ULLONG; + param->type = VIR_TYPED_PARAM_ULLONG; switch(i) { case 0: /* fill memory hard limit here */ @@ -2162,7 +2162,7 @@ static char *lxcGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED, } static int lxcSetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams) { lxc_driver_t *driver = domain->conn->privateData; @@ -2189,7 +2189,7 @@ static int lxcSetSchedulerParameters(virDomainPtr domain, goto cleanup; for (i = 0; i < nparams; i++) { - virSchedParameterPtr param = ¶ms[i]; + virTypedParameterPtr param = ¶ms[i]; if (STRNEQ(param->field, "cpu_shares")) { lxcError(VIR_ERR_INVALID_ARG, @@ -2197,7 +2197,7 @@ static int lxcSetSchedulerParameters(virDomainPtr domain, goto cleanup; } - if (param->type != VIR_DOMAIN_SCHED_FIELD_ULLONG) { + if (param->type != VIR_TYPED_PARAM_ULLONG) { lxcError(VIR_ERR_INVALID_ARG, "%s", _("Invalid type for cpu_shares tunable, expected a 'ullong'")); goto cleanup; @@ -2223,7 +2223,7 @@ cleanup: } static int lxcGetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int *nparams) { lxc_driver_t *driver = domain->conn->privateData; @@ -2263,7 +2263,7 @@ static int lxcGetSchedulerParameters(virDomainPtr domain, "%s", _("Field cpu_shares too big for destination")); goto cleanup; } - params[0].type = VIR_DOMAIN_SCHED_FIELD_ULLONG; + params[0].type = VIR_TYPED_PARAM_ULLONG; *nparams = 1; ret = 0; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index c7cd99b..7922ae6 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4656,7 +4656,7 @@ cleanup: } static int qemuDomainSetBlkioParameters(virDomainPtr dom, - virBlkioParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags) { @@ -4695,11 +4695,11 @@ static int qemuDomainSetBlkioParameters(virDomainPtr dom, ret = 0; for (i = 0; i < nparams; i++) { - virBlkioParameterPtr param = ¶ms[i]; + virTypedParameterPtr param = ¶ms[i]; if (STREQ(param->field, VIR_DOMAIN_BLKIO_WEIGHT)) { int rc; - if (param->type != VIR_DOMAIN_BLKIO_PARAM_UINT) { + if (param->type != VIR_TYPED_PARAM_UINT) { qemuReportError(VIR_ERR_INVALID_ARG, "%s", _("invalid type for blkio weight tunable, expected a 'unsigned int'")); ret = -1; @@ -4735,7 +4735,7 @@ cleanup: } static int qemuDomainGetBlkioParameters(virDomainPtr dom, - virBlkioParameterPtr params, + virTypedParameterPtr params, int *nparams, unsigned int flags) { @@ -4789,10 +4789,10 @@ static int qemuDomainGetBlkioParameters(virDomainPtr dom, } for (i = 0; i < *nparams; i++) { - virBlkioParameterPtr param = ¶ms[i]; + virTypedParameterPtr param = ¶ms[i]; val = 0; param->value.ui = 0; - param->type = VIR_DOMAIN_BLKIO_PARAM_UINT; + param->type = VIR_TYPED_PARAM_UINT; switch (i) { case 0: /* fill blkio weight here */ @@ -4828,7 +4828,7 @@ cleanup: } static int qemuDomainSetMemoryParameters(virDomainPtr dom, - virMemoryParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags ATTRIBUTE_UNUSED) { @@ -4867,11 +4867,11 @@ static int qemuDomainSetMemoryParameters(virDomainPtr dom, ret = 0; for (i = 0; i < nparams; i++) { - virMemoryParameterPtr param = ¶ms[i]; + virTypedParameterPtr param = ¶ms[i]; if (STREQ(param->field, VIR_DOMAIN_MEMORY_HARD_LIMIT)) { int rc; - if (param->type != VIR_DOMAIN_MEMORY_PARAM_ULLONG) { + if (param->type != VIR_TYPED_PARAM_ULLONG) { qemuReportError(VIR_ERR_INVALID_ARG, "%s", _("invalid type for memory hard_limit tunable, expected a 'ullong'")); ret = -1; @@ -4886,7 +4886,7 @@ static int qemuDomainSetMemoryParameters(virDomainPtr dom, } } else if (STREQ(param->field, VIR_DOMAIN_MEMORY_SOFT_LIMIT)) { int rc; - if (param->type != VIR_DOMAIN_MEMORY_PARAM_ULLONG) { + if (param->type != VIR_TYPED_PARAM_ULLONG) { qemuReportError(VIR_ERR_INVALID_ARG, "%s", _("invalid type for memory soft_limit tunable, expected a 'ullong'")); ret = -1; @@ -4901,7 +4901,7 @@ static int qemuDomainSetMemoryParameters(virDomainPtr dom, } } else if (STREQ(param->field, VIR_DOMAIN_MEMORY_SWAP_HARD_LIMIT)) { int rc; - if (param->type != VIR_DOMAIN_MEMORY_PARAM_ULLONG) { + if (param->type != VIR_TYPED_PARAM_ULLONG) { qemuReportError(VIR_ERR_INVALID_ARG, "%s", _("invalid type for swap_hard_limit tunable, expected a 'ullong'")); ret = -1; @@ -4934,7 +4934,7 @@ cleanup: } static int qemuDomainGetMemoryParameters(virDomainPtr dom, - virMemoryParameterPtr params, + virTypedParameterPtr params, int *nparams, unsigned int flags ATTRIBUTE_UNUSED) { @@ -4988,10 +4988,10 @@ static int qemuDomainGetMemoryParameters(virDomainPtr dom, } for (i = 0; i < QEMU_NB_MEM_PARAM; i++) { - virMemoryParameterPtr param = ¶ms[i]; + virTypedParameterPtr param = ¶ms[i]; val = 0; param->value.ul = 0; - param->type = VIR_DOMAIN_MEMORY_PARAM_ULLONG; + param->type = VIR_TYPED_PARAM_ULLONG; switch (i) { case 0: /* fill memory hard limit here */ @@ -5058,7 +5058,7 @@ cleanup: } static int qemuSetSchedulerParametersFlags(virDomainPtr dom, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags) { @@ -5119,11 +5119,11 @@ static int qemuSetSchedulerParametersFlags(virDomainPtr dom, } for (i = 0; i < nparams; i++) { - virSchedParameterPtr param = ¶ms[i]; + virTypedParameterPtr param = ¶ms[i]; if (STREQ(param->field, "cpu_shares")) { int rc; - if (param->type != VIR_DOMAIN_SCHED_FIELD_ULLONG) { + if (param->type != VIR_TYPED_PARAM_ULLONG) { qemuReportError(VIR_ERR_INVALID_ARG, "%s", _("invalid type for cpu_shares tunable, expected a 'ullong'")); goto cleanup; @@ -5173,7 +5173,7 @@ cleanup: } static int qemuSetSchedulerParameters(virDomainPtr dom, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams) { return qemuSetSchedulerParametersFlags(dom, @@ -5183,7 +5183,7 @@ static int qemuSetSchedulerParameters(virDomainPtr dom, } static int qemuGetSchedulerParameters(virDomainPtr dom, - virSchedParameterPtr params, + virTypedParameterPtr params, int *nparams) { struct qemud_driver *driver = dom->conn->privateData; @@ -5233,7 +5233,7 @@ static int qemuGetSchedulerParameters(virDomainPtr dom, } out: params[0].value.ul = val; - params[0].type = VIR_DOMAIN_SCHED_FIELD_ULLONG; + params[0].type = VIR_TYPED_PARAM_ULLONG; if (virStrcpyStatic(params[0].field, "cpu_shares") == NULL) { qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("Field cpu_shares too long for destination")); diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index b4208a3..489cdfa 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1781,7 +1781,7 @@ done: static int remoteDomainSetMemoryParameters (virDomainPtr domain, - virMemoryParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags) { @@ -1856,7 +1856,7 @@ done: static int remoteDomainGetMemoryParameters (virDomainPtr domain, - virMemoryParameterPtr params, int *nparams, + virTypedParameterPtr params, int *nparams, unsigned int flags) { int rv = -1; @@ -1950,9 +1950,9 @@ done: static int remoteDomainSetBlkioParameters (virDomainPtr domain, - virBlkioParameterPtr params, - int nparams, - unsigned int flags) + virTypedParameterPtr params, + int nparams, + unsigned int flags) { int rv = -1; remote_domain_set_blkio_parameters_args args; @@ -2025,8 +2025,8 @@ done: static int remoteDomainGetBlkioParameters (virDomainPtr domain, - virBlkioParameterPtr params, int *nparams, - unsigned int flags) + virTypedParameterPtr params, int *nparams, + unsigned int flags) { int rv = -1; remote_domain_get_blkio_parameters_args args; @@ -2470,7 +2470,7 @@ done: static int remoteDomainGetSchedulerParameters (virDomainPtr domain, - virSchedParameterPtr params, int *nparams) + virTypedParameterPtr params, int *nparams) { int rv = -1; remote_domain_get_scheduler_parameters_args args; @@ -2540,7 +2540,7 @@ done: static int remoteDomainSetSchedulerParameters (virDomainPtr domain, - virSchedParameterPtr params, int nparams) + virTypedParameterPtr params, int nparams) { int rv = -1; remote_domain_set_scheduler_parameters_args args; @@ -2605,7 +2605,7 @@ done: static int remoteDomainSetSchedulerParametersFlags(virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags) { diff --git a/src/test/test_driver.c b/src/test/test_driver.c index e86bc4e..f1cc681 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2635,7 +2635,7 @@ static char *testDomainGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED, } static int testDomainGetSchedulerParams(virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int *nparams) { testConnPtr privconn = domain->conn->privateData; @@ -2657,7 +2657,7 @@ static int testDomainGetSchedulerParams(virDomainPtr domain, goto cleanup; } strcpy(params[0].field, "weight"); - params[0].type = VIR_DOMAIN_SCHED_FIELD_UINT; + params[0].type = VIR_TYPED_PARAM_UINT; /* XXX */ /*params[0].value.ui = privdom->weight;*/ params[0].value.ui = 50; @@ -2673,7 +2673,7 @@ cleanup: static int testDomainSetSchedulerParams(virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams) { testConnPtr privconn = domain->conn->privateData; @@ -2695,7 +2695,7 @@ static int testDomainSetSchedulerParams(virDomainPtr domain, testError(VIR_ERR_INVALID_ARG, "field"); goto cleanup; } - if (params[i].type != VIR_DOMAIN_SCHED_FIELD_UINT) { + if (params[i].type != VIR_TYPED_PARAM_UINT) { testError(VIR_ERR_INVALID_ARG, "type"); goto cleanup; } diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index fea8548..f527a7a 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -1677,7 +1677,8 @@ xenUnifiedDomainGetSchedulerType (virDomainPtr dom, int *nparams) static int xenUnifiedDomainGetSchedulerParameters (virDomainPtr dom, - virSchedParameterPtr params, int *nparams) + virTypedParameterPtr params, + int *nparams) { GET_PRIVATE(dom->conn); int i, ret; @@ -1694,7 +1695,8 @@ xenUnifiedDomainGetSchedulerParameters (virDomainPtr dom, static int xenUnifiedDomainSetSchedulerParameters (virDomainPtr dom, - virSchedParameterPtr params, int nparams) + virTypedParameterPtr params, + int nparams) { GET_PRIVATE(dom->conn); int i, ret; diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c index 253164e..21e6645 100644 --- a/src/xen/xen_hypervisor.c +++ b/src/xen/xen_hypervisor.c @@ -1,7 +1,7 @@ /* * xen_internal.c: direct access to Xen hypervisor level * - * Copyright (C) 2005-2010 Red Hat, Inc. + * Copyright (C) 2005-2011 Red Hat, Inc. * * See COPYING.LIB for the License of this software * @@ -1242,7 +1242,7 @@ static const char *str_cap = "cap"; */ int xenHypervisorGetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int *nparams) + virTypedParameterPtr params, int *nparams) { xenUnifiedPrivatePtr priv; @@ -1317,7 +1317,7 @@ xenHypervisorGetSchedulerParameters(virDomainPtr domain, "Weight %s too big for destination", str_weight); return -1; } - params[0].type = VIR_DOMAIN_SCHED_FIELD_UINT; + params[0].type = VIR_TYPED_PARAM_UINT; params[0].value.ui = op_dom.u.getschedinfo.u.credit.weight; if (virStrcpyStatic(params[1].field, str_cap) == NULL) { @@ -1325,7 +1325,7 @@ xenHypervisorGetSchedulerParameters(virDomainPtr domain, "Cap %s too big for destination", str_cap); return -1; } - params[1].type = VIR_DOMAIN_SCHED_FIELD_UINT; + params[1].type = VIR_TYPED_PARAM_UINT; params[1].value.ui = op_dom.u.getschedinfo.u.credit.cap; *nparams = XEN_SCHED_CRED_NPARAM; @@ -1351,7 +1351,7 @@ xenHypervisorGetSchedulerParameters(virDomainPtr domain, */ int xenHypervisorSetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int nparams) + virTypedParameterPtr params, int nparams) { int i; unsigned int val; @@ -1424,7 +1424,7 @@ xenHypervisorSetSchedulerParameters(virDomainPtr domain, for (i = 0; i < nparams; i++) { memset(&buf, 0, sizeof(buf)); if (STREQ (params[i].field, str_weight) && - params[i].type == VIR_DOMAIN_SCHED_FIELD_UINT) { + params[i].type == VIR_TYPED_PARAM_UINT) { val = params[i].value.ui; if ((val < 1) || (val > USHRT_MAX)) { snprintf(buf, sizeof(buf), _("Credit scheduler weight parameter (%d) is out of range (1-65535)"), val); @@ -1433,7 +1433,7 @@ xenHypervisorSetSchedulerParameters(virDomainPtr domain, } op_dom.u.getschedinfo.u.credit.weight = val; } else if (STREQ (params[i].field, str_cap) && - params[i].type == VIR_DOMAIN_SCHED_FIELD_UINT) { + params[i].type == VIR_TYPED_PARAM_UINT) { val = params[i].value.ui; if (val >= USHRT_MAX) { snprintf(buf, sizeof(buf), _("Credit scheduler cap parameter (%d) is out of range (0-65534)"), val); diff --git a/src/xen/xen_hypervisor.h b/src/xen/xen_hypervisor.h index f7e7699..02ff63a 100644 --- a/src/xen/xen_hypervisor.h +++ b/src/xen/xen_hypervisor.h @@ -1,7 +1,7 @@ /* * xen_internal.h: internal API for direct access to Xen hypervisor level * - * Copyright (C) 2005, 2010 Red Hat, Inc. + * Copyright (C) 2005, 2010-2011 Red Hat, Inc. * * See COPYING.LIB for the License of this software * @@ -101,12 +101,12 @@ char * xenHypervisorGetSchedulerType (virDomainPtr domain, ATTRIBUTE_NONNULL (1); int xenHypervisorGetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int *nparams) ATTRIBUTE_NONNULL (1); int xenHypervisorSetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams) ATTRIBUTE_NONNULL (1); diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index 1a3c3b4..f94dd8b 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -3597,7 +3597,7 @@ static const char *str_cap = "cap"; */ static int xenDaemonGetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int *nparams) + virTypedParameterPtr params, int *nparams) { xenUnifiedPrivatePtr priv; struct sexpr *root; @@ -3667,7 +3667,7 @@ xenDaemonGetSchedulerParameters(virDomainPtr domain, str_weight); goto error; } - params[0].type = VIR_DOMAIN_SCHED_FIELD_UINT; + params[0].type = VIR_TYPED_PARAM_UINT; params[0].value.ui = sexpr_int(root, "domain/cpu_weight"); if (virStrcpyStatic(params[1].field, str_cap) == NULL) { @@ -3675,7 +3675,7 @@ xenDaemonGetSchedulerParameters(virDomainPtr domain, _("Cap %s too big for destination"), str_cap); goto error; } - params[1].type = VIR_DOMAIN_SCHED_FIELD_UINT; + params[1].type = VIR_TYPED_PARAM_UINT; params[1].value.ui = sexpr_int(root, "domain/cpu_cap"); *nparams = XEN_SCHED_CRED_NPARAM; ret = 0; @@ -3703,7 +3703,7 @@ error: */ static int xenDaemonSetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int nparams) + virTypedParameterPtr params, int nparams) { xenUnifiedPrivatePtr priv; struct sexpr *root; @@ -3754,10 +3754,10 @@ xenDaemonSetSchedulerParameters(virDomainPtr domain, memset(&buf_cap, 0, VIR_UUID_BUFLEN); for (i = 0; i < nparams; i++) { if (STREQ (params[i].field, str_weight) && - params[i].type == VIR_DOMAIN_SCHED_FIELD_UINT) { + params[i].type == VIR_TYPED_PARAM_UINT) { snprintf(buf_weight, sizeof(buf_weight), "%u", params[i].value.ui); } else if (STREQ (params[i].field, str_cap) && - params[i].type == VIR_DOMAIN_SCHED_FIELD_UINT) { + params[i].type == VIR_TYPED_PARAM_UINT) { snprintf(buf_cap, sizeof(buf_cap), "%u", params[i].value.ui); } else { virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__); diff --git a/tools/virsh.c b/tools/virsh.c index b43c167..1779843 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -1617,13 +1617,13 @@ static const vshCmdOptDef opts_schedinfo[] = { static int cmdSchedInfoUpdate(vshControl *ctl, const vshCmd *cmd, - virSchedParameterPtr param) + virTypedParameterPtr param) { const char *data = NULL; /* Legacy 'weight' parameter */ if (STREQ(param->field, "weight") && - param->type == VIR_DOMAIN_SCHED_FIELD_UINT && + param->type == VIR_TYPED_PARAM_UINT && vshCommandOptBool(cmd, "weight")) { int val; if (vshCommandOptInt(cmd, "weight", &val) <= 0) { @@ -1637,7 +1637,7 @@ cmdSchedInfoUpdate(vshControl *ctl, const vshCmd *cmd, /* Legacy 'cap' parameter */ if (STREQ(param->field, "cap") && - param->type == VIR_DOMAIN_SCHED_FIELD_UINT && + param->type == VIR_TYPED_PARAM_UINT && vshCommandOptBool(cmd, "cap")) { int val; if (vshCommandOptInt(cmd, "cap", &val) <= 0) { @@ -1665,41 +1665,41 @@ cmdSchedInfoUpdate(vshControl *ctl, const vshCmd *cmd, return 0; switch (param->type) { - case VIR_DOMAIN_SCHED_FIELD_INT: + case VIR_TYPED_PARAM_INT: if (virStrToLong_i(val, NULL, 10, ¶m->value.i) < 0) { vshError(ctl, "%s", _("Invalid value for parameter, expecting an int")); return -1; } break; - case VIR_DOMAIN_SCHED_FIELD_UINT: + case VIR_TYPED_PARAM_UINT: if (virStrToLong_ui(val, NULL, 10, ¶m->value.ui) < 0) { vshError(ctl, "%s", _("Invalid value for parameter, expecting an unsigned int")); return -1; } break; - case VIR_DOMAIN_SCHED_FIELD_LLONG: + case VIR_TYPED_PARAM_LLONG: if (virStrToLong_ll(val, NULL, 10, ¶m->value.l) < 0) { vshError(ctl, "%s", _("Invalid value for parameter, expecting a long long")); return -1; } break; - case VIR_DOMAIN_SCHED_FIELD_ULLONG: + case VIR_TYPED_PARAM_ULLONG: if (virStrToLong_ull(val, NULL, 10, ¶m->value.ul) < 0) { vshError(ctl, "%s", _("Invalid value for parameter, expecting an unsigned long long")); return -1; } break; - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: + case VIR_TYPED_PARAM_DOUBLE: if (virStrToDouble(val, NULL, ¶m->value.d) < 0) { vshError(ctl, "%s", _("Invalid value for parameter, expecting a double")); return -1; } break; - case VIR_DOMAIN_SCHED_FIELD_BOOLEAN: + case VIR_TYPED_PARAM_BOOLEAN: param->value.b = STREQ(val, "0") ? 0 : 1; } return 1; @@ -1714,7 +1714,7 @@ cmdSchedinfo(vshControl *ctl, const vshCmd *cmd) { char *schedulertype; virDomainPtr dom; - virSchedParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int nparams = 0; int update = 0; int i, ret; @@ -1755,9 +1755,9 @@ cmdSchedinfo(vshControl *ctl, const vshCmd *cmd) } if (nparams) { - params = vshMalloc(ctl, sizeof(virSchedParameter)* nparams); + params = vshMalloc(ctl, sizeof(*params) * nparams); - memset(params, 0, sizeof(virSchedParameter)* nparams); + memset(params, 0, sizeof(*params) * nparams); ret = virDomainGetSchedulerParameters(dom, params, &nparams); if (ret == -1) goto cleanup; @@ -1800,22 +1800,22 @@ cmdSchedinfo(vshControl *ctl, const vshCmd *cmd) ret_val = true; for (i = 0; i < nparams; i++){ switch (params[i].type) { - case VIR_DOMAIN_SCHED_FIELD_INT: + case VIR_TYPED_PARAM_INT: vshPrint(ctl, "%-15s: %d\n", params[i].field, params[i].value.i); break; - case VIR_DOMAIN_SCHED_FIELD_UINT: + case VIR_TYPED_PARAM_UINT: vshPrint(ctl, "%-15s: %u\n", params[i].field, params[i].value.ui); break; - case VIR_DOMAIN_SCHED_FIELD_LLONG: + case VIR_TYPED_PARAM_LLONG: vshPrint(ctl, "%-15s: %lld\n", params[i].field, params[i].value.l); break; - case VIR_DOMAIN_SCHED_FIELD_ULLONG: + case VIR_TYPED_PARAM_ULLONG: vshPrint(ctl, "%-15s: %llu\n", params[i].field, params[i].value.ul); break; - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: + case VIR_TYPED_PARAM_DOUBLE: vshPrint(ctl, "%-15s: %f\n", params[i].field, params[i].value.d); break; - case VIR_DOMAIN_SCHED_FIELD_BOOLEAN: + case VIR_TYPED_PARAM_BOOLEAN: vshPrint(ctl, "%-15s: %d\n", params[i].field, params[i].value.b); break; default: @@ -3181,7 +3181,7 @@ cmdBlkiotune(vshControl * ctl, const vshCmd * cmd) int weight = 0; int nparams = 0; unsigned int i = 0; - virBlkioParameterPtr params = NULL, temp = NULL; + virTypedParameterPtr params = NULL, temp = NULL; bool ret = false; if (!vshConnectionUsability(ctl, ctl->conn)) @@ -3228,27 +3228,27 @@ cmdBlkiotune(vshControl * ctl, const vshCmd * cmd) for (i = 0; i < nparams; i++) { switch (params[i].type) { - case VIR_DOMAIN_BLKIO_PARAM_INT: + case VIR_TYPED_PARAM_INT: vshPrint(ctl, "%-15s: %d\n", params[i].field, params[i].value.i); break; - case VIR_DOMAIN_BLKIO_PARAM_UINT: + case VIR_TYPED_PARAM_UINT: vshPrint(ctl, "%-15s: %u\n", params[i].field, params[i].value.ui); break; - case VIR_DOMAIN_BLKIO_PARAM_LLONG: + case VIR_TYPED_PARAM_LLONG: vshPrint(ctl, "%-15s: %lld\n", params[i].field, params[i].value.l); break; - case VIR_DOMAIN_BLKIO_PARAM_ULLONG: + case VIR_TYPED_PARAM_ULLONG: vshPrint(ctl, "%-15s: %llu\n", params[i].field, params[i].value.ul); break; - case VIR_DOMAIN_BLKIO_PARAM_DOUBLE: + case VIR_TYPED_PARAM_DOUBLE: vshPrint(ctl, "%-15s: %f\n", params[i].field, params[i].value.d); break; - case VIR_DOMAIN_BLKIO_PARAM_BOOLEAN: + case VIR_TYPED_PARAM_BOOLEAN: vshPrint(ctl, "%-15s: %d\n", params[i].field, params[i].value.b); break; @@ -3264,7 +3264,7 @@ cmdBlkiotune(vshControl * ctl, const vshCmd * cmd) for (i = 0; i < nparams; i++) { temp = ¶ms[i]; - temp->type = VIR_DOMAIN_BLKIO_PARAM_UINT; + temp->type = VIR_TYPED_PARAM_UINT; if (weight) { temp->value.ui = weight; @@ -3318,7 +3318,7 @@ cmdMemtune(vshControl * ctl, const vshCmd * cmd) long long min_guarantee = 0; int nparams = 0; unsigned int i = 0; - virMemoryParameterPtr params = NULL, temp = NULL; + virTypedParameterPtr params = NULL, temp = NULL; bool ret = false; if (!vshConnectionUsability(ctl, ctl->conn)) @@ -3371,30 +3371,30 @@ cmdMemtune(vshControl * ctl, const vshCmd * cmd) for (i = 0; i < nparams; i++) { switch (params[i].type) { - case VIR_DOMAIN_MEMORY_PARAM_INT: + case VIR_TYPED_PARAM_INT: vshPrint(ctl, "%-15s: %d\n", params[i].field, params[i].value.i); break; - case VIR_DOMAIN_MEMORY_PARAM_UINT: + case VIR_TYPED_PARAM_UINT: vshPrint(ctl, "%-15s: %u\n", params[i].field, params[i].value.ui); break; - case VIR_DOMAIN_MEMORY_PARAM_LLONG: + case VIR_TYPED_PARAM_LLONG: vshPrint(ctl, "%-15s: %lld\n", params[i].field, params[i].value.l); break; - case VIR_DOMAIN_MEMORY_PARAM_ULLONG: + case VIR_TYPED_PARAM_ULLONG: if (params[i].value.ul == VIR_DOMAIN_MEMORY_PARAM_UNLIMITED) vshPrint(ctl, "%-15s: unlimited\n", params[i].field); else vshPrint(ctl, "%-15s: %llu kB\n", params[i].field, params[i].value.ul); break; - case VIR_DOMAIN_MEMORY_PARAM_DOUBLE: + case VIR_TYPED_PARAM_DOUBLE: vshPrint(ctl, "%-15s: %f\n", params[i].field, params[i].value.d); break; - case VIR_DOMAIN_MEMORY_PARAM_BOOLEAN: + case VIR_TYPED_PARAM_BOOLEAN: vshPrint(ctl, "%-15s: %d\n", params[i].field, params[i].value.b); break; @@ -3410,7 +3410,7 @@ cmdMemtune(vshControl * ctl, const vshCmd * cmd) for (i = 0; i < nparams; i++) { temp = ¶ms[i]; - temp->type = VIR_DOMAIN_MEMORY_PARAM_ULLONG; + temp->type = VIR_TYPED_PARAM_ULLONG; /* * Some magic here, this is used to fill the params structure with -- 1.7.4.4

* src/remote/remote_protocol.x (remote_typed_param_value) (remote_typed_param): New types. (remote_sched_param_value, remote_sched_param) (remote_blkio_param_value, remote_blkio_param) (remote_memory_param_value, remote_memory_param): Delete. (remote_domain_get_scheduler_parameters_ret) (remote_domain_set_scheduler_parameters_args) (remote_domain_set_scheduler_parameters_flags_args) (remote_domain_set_blkio_parameters_args) (remote_domain_get_blkio_parameters_ret) (remote_domain_set_memory_parameters_args) (remote_domain_get_memory_parameters_ret): Update clients. * src/remote_protocol-structs: Likewise. * src/remote/remote_driver.c (remoteSerializeTypedParameters) (remoteDeserializeTypedParameters): New functions. (remoteDomainSetMemoryParameters) (remoteDomainGetMemoryParameters, remoteDomainSetBlkioParameters) (remoteDomainGetBlkioParameters) (remoteDomainGetSchedulerParameters) (remoteDomainSetSchedulerParameters) (remoteDomainSetSchedulerParametersFlags): Update clients. * daemon/remote.c (remoteSerializeTypedParameters) (remoteDeserializeTypedParameters): New functions. (remoteDispatchDomainGetSchedulerParameters) (remoteDispatchDomainSetSchedulerParameters) (remoteDispatchDomainSetSchedulerParametersFlags) (remoteDispatchDomainSetMemoryParameters) (remoteDispatchDomainGetMemoryParameters) (remoteDispatchDomainSetBlkioParameters) (remoteDispatchDomainGetBlkioParameters): Update clients. --- daemon/remote.c | 502 ++++++++++++++--------------------------- src/remote/remote_driver.c | 467 ++++++++++++++------------------------- src/remote/remote_protocol.x | 74 ++----- src/remote_protocol-structs | 52 +---- 4 files changed, 365 insertions(+), 730 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 90572c2..75abddd 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -495,6 +495,143 @@ cleanup: return rv; } +/* Helper to serialize typed parameters. */ +static int +remoteSerializeTypedParameters(virTypedParameterPtr params, + int nparams, + u_int *ret_params_len, + remote_typed_param **ret_params_val) +{ + int i; + int rv = -1; + remote_typed_param *val; + + *ret_params_len = nparams; + if (VIR_ALLOC_N(val, nparams) < 0) { + virReportOOMError(); + goto cleanup; + } + + for (i = 0; i < nparams; ++i) { + /* remoteDispatchClientRequest will free this: */ + val[i].field = strdup (params[i].field); + if (val[i].field == NULL) { + virReportOOMError(); + goto cleanup; + } + val[i].value.type = params[i].type; + switch (params[i].type) { + case VIR_TYPED_PARAM_INT: + val[i].value.remote_typed_param_value_u.i = params[i].value.i; + break; + case VIR_TYPED_PARAM_UINT: + val[i].value.remote_typed_param_value_u.ui = params[i].value.ui; + break; + case VIR_TYPED_PARAM_LLONG: + val[i].value.remote_typed_param_value_u.l = params[i].value.l; + break; + case VIR_TYPED_PARAM_ULLONG: + val[i].value.remote_typed_param_value_u.ul = params[i].value.ul; + break; + case VIR_TYPED_PARAM_DOUBLE: + val[i].value.remote_typed_param_value_u.d = params[i].value.d; + break; + case VIR_TYPED_PARAM_BOOLEAN: + val[i].value.remote_typed_param_value_u.b = params[i].value.b; + break; + default: + virNetError(VIR_ERR_RPC, _("unknown parameter type: %d"), + params[i].type); + goto cleanup; + } + } + + *ret_params_val = val; + val = NULL; + rv = 0; + +cleanup: + if (val) { + for (i = 0; i < nparams; i++) + VIR_FREE(val[i].field); + VIR_FREE(val); + } + return rv; +} + +/* Helper to deserialize typed parameters. */ +static virTypedParameterPtr +remoteDeserializeTypedParameters(u_int args_params_len, + remote_typed_param *args_params_val, + int limit, + int *nparams) +{ + int i; + int rv = -1; + virTypedParameterPtr params = NULL; + + /* Check the length of the returned list carefully. */ + if (args_params_len > limit) { + virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); + goto cleanup; + } + if (VIR_ALLOC_N(params, args_params_len) < 0) { + virReportOOMError(); + goto cleanup; + } + + *nparams = args_params_len; + + /* Deserialise the result. */ + for (i = 0; i < args_params_len; ++i) { + if (virStrcpyStatic(params[i].field, + args_params_val[i].field) == NULL) { + virNetError(VIR_ERR_INTERNAL_ERROR, + _("Parameter %s too big for destination"), + args_params_val[i].field); + goto cleanup; + } + params[i].type = args_params_val[i].value.type; + switch (params[i].type) { + case VIR_TYPED_PARAM_INT: + params[i].value.i = + args_params_val[i].value.remote_typed_param_value_u.i; + break; + case VIR_TYPED_PARAM_UINT: + params[i].value.ui = + args_params_val[i].value.remote_typed_param_value_u.ui; + break; + case VIR_TYPED_PARAM_LLONG: + params[i].value.l = + args_params_val[i].value.remote_typed_param_value_u.l; + break; + case VIR_TYPED_PARAM_ULLONG: + params[i].value.ul = + args_params_val[i].value.remote_typed_param_value_u.ul; + break; + case VIR_TYPED_PARAM_DOUBLE: + params[i].value.d = + args_params_val[i].value.remote_typed_param_value_u.d; + break; + case VIR_TYPED_PARAM_BOOLEAN: + params[i].value.b = + args_params_val[i].value.remote_typed_param_value_u.b; + break; + default: + virNetError(VIR_ERR_INTERNAL_ERROR, _("unknown parameter type: %d"), + params[i].type); + goto cleanup; + } + } + + rv = 0; + +cleanup: + if (rv < 0) + VIR_FREE(params); + return params; +} + static int remoteDispatchDomainGetSchedulerParameters(struct qemud_server *server ATTRIBUTE_UNUSED, struct qemud_client *client ATTRIBUTE_UNUSED, @@ -506,7 +643,6 @@ remoteDispatchDomainGetSchedulerParameters(struct qemud_server *server ATTRIBUTE { virDomainPtr dom = NULL; virTypedParameterPtr params = NULL; - int i; int nparams = args->nparams; int rv = -1; @@ -528,48 +664,16 @@ remoteDispatchDomainGetSchedulerParameters(struct qemud_server *server ATTRIBUTE if (virDomainGetSchedulerParameters(dom, params, &nparams) < 0) goto cleanup; - /* Serialise the scheduler parameters. */ - ret->params.params_len = nparams; - if (VIR_ALLOC_N(ret->params.params_val, nparams) < 0) - goto no_memory; - - for (i = 0; i < nparams; ++i) { - /* remoteDispatchClientRequest will free this: */ - ret->params.params_val[i].field = strdup(params[i].field); - if (ret->params.params_val[i].field == NULL) - goto no_memory; - - ret->params.params_val[i].value.type = params[i].type; - switch (params[i].type) { - case VIR_DOMAIN_SCHED_FIELD_INT: - ret->params.params_val[i].value.remote_sched_param_value_u.i = params[i].value.i; break; - case VIR_DOMAIN_SCHED_FIELD_UINT: - ret->params.params_val[i].value.remote_sched_param_value_u.ui = params[i].value.ui; break; - case VIR_DOMAIN_SCHED_FIELD_LLONG: - ret->params.params_val[i].value.remote_sched_param_value_u.l = params[i].value.l; break; - case VIR_DOMAIN_SCHED_FIELD_ULLONG: - ret->params.params_val[i].value.remote_sched_param_value_u.ul = params[i].value.ul; break; - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: - ret->params.params_val[i].value.remote_sched_param_value_u.d = params[i].value.d; break; - case VIR_DOMAIN_SCHED_FIELD_BOOLEAN: - ret->params.params_val[i].value.remote_sched_param_value_u.b = params[i].value.b; break; - default: - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("unknown type")); - goto cleanup; - } - } + if (remoteSerializeTypedParameters(params, nparams, + &ret->params.params_len, + &ret->params.params_val) < 0) + goto cleanup; rv = 0; cleanup: - if (rv < 0) { + if (rv < 0) remoteDispatchError(rerr); - if (ret->params.params_val) { - for (i = 0 ; i < nparams ; i++) - VIR_FREE(ret->params.params_val[i].field); - VIR_FREE(ret->params.params_val); - } - } if (dom) virDomainFree(dom); VIR_FREE(params); @@ -591,7 +695,7 @@ remoteDispatchDomainSetSchedulerParameters(struct qemud_server *server ATTRIBUTE { virDomainPtr dom = NULL; virTypedParameterPtr params = NULL; - int i, nparams; + int nparams; int rv = -1; if (!conn) { @@ -601,38 +705,11 @@ remoteDispatchDomainSetSchedulerParameters(struct qemud_server *server ATTRIBUTE nparams = args->params.params_len; - if (nparams > REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX) { - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); + if ((params = remoteDeserializeTypedParameters(args->params.params_len, + args->params.params_val, + REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX, + &nparams)) == NULL) goto cleanup; - } - if (VIR_ALLOC_N(params, nparams) < 0) { - virReportOOMError(); - goto cleanup; - } - - /* Deserialise parameters. */ - for (i = 0; i < nparams; ++i) { - if (virStrcpyStatic(params[i].field, args->params.params_val[i].field) == NULL) { - virNetError(VIR_ERR_INTERNAL_ERROR, _("Field %s too big for destination"), - args->params.params_val[i].field); - goto cleanup; - } - params[i].type = args->params.params_val[i].value.type; - switch (params[i].type) { - case VIR_DOMAIN_SCHED_FIELD_INT: - params[i].value.i = args->params.params_val[i].value.remote_sched_param_value_u.i; break; - case VIR_DOMAIN_SCHED_FIELD_UINT: - params[i].value.ui = args->params.params_val[i].value.remote_sched_param_value_u.ui; break; - case VIR_DOMAIN_SCHED_FIELD_LLONG: - params[i].value.l = args->params.params_val[i].value.remote_sched_param_value_u.l; break; - case VIR_DOMAIN_SCHED_FIELD_ULLONG: - params[i].value.ul = args->params.params_val[i].value.remote_sched_param_value_u.ul; break; - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: - params[i].value.d = args->params.params_val[i].value.remote_sched_param_value_u.d; break; - case VIR_DOMAIN_SCHED_FIELD_BOOLEAN: - params[i].value.b = args->params.params_val[i].value.remote_sched_param_value_u.b; break; - } - } if (!(dom = get_nonnull_domain(conn, args->dom))) goto cleanup; @@ -662,7 +739,7 @@ remoteDispatchDomainSetSchedulerParametersFlags(struct qemud_server *server ATTR { virDomainPtr dom = NULL; virTypedParameterPtr params = NULL; - int i, nparams; + int nparams; int rv = -1; if (!conn) { @@ -670,40 +747,11 @@ remoteDispatchDomainSetSchedulerParametersFlags(struct qemud_server *server ATTR goto cleanup; } - nparams = args->params.params_len; - - if (nparams > REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX) { - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); + if ((params = remoteDeserializeTypedParameters(args->params.params_len, + args->params.params_val, + REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX, + &nparams)) == NULL) goto cleanup; - } - if (VIR_ALLOC_N(params, nparams) < 0) { - virReportOOMError(); - goto cleanup; - } - - /* Deserialise parameters. */ - for (i = 0; i < nparams; ++i) { - if (virStrcpyStatic(params[i].field, args->params.params_val[i].field) == NULL) { - virNetError(VIR_ERR_INTERNAL_ERROR, _("Field %s too big for destination"), - args->params.params_val[i].field); - goto cleanup; - } - params[i].type = args->params.params_val[i].value.type; - switch (params[i].type) { - case VIR_DOMAIN_SCHED_FIELD_INT: - params[i].value.i = args->params.params_val[i].value.remote_sched_param_value_u.i; break; - case VIR_DOMAIN_SCHED_FIELD_UINT: - params[i].value.ui = args->params.params_val[i].value.remote_sched_param_value_u.ui; break; - case VIR_DOMAIN_SCHED_FIELD_LLONG: - params[i].value.l = args->params.params_val[i].value.remote_sched_param_value_u.l; break; - case VIR_DOMAIN_SCHED_FIELD_ULLONG: - params[i].value.ul = args->params.params_val[i].value.remote_sched_param_value_u.ul; break; - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: - params[i].value.d = args->params.params_val[i].value.remote_sched_param_value_u.d; break; - case VIR_DOMAIN_SCHED_FIELD_BOOLEAN: - params[i].value.b = args->params.params_val[i].value.remote_sched_param_value_u.b; break; - } - } if (!(dom = get_nonnull_domain(conn, args->dom))) goto cleanup; @@ -1228,7 +1276,7 @@ remoteDispatchDomainSetMemoryParameters(struct qemud_server *server { virDomainPtr dom = NULL; virTypedParameterPtr params = NULL; - int i, nparams; + int nparams; unsigned int flags; int rv = -1; @@ -1237,61 +1285,13 @@ remoteDispatchDomainSetMemoryParameters(struct qemud_server *server goto cleanup; } - nparams = args->params.params_len; flags = args->flags; - if (nparams > REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX) { - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); + if ((params = remoteDeserializeTypedParameters(args->params.params_len, + args->params.params_val, + REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX, + &nparams)) == NULL) goto cleanup; - } - if (VIR_ALLOC_N(params, nparams) < 0) { - virReportOOMError(); - goto cleanup; - } - - /* Deserialise parameters. */ - for (i = 0; i < nparams; ++i) { - if (virStrcpyStatic - (params[i].field, args->params.params_val[i].field) == NULL) { - virNetError(VIR_ERR_INTERNAL_ERROR, - _("Field %s too big for destination"), - args->params.params_val[i].field); - goto cleanup; - } - params[i].type = args->params.params_val[i].value.type; - switch (params[i].type) { - case VIR_DOMAIN_MEMORY_PARAM_INT: - params[i].value.i = - args->params.params_val[i].value. - remote_memory_param_value_u.i; - break; - case VIR_DOMAIN_MEMORY_PARAM_UINT: - params[i].value.ui = - args->params.params_val[i].value. - remote_memory_param_value_u.ui; - break; - case VIR_DOMAIN_MEMORY_PARAM_LLONG: - params[i].value.l = - args->params.params_val[i].value. - remote_memory_param_value_u.l; - break; - case VIR_DOMAIN_MEMORY_PARAM_ULLONG: - params[i].value.ul = - args->params.params_val[i].value. - remote_memory_param_value_u.ul; - break; - case VIR_DOMAIN_MEMORY_PARAM_DOUBLE: - params[i].value.d = - args->params.params_val[i].value. - remote_memory_param_value_u.d; - break; - case VIR_DOMAIN_MEMORY_PARAM_BOOLEAN: - params[i].value.b = - args->params.params_val[i].value. - remote_memory_param_value_u.b; - break; - } - } if (!(dom = get_nonnull_domain(conn, args->dom))) goto cleanup; @@ -1326,7 +1326,6 @@ remoteDispatchDomainGetMemoryParameters(struct qemud_server *server { virDomainPtr dom = NULL; virTypedParameterPtr params = NULL; - int i; int nparams = args->nparams; unsigned int flags; int rv = -1; @@ -1361,75 +1360,21 @@ remoteDispatchDomainGetMemoryParameters(struct qemud_server *server goto success; } - /* Serialise the memory parameters. */ - ret->params.params_len = nparams; - if (VIR_ALLOC_N(ret->params.params_val, nparams) < 0) - goto no_memory; - - for (i = 0; i < nparams; ++i) { - /* remoteDispatchClientRequest will free this: */ - ret->params.params_val[i].field = strdup(params[i].field); - if (ret->params.params_val[i].field == NULL) - goto no_memory; - - ret->params.params_val[i].value.type = params[i].type; - switch (params[i].type) { - case VIR_DOMAIN_MEMORY_PARAM_INT: - ret->params.params_val[i]. - value.remote_memory_param_value_u.i = - params[i].value.i; - break; - case VIR_DOMAIN_MEMORY_PARAM_UINT: - ret->params.params_val[i]. - value.remote_memory_param_value_u.ui = - params[i].value.ui; - break; - case VIR_DOMAIN_MEMORY_PARAM_LLONG: - ret->params.params_val[i]. - value.remote_memory_param_value_u.l = - params[i].value.l; - break; - case VIR_DOMAIN_MEMORY_PARAM_ULLONG: - ret->params.params_val[i]. - value.remote_memory_param_value_u.ul = - params[i].value.ul; - break; - case VIR_DOMAIN_MEMORY_PARAM_DOUBLE: - ret->params.params_val[i]. - value.remote_memory_param_value_u.d = - params[i].value.d; - break; - case VIR_DOMAIN_MEMORY_PARAM_BOOLEAN: - ret->params.params_val[i]. - value.remote_memory_param_value_u.b = - params[i].value.b; - break; - default: - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("unknown type")); - goto cleanup; - } - } + if (remoteSerializeTypedParameters(params, nparams, + &ret->params.params_len, + &ret->params.params_val) < 0) + goto cleanup; success: rv = 0; cleanup: - if (rv < 0) { + if (rv < 0) remoteDispatchError(rerr); - if (ret->params.params_val) { - for (i = 0; i < nparams; i++) - VIR_FREE(ret->params.params_val[i].field); - VIR_FREE(ret->params.params_val); - } - } if (dom) virDomainFree(dom); VIR_FREE(params); return rv; - -no_memory: - virReportOOMError(); - goto cleanup; } static int @@ -1446,7 +1391,7 @@ remoteDispatchDomainSetBlkioParameters(struct qemud_server *server { virDomainPtr dom = NULL; virTypedParameterPtr params = NULL; - int i, nparams; + int nparams; unsigned int flags; int rv = -1; @@ -1455,61 +1400,13 @@ remoteDispatchDomainSetBlkioParameters(struct qemud_server *server goto cleanup; } - nparams = args->params.params_len; flags = args->flags; - if (nparams > REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX) { - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); - goto cleanup; - } - if (VIR_ALLOC_N(params, nparams) < 0) { - virReportOOMError(); + if ((params = remoteDeserializeTypedParameters(args->params.params_len, + args->params.params_val, + REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX, + &nparams)) == NULL) goto cleanup; - } - - /* Deserialise parameters. */ - for (i = 0; i < nparams; ++i) { - if (virStrcpyStatic - (params[i].field, args->params.params_val[i].field) == NULL) { - virNetError(VIR_ERR_INTERNAL_ERROR, - _("Field %s too big for destination"), - args->params.params_val[i].field); - goto cleanup; - } - params[i].type = args->params.params_val[i].value.type; - switch (params[i].type) { - case VIR_DOMAIN_BLKIO_PARAM_INT: - params[i].value.i = - args->params.params_val[i].value. - remote_blkio_param_value_u.i; - break; - case VIR_DOMAIN_BLKIO_PARAM_UINT: - params[i].value.ui = - args->params.params_val[i].value. - remote_blkio_param_value_u.ui; - break; - case VIR_DOMAIN_BLKIO_PARAM_LLONG: - params[i].value.l = - args->params.params_val[i].value. - remote_blkio_param_value_u.l; - break; - case VIR_DOMAIN_BLKIO_PARAM_ULLONG: - params[i].value.ul = - args->params.params_val[i].value. - remote_blkio_param_value_u.ul; - break; - case VIR_DOMAIN_BLKIO_PARAM_DOUBLE: - params[i].value.d = - args->params.params_val[i].value. - remote_blkio_param_value_u.d; - break; - case VIR_DOMAIN_BLKIO_PARAM_BOOLEAN: - params[i].value.b = - args->params.params_val[i].value. - remote_blkio_param_value_u.b; - break; - } - } if (!(dom = get_nonnull_domain(conn, args->dom))) goto cleanup; @@ -1544,7 +1441,6 @@ remoteDispatchDomainGetBlkioParameters(struct qemud_server *server { virDomainPtr dom = NULL; virTypedParameterPtr params = NULL; - int i; int nparams = args->nparams; unsigned int flags; int rv = -1; @@ -1579,75 +1475,21 @@ remoteDispatchDomainGetBlkioParameters(struct qemud_server *server goto success; } - /* Serialise the blkio parameters. */ - ret->params.params_len = nparams; - if (VIR_ALLOC_N(ret->params.params_val, nparams) < 0) - goto no_memory; - - for (i = 0; i < nparams; ++i) { - // remoteDispatchClientRequest will free this: - ret->params.params_val[i].field = strdup(params[i].field); - if (ret->params.params_val[i].field == NULL) - goto no_memory; - - ret->params.params_val[i].value.type = params[i].type; - switch (params[i].type) { - case VIR_DOMAIN_BLKIO_PARAM_INT: - ret->params.params_val[i]. - value.remote_blkio_param_value_u.i = - params[i].value.i; - break; - case VIR_DOMAIN_BLKIO_PARAM_UINT: - ret->params.params_val[i]. - value.remote_blkio_param_value_u.ui = - params[i].value.ui; - break; - case VIR_DOMAIN_BLKIO_PARAM_LLONG: - ret->params.params_val[i]. - value.remote_blkio_param_value_u.l = - params[i].value.l; - break; - case VIR_DOMAIN_BLKIO_PARAM_ULLONG: - ret->params.params_val[i]. - value.remote_blkio_param_value_u.ul = - params[i].value.ul; - break; - case VIR_DOMAIN_BLKIO_PARAM_DOUBLE: - ret->params.params_val[i]. - value.remote_blkio_param_value_u.d = - params[i].value.d; - break; - case VIR_DOMAIN_BLKIO_PARAM_BOOLEAN: - ret->params.params_val[i]. - value.remote_blkio_param_value_u.b = - params[i].value.b; - break; - default: - virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("unknown type")); - goto cleanup; - } - } + if (remoteSerializeTypedParameters(params, nparams, + &ret->params.params_len, + &ret->params.params_val) < 0) + goto cleanup; success: rv = 0; cleanup: - if (rv < 0) { + if (rv < 0) remoteDispatchError(rerr); - if (ret->params.params_val) { - for (i = 0; i < nparams; i++) - VIR_FREE(ret->params.params_val[i].field); - VIR_FREE(ret->params.params_val); - } - } VIR_FREE(params); if (dom) virDomainFree(dom); return rv; - -no_memory: - virReportOOMError(); - goto cleanup; } static int diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 489cdfa..79ee8e7 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1779,64 +1779,157 @@ done: return rv; } +/* Helper to serialize typed parameters. */ static int -remoteDomainSetMemoryParameters (virDomainPtr domain, - virTypedParameterPtr params, - int nparams, - unsigned int flags) +remoteSerializeTypedParameters(virTypedParameterPtr params, + int nparams, + u_int *args_params_len, + remote_typed_param **args_params_val) { + int i; int rv = -1; - remote_domain_set_memory_parameters_args args; - int i, do_error; - struct private_data *priv = domain->conn->privateData; + remote_typed_param *val; - remoteDriverLock(priv); - - make_nonnull_domain (&args.dom, domain); - - /* Serialise the memory parameters. */ - args.params.params_len = nparams; - args.flags = flags; - if (VIR_ALLOC_N(args.params.params_val, nparams) < 0) { + *args_params_len = nparams; + if (VIR_ALLOC_N(val, nparams) < 0) { virReportOOMError(); - goto done; + goto cleanup; } - do_error = 0; for (i = 0; i < nparams; ++i) { /* call() will free this: */ - args.params.params_val[i].field = strdup (params[i].field); - if (args.params.params_val[i].field == NULL) { + val[i].field = strdup (params[i].field); + if (val[i].field == NULL) { virReportOOMError(); - do_error = 1; + goto cleanup; } - args.params.params_val[i].value.type = params[i].type; + val[i].value.type = params[i].type; switch (params[i].type) { - case VIR_DOMAIN_MEMORY_PARAM_INT: - args.params.params_val[i].value.remote_memory_param_value_u.i = - params[i].value.i; break; - case VIR_DOMAIN_MEMORY_PARAM_UINT: - args.params.params_val[i].value.remote_memory_param_value_u.ui = - params[i].value.ui; break; - case VIR_DOMAIN_MEMORY_PARAM_LLONG: - args.params.params_val[i].value.remote_memory_param_value_u.l = - params[i].value.l; break; - case VIR_DOMAIN_MEMORY_PARAM_ULLONG: - args.params.params_val[i].value.remote_memory_param_value_u.ul = - params[i].value.ul; break; - case VIR_DOMAIN_MEMORY_PARAM_DOUBLE: - args.params.params_val[i].value.remote_memory_param_value_u.d = - params[i].value.d; break; - case VIR_DOMAIN_MEMORY_PARAM_BOOLEAN: - args.params.params_val[i].value.remote_memory_param_value_u.b = - params[i].value.b; break; + case VIR_TYPED_PARAM_INT: + val[i].value.remote_typed_param_value_u.i = params[i].value.i; + break; + case VIR_TYPED_PARAM_UINT: + val[i].value.remote_typed_param_value_u.ui = params[i].value.ui; + break; + case VIR_TYPED_PARAM_LLONG: + val[i].value.remote_typed_param_value_u.l = params[i].value.l; + break; + case VIR_TYPED_PARAM_ULLONG: + val[i].value.remote_typed_param_value_u.ul = params[i].value.ul; + break; + case VIR_TYPED_PARAM_DOUBLE: + val[i].value.remote_typed_param_value_u.d = params[i].value.d; + break; + case VIR_TYPED_PARAM_BOOLEAN: + val[i].value.remote_typed_param_value_u.b = params[i].value.b; + break; default: - remoteError(VIR_ERR_RPC, "%s", _("unknown parameter type")); - do_error = 1; + remoteError(VIR_ERR_RPC, _("unknown parameter type: %d"), + params[i].type); + goto cleanup; } } - if (do_error) { + *args_params_val = val; + val = NULL; + rv = 0; + +cleanup: + if (val) { + for (i = 0; i < nparams; i++) + VIR_FREE(val[i].field); + VIR_FREE(val); + } + return rv; +} + +/* Helper to deserialize typed parameters. */ +static int +remoteDeserializeTypedParameters(u_int ret_params_len, + remote_typed_param *ret_params_val, + int limit, + virTypedParameterPtr params, + int *nparams) +{ + int i; + int rv = -1; + + /* Check the length of the returned list carefully. */ + if (ret_params_len > limit || ret_params_len > *nparams) { + remoteError(VIR_ERR_RPC, "%s", + _("returned number of parameters exceeds limit")); + goto cleanup; + } + + *nparams = ret_params_len; + + /* Deserialise the result. */ + for (i = 0; i < ret_params_len; ++i) { + if (virStrcpyStatic(params[i].field, + ret_params_val[i].field) == NULL) { + remoteError(VIR_ERR_INTERNAL_ERROR, + _("Parameter %s too big for destination"), + ret_params_val[i].field); + goto cleanup; + } + params[i].type = ret_params_val[i].value.type; + switch (params[i].type) { + case VIR_TYPED_PARAM_INT: + params[i].value.i = + ret_params_val[i].value.remote_typed_param_value_u.i; + break; + case VIR_TYPED_PARAM_UINT: + params[i].value.ui = + ret_params_val[i].value.remote_typed_param_value_u.ui; + break; + case VIR_TYPED_PARAM_LLONG: + params[i].value.l = + ret_params_val[i].value.remote_typed_param_value_u.l; + break; + case VIR_TYPED_PARAM_ULLONG: + params[i].value.ul = + ret_params_val[i].value.remote_typed_param_value_u.ul; + break; + case VIR_TYPED_PARAM_DOUBLE: + params[i].value.d = + ret_params_val[i].value.remote_typed_param_value_u.d; + break; + case VIR_TYPED_PARAM_BOOLEAN: + params[i].value.b = + ret_params_val[i].value.remote_typed_param_value_u.b; + break; + default: + remoteError(VIR_ERR_RPC, _("unknown parameter type: %d"), + params[i].type); + goto cleanup; + } + } + + rv = 0; + +cleanup: + return rv; +} + +static int +remoteDomainSetMemoryParameters (virDomainPtr domain, + virTypedParameterPtr params, + int nparams, + unsigned int flags) +{ + int rv = -1; + remote_domain_set_memory_parameters_args args; + struct private_data *priv = domain->conn->privateData; + + remoteDriverLock(priv); + + make_nonnull_domain (&args.dom, domain); + + args.flags = flags; + + if (remoteSerializeTypedParameters(params, nparams, + &args.params.params_len, + &args.params.params_val) < 0) { xdr_free ((xdrproc_t) xdr_remote_domain_set_memory_parameters_args, (char *) &args); goto done; @@ -1862,7 +1955,6 @@ remoteDomainGetMemoryParameters (virDomainPtr domain, int rv = -1; remote_domain_get_memory_parameters_args args; remote_domain_get_memory_parameters_ret ret; - int i = -1; struct private_data *priv = domain->conn->privateData; remoteDriverLock(priv); @@ -1877,14 +1969,6 @@ remoteDomainGetMemoryParameters (virDomainPtr domain, (xdrproc_t) xdr_remote_domain_get_memory_parameters_ret, (char *) &ret) == -1) goto done; - /* Check the length of the returned list carefully. */ - if (ret.params.params_len > REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX || - ret.params.params_len > *nparams) { - remoteError(VIR_ERR_RPC, "%s", - _("remoteDomainGetMemoryParameters: " - "returned number of parameters exceeds limit")); - goto cleanup; - } /* Handle the case when the caller does not know the number of parameters * and is asking for the number of parameters supported */ @@ -1894,49 +1978,12 @@ remoteDomainGetMemoryParameters (virDomainPtr domain, goto cleanup; } - *nparams = ret.params.params_len; - - /* Deserialise the result. */ - for (i = 0; i < *nparams; ++i) { - if (virStrcpyStatic(params[i].field, ret.params.params_val[i].field) == NULL) { - remoteError(VIR_ERR_INTERNAL_ERROR, - _("Parameter %s too big for destination"), - ret.params.params_val[i].field); - goto cleanup; - } - params[i].type = ret.params.params_val[i].value.type; - switch (params[i].type) { - case VIR_DOMAIN_MEMORY_PARAM_INT: - params[i].value.i = - ret.params.params_val[i].value.remote_memory_param_value_u.i; - break; - case VIR_DOMAIN_MEMORY_PARAM_UINT: - params[i].value.ui = - ret.params.params_val[i].value.remote_memory_param_value_u.ui; - break; - case VIR_DOMAIN_MEMORY_PARAM_LLONG: - params[i].value.l = - ret.params.params_val[i].value.remote_memory_param_value_u.l; - break; - case VIR_DOMAIN_MEMORY_PARAM_ULLONG: - params[i].value.ul = - ret.params.params_val[i].value.remote_memory_param_value_u.ul; - break; - case VIR_DOMAIN_MEMORY_PARAM_DOUBLE: - params[i].value.d = - ret.params.params_val[i].value.remote_memory_param_value_u.d; - break; - case VIR_DOMAIN_MEMORY_PARAM_BOOLEAN: - params[i].value.b = - ret.params.params_val[i].value.remote_memory_param_value_u.b; - break; - default: - remoteError(VIR_ERR_RPC, "%s", - _("remoteDomainGetMemoryParameters: " - "unknown parameter type")); - goto cleanup; - } - } + if (remoteDeserializeTypedParameters(ret.params.params_len, + ret.params.params_val, + REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX, + params, + nparams) < 0) + goto cleanup; rv = 0; @@ -1956,56 +2003,17 @@ remoteDomainSetBlkioParameters (virDomainPtr domain, { int rv = -1; remote_domain_set_blkio_parameters_args args; - int i, do_error; struct private_data *priv = domain->conn->privateData; remoteDriverLock(priv); make_nonnull_domain (&args.dom, domain); - /* Serialise the blkio parameters. */ - args.params.params_len = nparams; args.flags = flags; - if (VIR_ALLOC_N(args.params.params_val, nparams) < 0) { - virReportOOMError(); - goto done; - } - do_error = 0; - for (i = 0; i < nparams; ++i) { - // call() will free this: - args.params.params_val[i].field = strdup (params[i].field); - if (args.params.params_val[i].field == NULL) { - virReportOOMError(); - do_error = 1; - } - args.params.params_val[i].value.type = params[i].type; - switch (params[i].type) { - case VIR_DOMAIN_BLKIO_PARAM_INT: - args.params.params_val[i].value.remote_blkio_param_value_u.i = - params[i].value.i; break; - case VIR_DOMAIN_BLKIO_PARAM_UINT: - args.params.params_val[i].value.remote_blkio_param_value_u.ui = - params[i].value.ui; break; - case VIR_DOMAIN_BLKIO_PARAM_LLONG: - args.params.params_val[i].value.remote_blkio_param_value_u.l = - params[i].value.l; break; - case VIR_DOMAIN_BLKIO_PARAM_ULLONG: - args.params.params_val[i].value.remote_blkio_param_value_u.ul = - params[i].value.ul; break; - case VIR_DOMAIN_BLKIO_PARAM_DOUBLE: - args.params.params_val[i].value.remote_blkio_param_value_u.d = - params[i].value.d; break; - case VIR_DOMAIN_BLKIO_PARAM_BOOLEAN: - args.params.params_val[i].value.remote_blkio_param_value_u.b = - params[i].value.b; break; - default: - remoteError(VIR_ERR_RPC, "%s", _("unknown parameter type")); - do_error = 1; - } - } - - if (do_error) { + if (remoteSerializeTypedParameters(params, nparams, + &args.params.params_len, + &args.params.params_val) < 0) { xdr_free ((xdrproc_t) xdr_remote_domain_set_blkio_parameters_args, (char *) &args); goto done; @@ -2031,7 +2039,6 @@ remoteDomainGetBlkioParameters (virDomainPtr domain, int rv = -1; remote_domain_get_blkio_parameters_args args; remote_domain_get_blkio_parameters_ret ret; - int i = -1; struct private_data *priv = domain->conn->privateData; remoteDriverLock(priv); @@ -2046,14 +2053,6 @@ remoteDomainGetBlkioParameters (virDomainPtr domain, (xdrproc_t) xdr_remote_domain_get_blkio_parameters_ret, (char *) &ret) == -1) goto done; - /* Check the length of the returned list carefully. */ - if (ret.params.params_len > REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX || - ret.params.params_len > *nparams) { - remoteError(VIR_ERR_RPC, "%s", - _("remoteDomainGetBlkioParameters: " - "returned number of parameters exceeds limit")); - goto cleanup; - } /* Handle the case when the caller does not know the number of parameters * and is asking for the number of parameters supported */ @@ -2063,49 +2062,12 @@ remoteDomainGetBlkioParameters (virDomainPtr domain, goto cleanup; } - *nparams = ret.params.params_len; - - /* Deserialise the result. */ - for (i = 0; i < *nparams; ++i) { - if (virStrcpyStatic(params[i].field, ret.params.params_val[i].field) == NULL) { - remoteError(VIR_ERR_INTERNAL_ERROR, - _("Parameter %s too big for destination"), - ret.params.params_val[i].field); - goto cleanup; - } - params[i].type = ret.params.params_val[i].value.type; - switch (params[i].type) { - case VIR_DOMAIN_BLKIO_PARAM_INT: - params[i].value.i = - ret.params.params_val[i].value.remote_blkio_param_value_u.i; - break; - case VIR_DOMAIN_BLKIO_PARAM_UINT: - params[i].value.ui = - ret.params.params_val[i].value.remote_blkio_param_value_u.ui; - break; - case VIR_DOMAIN_BLKIO_PARAM_LLONG: - params[i].value.l = - ret.params.params_val[i].value.remote_blkio_param_value_u.l; - break; - case VIR_DOMAIN_BLKIO_PARAM_ULLONG: - params[i].value.ul = - ret.params.params_val[i].value.remote_blkio_param_value_u.ul; - break; - case VIR_DOMAIN_BLKIO_PARAM_DOUBLE: - params[i].value.d = - ret.params.params_val[i].value.remote_blkio_param_value_u.d; - break; - case VIR_DOMAIN_BLKIO_PARAM_BOOLEAN: - params[i].value.b = - ret.params.params_val[i].value.remote_blkio_param_value_u.b; - break; - default: - remoteError(VIR_ERR_RPC, "%s", - _("remoteDomainGetBlkioParameters: " - "unknown parameter type")); - goto cleanup; - } - } + if (remoteDeserializeTypedParameters(ret.params.params_len, + ret.params.params_val, + REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX, + params, + nparams) < 0) + goto cleanup; rv = 0; @@ -2475,7 +2437,6 @@ remoteDomainGetSchedulerParameters (virDomainPtr domain, int rv = -1; remote_domain_get_scheduler_parameters_args args; remote_domain_get_scheduler_parameters_ret ret; - int i = -1; struct private_data *priv = domain->conn->privateData; remoteDriverLock(priv); @@ -2489,45 +2450,12 @@ remoteDomainGetSchedulerParameters (virDomainPtr domain, (xdrproc_t) xdr_remote_domain_get_scheduler_parameters_ret, (char *) &ret) == -1) goto done; - /* Check the length of the returned list carefully. */ - if (ret.params.params_len > REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX || - ret.params.params_len > *nparams) { - remoteError(VIR_ERR_RPC, "%s", - _("remoteDomainGetSchedulerParameters: " - "returned number of parameters exceeds limit")); + if (remoteDeserializeTypedParameters(ret.params.params_len, + ret.params.params_val, + REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX, + params, + nparams) < 0) goto cleanup; - } - *nparams = ret.params.params_len; - - /* Deserialise the result. */ - for (i = 0; i < *nparams; ++i) { - if (virStrcpyStatic(params[i].field, ret.params.params_val[i].field) == NULL) { - remoteError(VIR_ERR_INTERNAL_ERROR, - _("Parameter %s too big for destination"), - ret.params.params_val[i].field); - goto cleanup; - } - params[i].type = ret.params.params_val[i].value.type; - switch (params[i].type) { - case VIR_DOMAIN_SCHED_FIELD_INT: - params[i].value.i = ret.params.params_val[i].value.remote_sched_param_value_u.i; break; - case VIR_DOMAIN_SCHED_FIELD_UINT: - params[i].value.ui = ret.params.params_val[i].value.remote_sched_param_value_u.ui; break; - case VIR_DOMAIN_SCHED_FIELD_LLONG: - params[i].value.l = ret.params.params_val[i].value.remote_sched_param_value_u.l; break; - case VIR_DOMAIN_SCHED_FIELD_ULLONG: - params[i].value.ul = ret.params.params_val[i].value.remote_sched_param_value_u.ul; break; - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: - params[i].value.d = ret.params.params_val[i].value.remote_sched_param_value_u.d; break; - case VIR_DOMAIN_SCHED_FIELD_BOOLEAN: - params[i].value.b = ret.params.params_val[i].value.remote_sched_param_value_u.b; break; - default: - remoteError(VIR_ERR_RPC, "%s", - _("remoteDomainGetSchedulerParameters: " - "unknown parameter type")); - goto cleanup; - } - } rv = 0; @@ -2544,50 +2472,17 @@ remoteDomainSetSchedulerParameters (virDomainPtr domain, { int rv = -1; remote_domain_set_scheduler_parameters_args args; - int i, do_error; struct private_data *priv = domain->conn->privateData; remoteDriverLock(priv); make_nonnull_domain (&args.dom, domain); - /* Serialise the scheduler parameters. */ - args.params.params_len = nparams; - if (VIR_ALLOC_N(args.params.params_val, nparams) < 0) { - virReportOOMError(); - goto done; - } - - do_error = 0; - for (i = 0; i < nparams; ++i) { - /* call() will free this: */ - args.params.params_val[i].field = strdup (params[i].field); - if (args.params.params_val[i].field == NULL) { - virReportOOMError(); - do_error = 1; - } - args.params.params_val[i].value.type = params[i].type; - switch (params[i].type) { - case VIR_DOMAIN_SCHED_FIELD_INT: - args.params.params_val[i].value.remote_sched_param_value_u.i = params[i].value.i; break; - case VIR_DOMAIN_SCHED_FIELD_UINT: - args.params.params_val[i].value.remote_sched_param_value_u.ui = params[i].value.ui; break; - case VIR_DOMAIN_SCHED_FIELD_LLONG: - args.params.params_val[i].value.remote_sched_param_value_u.l = params[i].value.l; break; - case VIR_DOMAIN_SCHED_FIELD_ULLONG: - args.params.params_val[i].value.remote_sched_param_value_u.ul = params[i].value.ul; break; - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: - args.params.params_val[i].value.remote_sched_param_value_u.d = params[i].value.d; break; - case VIR_DOMAIN_SCHED_FIELD_BOOLEAN: - args.params.params_val[i].value.remote_sched_param_value_u.b = params[i].value.b; break; - default: - remoteError(VIR_ERR_RPC, "%s", _("unknown parameter type")); - do_error = 1; - } - } - - if (do_error) { - xdr_free ((xdrproc_t) xdr_remote_domain_set_scheduler_parameters_args, (char *) &args); + if (remoteSerializeTypedParameters(params, nparams, + &args.params.params_len, + &args.params.params_val) < 0) { + xdr_free ((xdrproc_t) xdr_remote_domain_set_scheduler_parameters_args, + (char *) &args); goto done; } @@ -2611,51 +2506,19 @@ remoteDomainSetSchedulerParametersFlags(virDomainPtr domain, { int rv = -1; remote_domain_set_scheduler_parameters_flags_args args; - int i, do_error; struct private_data *priv = domain->conn->privateData; remoteDriverLock(priv); make_nonnull_domain (&args.dom, domain); - /* Serialise the scheduler parameters. */ - args.params.params_len = nparams; args.flags = flags; - if (VIR_ALLOC_N(args.params.params_val, nparams) < 0) { - virReportOOMError(); - goto done; - } - - do_error = 0; - for (i = 0; i < nparams; ++i) { - /* call() will free this: */ - args.params.params_val[i].field = strdup (params[i].field); - if (args.params.params_val[i].field == NULL) { - virReportOOMError(); - do_error = 1; - } - args.params.params_val[i].value.type = params[i].type; - switch (params[i].type) { - case VIR_DOMAIN_SCHED_FIELD_INT: - args.params.params_val[i].value.remote_sched_param_value_u.i = params[i].value.i; break; - case VIR_DOMAIN_SCHED_FIELD_UINT: - args.params.params_val[i].value.remote_sched_param_value_u.ui = params[i].value.ui; break; - case VIR_DOMAIN_SCHED_FIELD_LLONG: - args.params.params_val[i].value.remote_sched_param_value_u.l = params[i].value.l; break; - case VIR_DOMAIN_SCHED_FIELD_ULLONG: - args.params.params_val[i].value.remote_sched_param_value_u.ul = params[i].value.ul; break; - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: - args.params.params_val[i].value.remote_sched_param_value_u.d = params[i].value.d; break; - case VIR_DOMAIN_SCHED_FIELD_BOOLEAN: - args.params.params_val[i].value.remote_sched_param_value_u.b = params[i].value.b; break; - default: - remoteError(VIR_ERR_RPC, "%s", _("unknown parameter type")); - do_error = 1; - } - } - if (do_error) { - xdr_free ((xdrproc_t) xdr_remote_domain_set_scheduler_parameters_flags_args, (char *) &args); + if (remoteSerializeTypedParameters(params, nparams, + &args.params.params_len, + &args.params.params_val) < 0) { + xdr_free ((xdrproc_t) xdr_remote_domain_set_scheduler_parameters_flags_args, + (char *) &args); goto done; } diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index c62af59..00ea1b8 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -296,67 +296,27 @@ struct remote_vcpu_info { int cpu; }; -/* Wire encoding of virDomainSchedParameter. +/* Wire encoding of virTypedParameter. * Note the enum (type) which must remain binary compatible. */ -union remote_sched_param_value switch (int type) { - case VIR_DOMAIN_SCHED_FIELD_INT: +union remote_typed_param_value switch (int type) { + case VIR_TYPED_PARAM_INT: int i; - case VIR_DOMAIN_SCHED_FIELD_UINT: + case VIR_TYPED_PARAM_UINT: unsigned int ui; - case VIR_DOMAIN_SCHED_FIELD_LLONG: + case VIR_TYPED_PARAM_LLONG: hyper l; - case VIR_DOMAIN_SCHED_FIELD_ULLONG: + case VIR_TYPED_PARAM_ULLONG: unsigned hyper ul; - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: + case VIR_TYPED_PARAM_DOUBLE: double d; - case VIR_DOMAIN_SCHED_FIELD_BOOLEAN: + case VIR_TYPED_PARAM_BOOLEAN: int b; }; -struct remote_sched_param { +struct remote_typed_param { remote_nonnull_string field; - remote_sched_param_value value; -}; - -union remote_blkio_param_value switch (int type) { - case VIR_DOMAIN_BLKIO_PARAM_INT: - int i; - case VIR_DOMAIN_BLKIO_PARAM_UINT: - unsigned int ui; - case VIR_DOMAIN_BLKIO_PARAM_LLONG: - hyper l; - case VIR_DOMAIN_BLKIO_PARAM_ULLONG: - unsigned hyper ul; - case VIR_DOMAIN_BLKIO_PARAM_DOUBLE: - double d; - case VIR_DOMAIN_BLKIO_PARAM_BOOLEAN: - int b; -}; - -struct remote_blkio_param { - remote_nonnull_string field; - remote_blkio_param_value value; -}; - -union remote_memory_param_value switch (int type) { - case VIR_DOMAIN_MEMORY_PARAM_INT: - int i; - case VIR_DOMAIN_MEMORY_PARAM_UINT: - unsigned int ui; - case VIR_DOMAIN_MEMORY_PARAM_LLONG: - hyper l; - case VIR_DOMAIN_MEMORY_PARAM_ULLONG: - unsigned hyper ul; - case VIR_DOMAIN_MEMORY_PARAM_DOUBLE: - double d; - case VIR_DOMAIN_MEMORY_PARAM_BOOLEAN: - int b; -}; - -struct remote_memory_param { - remote_nonnull_string field; - remote_memory_param_value value; + remote_typed_param_value value; }; /*----- Calls. -----*/ @@ -471,23 +431,23 @@ struct remote_domain_get_scheduler_parameters_args { }; struct remote_domain_get_scheduler_parameters_ret { - remote_sched_param params<REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX>; + remote_typed_param params<REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX>; }; struct remote_domain_set_scheduler_parameters_args { remote_nonnull_domain dom; - remote_sched_param params<REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX>; + remote_typed_param params<REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX>; }; struct remote_domain_set_scheduler_parameters_flags_args { remote_nonnull_domain dom; - remote_sched_param params<REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX>; + remote_typed_param params<REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX>; unsigned int flags; }; struct remote_domain_set_blkio_parameters_args { remote_nonnull_domain dom; - remote_blkio_param params<REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX>; + remote_typed_param params<REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX>; unsigned int flags; }; @@ -498,13 +458,13 @@ struct remote_domain_get_blkio_parameters_args { }; struct remote_domain_get_blkio_parameters_ret { - remote_blkio_param params<REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX>; + remote_typed_param params<REMOTE_DOMAIN_BLKIO_PARAMETERS_MAX>; int nparams; }; struct remote_domain_set_memory_parameters_args { remote_nonnull_domain dom; - remote_memory_param params<REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX>; + remote_typed_param params<REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX>; unsigned int flags; }; @@ -515,7 +475,7 @@ struct remote_domain_get_memory_parameters_args { }; struct remote_domain_get_memory_parameters_ret { - remote_memory_param params<REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX>; + remote_typed_param params<REMOTE_DOMAIN_MEMORY_PARAMETERS_MAX>; int nparams; }; diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index c0152cb..86ad107 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -56,7 +56,7 @@ struct remote_vcpu_info { uint64_t cpu_time; int cpu; }; -struct remote_sched_param_value { +struct remote_typed_param_value { int type; union { int i; @@ -65,41 +65,11 @@ struct remote_sched_param_value { uint64_t ul; double d; int b; - } remote_sched_param_value_u; + } remote_typed_param_value_u; }; -struct remote_sched_param { +struct remote_typed_param { remote_nonnull_string field; - remote_sched_param_value value; -}; -struct remote_blkio_param_value { - int type; - union { - int i; - u_int ui; - int64_t l; - uint64_t ul; - double d; - int b; - } remote_blkio_param_value_u; -}; -struct remote_blkio_param { - remote_nonnull_string field; - remote_blkio_param_value value; -}; -struct remote_memory_param_value { - int type; - union { - int i; - u_int ui; - int64_t l; - uint64_t ul; - double d; - int b; - } remote_memory_param_value_u; -}; -struct remote_memory_param { - remote_nonnull_string field; - remote_memory_param_value value; + remote_typed_param_value value; }; struct remote_open_args { remote_string name; @@ -178,21 +148,21 @@ struct remote_domain_get_scheduler_parameters_args { struct remote_domain_get_scheduler_parameters_ret { struct { u_int params_len; - remote_sched_param * params_val; + remote_typed_param * params_val; } params; }; struct remote_domain_set_scheduler_parameters_args { remote_nonnull_domain dom; struct { u_int params_len; - remote_sched_param * params_val; + remote_typed_param * params_val; } params; }; struct remote_domain_set_scheduler_parameters_flags_args { remote_nonnull_domain dom; struct { u_int params_len; - remote_sched_param * params_val; + remote_typed_param * params_val; } params; u_int flags; }; @@ -200,7 +170,7 @@ struct remote_domain_set_blkio_parameters_args { remote_nonnull_domain dom; struct { u_int params_len; - remote_blkio_param * params_val; + remote_typed_param * params_val; } params; u_int flags; }; @@ -212,7 +182,7 @@ struct remote_domain_get_blkio_parameters_args { struct remote_domain_get_blkio_parameters_ret { struct { u_int params_len; - remote_blkio_param * params_val; + remote_typed_param * params_val; } params; int nparams; }; @@ -220,7 +190,7 @@ struct remote_domain_set_memory_parameters_args { remote_nonnull_domain dom; struct { u_int params_len; - remote_memory_param * params_val; + remote_typed_param * params_val; } params; u_int flags; }; @@ -232,7 +202,7 @@ struct remote_domain_get_memory_parameters_args { struct remote_domain_get_memory_parameters_ret { struct { u_int params_len; - remote_memory_param * params_val; + remote_typed_param * params_val; } params; int nparams; }; -- 1.7.4.4

If we can choose live or config when setting, then we need to be able to choose which one we are querying. Also, make the documentation clear that set must use a non-empty subset (some of the hypervisors fail if params is NULL). * include/libvirt/libvirt.h.in (virDomainGetSchedulerParametersFlags): New prototype. * src/libvirt.c (virDomainGetSchedulerParametersFlags): Implement it. * src/libvirt_public.syms: Export it. * python/generator.py (skip_impl): Don't auto-generate. * src/driver.h (virDrvDomainGetSchedulerParametersFlags): New callback. --- include/libvirt/libvirt.h.in | 8 ++-- python/generator.py | 1 + src/driver.h | 8 ++++ src/libvirt.c | 76 ++++++++++++++++++++++++++++++++++++++++-- src/libvirt_public.syms | 1 + 5 files changed, 87 insertions(+), 7 deletions(-) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index c1d028a..4a72a24 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -350,6 +350,10 @@ typedef enum { int virDomainGetSchedulerParameters (virDomainPtr domain, virTypedParameterPtr params, int *nparams); +int virDomainGetSchedulerParametersFlags (virDomainPtr domain, + virTypedParameterPtr params, + int *nparams, + unsigned int flags); /* * Change scheduler parameters @@ -357,10 +361,6 @@ int virDomainGetSchedulerParameters (virDomainPtr domain, int virDomainSetSchedulerParameters (virDomainPtr domain, virTypedParameterPtr params, int nparams); - -/* - * Change scheduler parameters - */ int virDomainSetSchedulerParametersFlags (virDomainPtr domain, virTypedParameterPtr params, int nparams, diff --git a/python/generator.py b/python/generator.py index 1741bba..7c38fdd 100755 --- a/python/generator.py +++ b/python/generator.py @@ -323,6 +323,7 @@ skip_impl = ( 'virNodeGetCellsFreeMemory', 'virDomainGetSchedulerType', 'virDomainGetSchedulerParameters', + 'virDomainGetSchedulerParametersFlags', 'virDomainSetSchedulerParameters', 'virDomainSetSchedulerParametersFlags', 'virDomainSetBlkioParameters', diff --git a/src/driver.h b/src/driver.h index 6ef19af..2e01bc6 100644 --- a/src/driver.h +++ b/src/driver.h @@ -280,6 +280,13 @@ typedef int int *nparams); typedef int + (*virDrvDomainGetSchedulerParametersFlags) + (virDomainPtr domain, + virTypedParameterPtr params, + int *nparams, + unsigned int flags); + +typedef int (*virDrvDomainSetSchedulerParameters) (virDomainPtr domain, virTypedParameterPtr params, @@ -686,6 +693,7 @@ struct _virDriver { virDrvDomainSetAutostart domainSetAutostart; virDrvDomainGetSchedulerType domainGetSchedulerType; virDrvDomainGetSchedulerParameters domainGetSchedulerParameters; + virDrvDomainGetSchedulerParametersFlags domainGetSchedulerParametersFlags; virDrvDomainSetSchedulerParameters domainSetSchedulerParameters; virDrvDomainSetSchedulerParametersFlags domainSetSchedulerParametersFlags; virDrvDomainMigratePrepare domainMigratePrepare; diff --git a/src/libvirt.c b/src/libvirt.c index 54fc1fa..c14b508 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -5428,7 +5428,9 @@ error: * * Get all scheduler parameters, the @params array will be filled with the * values and @nparams will be updated to the number of valid elements in - * @params. + * @params. It is hypervisor specific whether this returns the live or + * persistent state; for more control, use + * virDomainGetSchedulerParametersFlags. * * Returns -1 in case of error, 0 in case of success. */ @@ -5471,6 +5473,67 @@ error: } /** + * virDomainGetSchedulerParametersFlags: + * @domain: pointer to domain object + * @params: pointer to scheduler parameter object + * (return value) + * @nparams: pointer to number of scheduler parameter + * (this value should be same than the returned value + * nparams of virDomainGetSchedulerType) + * @flags: virDomainSchedParameterFlags + * + * Get the scheduler parameters, the @params array will be filled with the + * values. + * + * The value of @flags can be exactly VIR_DOMAIN_SCHEDPARAM_CURRENT, + * VIR_DOMAIN_SCHEDPARAM_LIVE, or VIR_DOMAIN_SCHEDPARAM_CONFIG. + * + * Returns -1 in case of error, 0 in case of success. + */ +int +virDomainGetSchedulerParametersFlags(virDomainPtr domain, + virTypedParameterPtr params, int *nparams, + unsigned int flags) +{ + virConnectPtr conn; + + VIR_DOMAIN_DEBUG(domain, "params=%p, nparams=%p, flags=%u", + params, nparams, flags); + + virResetLastError(); + + if (!(flags & (VIR_DOMAIN_SCHEDPARAM_LIVE | + VIR_DOMAIN_SCHEDPARAM_CONFIG | + VIR_DOMAIN_SCHEDPARAM_CURRENT))) { + virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__); + virDispatchError(NULL); + return -1; + } + + if (!VIR_IS_CONNECTED_DOMAIN(domain)) { + virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); + virDispatchError(NULL); + return -1; + } + conn = domain->conn; + + if (conn->driver->domainGetSchedulerParametersFlags) { + int ret; + ret = conn->driver->domainGetSchedulerParametersFlags (domain, params, + nparams, flags); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + virDispatchError(domain->conn); + return -1; +} + +/** * virDomainSetSchedulerParameters: * @domain: pointer to domain object * @params: pointer to scheduler parameter objects @@ -5478,7 +5541,10 @@ error: * (this value can be the same or less than the returned value * nparams of virDomainGetSchedulerType) * - * Change all or a subset or the scheduler parameters. + * Change all or a subset or the scheduler parameters. It is + * hypervisor-specific whether this sets live, persistent, or both + * settings; for more control, use + * virDomainSetSchedulerParametersFlags. * * Returns -1 in case of error, 0 in case of success. */ @@ -5534,7 +5600,11 @@ error: * nparams of virDomainGetSchedulerType) * @flags: virDomainSchedParameterFlags * - * Change a subset or all scheduler parameters. + * Change a subset or all scheduler parameters. The value of @flags + * should be either VIR_DOMAIN_SCHEDPARAM_CURRENT, or a bitwise-or of + * values from VIR_DOMAIN_SCHEDPARAM_LIVE and + * VIR_DOMAIN_SCHEDPARAM_CURRENT, although hypervisors vary in which + * flags are supported. * * Returns -1 in case of error, 0 in case of success. */ diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index cd23f69..b8e72a1 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -438,6 +438,7 @@ LIBVIRT_0.9.0 { LIBVIRT_0.9.2 { global: + virDomainGetSchedulerParametersFlags; virDomainGetState; virDomainInjectNMI; virDomainScreenshot; -- 1.7.4.4

On 05/26/2011 12:17 PM, Eric Blake wrote:
If we can choose live or config when setting, then we need to be able to choose which one we are querying.
Also, make the documentation clear that set must use a non-empty subset (some of the hypervisors fail if params is NULL).
+int +virDomainGetSchedulerParametersFlags(virDomainPtr domain, + virTypedParameterPtr params, int *nparams, + unsigned int flags) +{ + virConnectPtr conn; + + VIR_DOMAIN_DEBUG(domain, "params=%p, nparams=%p, flags=%u", + params, nparams, flags); + + virResetLastError(); + + if (!(flags & (VIR_DOMAIN_SCHEDPARAM_LIVE | + VIR_DOMAIN_SCHEDPARAM_CONFIG | + VIR_DOMAIN_SCHEDPARAM_CURRENT))) { + virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__); + virDispatchError(NULL); + return -1;
Aargh - I missed a review comment that the front end should not filter flags, but instead each driver. v3 coming up. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

If we can choose live or config when setting, then we need to be able to choose which one we are querying. Also, make the documentation clear that set must use a non-empty subset (some of the hypervisors fail if params is NULL). * include/libvirt/libvirt.h.in (virDomainGetSchedulerParametersFlags): New prototype. * src/libvirt.c (virDomainGetSchedulerParametersFlags): Implement it. * src/libvirt_public.syms: Export it. * python/generator.py (skip_impl): Don't auto-generate. * src/driver.h (virDrvDomainGetSchedulerParametersFlags): New callback. --- diffs in v3: rework libvirt.c to match other recent changes (no flags checking, but do check for NULL arguments). All other 7 patches in this series are unchanged from v2. include/libvirt/libvirt.h.in | 8 ++-- python/generator.py | 1 + src/driver.h | 8 ++++ src/libvirt.c | 74 ++++++++++++++++++++++++++++++++++++++++-- src/libvirt_public.syms | 5 ++- 5 files changed, 87 insertions(+), 9 deletions(-) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index c1d028a..4a72a24 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -350,6 +350,10 @@ typedef enum { int virDomainGetSchedulerParameters (virDomainPtr domain, virTypedParameterPtr params, int *nparams); +int virDomainGetSchedulerParametersFlags (virDomainPtr domain, + virTypedParameterPtr params, + int *nparams, + unsigned int flags); /* * Change scheduler parameters @@ -357,10 +361,6 @@ int virDomainGetSchedulerParameters (virDomainPtr domain, int virDomainSetSchedulerParameters (virDomainPtr domain, virTypedParameterPtr params, int nparams); - -/* - * Change scheduler parameters - */ int virDomainSetSchedulerParametersFlags (virDomainPtr domain, virTypedParameterPtr params, int nparams, diff --git a/python/generator.py b/python/generator.py index 1741bba..7c38fdd 100755 --- a/python/generator.py +++ b/python/generator.py @@ -323,6 +323,7 @@ skip_impl = ( 'virNodeGetCellsFreeMemory', 'virDomainGetSchedulerType', 'virDomainGetSchedulerParameters', + 'virDomainGetSchedulerParametersFlags', 'virDomainSetSchedulerParameters', 'virDomainSetSchedulerParametersFlags', 'virDomainSetBlkioParameters', diff --git a/src/driver.h b/src/driver.h index 6ef19af..2e01bc6 100644 --- a/src/driver.h +++ b/src/driver.h @@ -280,6 +280,13 @@ typedef int int *nparams); typedef int + (*virDrvDomainGetSchedulerParametersFlags) + (virDomainPtr domain, + virTypedParameterPtr params, + int *nparams, + unsigned int flags); + +typedef int (*virDrvDomainSetSchedulerParameters) (virDomainPtr domain, virTypedParameterPtr params, @@ -686,6 +693,7 @@ struct _virDriver { virDrvDomainSetAutostart domainSetAutostart; virDrvDomainGetSchedulerType domainGetSchedulerType; virDrvDomainGetSchedulerParameters domainGetSchedulerParameters; + virDrvDomainGetSchedulerParametersFlags domainGetSchedulerParametersFlags; virDrvDomainSetSchedulerParameters domainSetSchedulerParameters; virDrvDomainSetSchedulerParametersFlags domainSetSchedulerParametersFlags; virDrvDomainMigratePrepare domainMigratePrepare; diff --git a/src/libvirt.c b/src/libvirt.c index 8317d14..4c8831a 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -5428,7 +5428,9 @@ error: * * Get all scheduler parameters, the @params array will be filled with the * values and @nparams will be updated to the number of valid elements in - * @params. + * @params. It is hypervisor specific whether this returns the live or + * persistent state; for more control, use + * virDomainGetSchedulerParametersFlags. * * Returns -1 in case of error, 0 in case of success. */ @@ -5471,6 +5473,65 @@ error: } /** + * virDomainGetSchedulerParametersFlags: + * @domain: pointer to domain object + * @params: pointer to scheduler parameter object + * (return value) + * @nparams: pointer to number of scheduler parameter + * (this value should be same than the returned value + * nparams of virDomainGetSchedulerType) + * @flags: virDomainSchedParameterFlags + * + * Get the scheduler parameters, the @params array will be filled with the + * values. + * + * The value of @flags can be exactly VIR_DOMAIN_SCHEDPARAM_CURRENT, + * VIR_DOMAIN_SCHEDPARAM_LIVE, or VIR_DOMAIN_SCHEDPARAM_CONFIG. + * + * Returns -1 in case of error, 0 in case of success. + */ +int +virDomainGetSchedulerParametersFlags(virDomainPtr domain, + virTypedParameterPtr params, int *nparams, + unsigned int flags) +{ + virConnectPtr conn; + + VIR_DOMAIN_DEBUG(domain, "params=%p, nparams=%p, flags=%u", + params, nparams, flags); + + virResetLastError(); + + if (!VIR_IS_CONNECTED_DOMAIN(domain)) { + virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__); + virDispatchError(NULL); + return -1; + } + + if (params == NULL || nparams == NULL || *nparams <= 0) { + virLibDomainError(VIR_ERR_INVALID_ARG, __FUNCTION__); + goto error; + } + + conn = domain->conn; + + if (conn->driver->domainGetSchedulerParametersFlags) { + int ret; + ret = conn->driver->domainGetSchedulerParametersFlags (domain, params, + nparams, flags); + if (ret < 0) + goto error; + return ret; + } + + virLibConnError(VIR_ERR_NO_SUPPORT, __FUNCTION__); + +error: + virDispatchError(domain->conn); + return -1; +} + +/** * virDomainSetSchedulerParameters: * @domain: pointer to domain object * @params: pointer to scheduler parameter objects @@ -5478,7 +5539,10 @@ error: * (this value can be the same or less than the returned value * nparams of virDomainGetSchedulerType) * - * Change all or a subset or the scheduler parameters. + * Change all or a subset or the scheduler parameters. It is + * hypervisor-specific whether this sets live, persistent, or both + * settings; for more control, use + * virDomainSetSchedulerParametersFlags. * * Returns -1 in case of error, 0 in case of success. */ @@ -5534,7 +5598,11 @@ error: * nparams of virDomainGetSchedulerType) * @flags: virDomainSchedParameterFlags * - * Change a subset or all scheduler parameters. + * Change a subset or all scheduler parameters. The value of @flags + * should be either VIR_DOMAIN_SCHEDPARAM_CURRENT, or a bitwise-or of + * values from VIR_DOMAIN_SCHEDPARAM_LIVE and + * VIR_DOMAIN_SCHEDPARAM_CURRENT, although hypervisors vary in which + * flags are supported. * * Returns -1 in case of error, 0 in case of success. */ diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms index cd23f69..d3488d8 100644 --- a/src/libvirt_public.syms +++ b/src/libvirt_public.syms @@ -438,12 +438,13 @@ LIBVIRT_0.9.0 { LIBVIRT_0.9.2 { global: + virDomainGetSchedulerParametersFlags; virDomainGetState; virDomainInjectNMI; + virDomainMigrate2; + virDomainMigrateToURI2; virDomainScreenshot; virDomainSetSchedulerParametersFlags; - virDomainMigrate2; - virDomainMigrateToURI2; } LIBVIRT_0.9.0; # .... define new API here using predicted next version number .... -- 1.7.4.4

* src/qemu/qemu_driver.c (qemuGetSchedulerParameters): Move guts... (qemuGetSchedulerParametersFlags): ...to new callback, and honor flags more accurately. --- src/qemu/qemu_driver.c | 77 +++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 66 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 7922ae6..8c37e9c 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5092,7 +5092,7 @@ static int qemuSetSchedulerParametersFlags(virDomainPtr dom, flags = VIR_DOMAIN_SCHEDPARAM_CONFIG; } - if ((flags & VIR_DOMAIN_MEM_CONFIG) && !vm->persistent) { + if ((flags & VIR_DOMAIN_SCHEDPARAM_CONFIG) && !vm->persistent) { qemuReportError(VIR_ERR_OPERATION_INVALID, "%s", _("cannot change persistent config of a transient domain")); goto cleanup; @@ -5182,9 +5182,11 @@ static int qemuSetSchedulerParameters(virDomainPtr dom, VIR_DOMAIN_SCHEDPARAM_LIVE); } -static int qemuGetSchedulerParameters(virDomainPtr dom, - virTypedParameterPtr params, - int *nparams) +static int +qemuGetSchedulerParametersFlags(virDomainPtr dom, + virTypedParameterPtr params, + int *nparams, + unsigned int flags) { struct qemud_driver *driver = dom->conn->privateData; virCgroupPtr group = NULL; @@ -5192,11 +5194,15 @@ static int qemuGetSchedulerParameters(virDomainPtr dom, unsigned long long val; int ret = -1; int rc; + bool isActive; - qemuDriverLock(driver); - if (!qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPU)) { - qemuReportError(VIR_ERR_OPERATION_INVALID, - "%s", _("cgroup CPU controller is not mounted")); + virCheckFlags(VIR_DOMAIN_SCHEDPARAM_LIVE | + VIR_DOMAIN_SCHEDPARAM_CONFIG, -1); + + if ((flags & (VIR_DOMAIN_SCHEDPARAM_LIVE | VIR_DOMAIN_SCHEDPARAM_CONFIG)) == + (VIR_DOMAIN_SCHEDPARAM_LIVE | VIR_DOMAIN_SCHEDPARAM_CONFIG)) { + qemuReportError(VIR_ERR_INVALID_ARG, "%s", + _("cannot query live and config together")); goto cleanup; } @@ -5206,6 +5212,7 @@ static int qemuGetSchedulerParameters(virDomainPtr dom, goto cleanup; } + qemuDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); if (vm == NULL) { @@ -5214,11 +5221,50 @@ static int qemuGetSchedulerParameters(virDomainPtr dom, goto cleanup; } - if (!virDomainObjIsActive(vm)) { - val = vm->def->cputune.shares; + isActive = virDomainObjIsActive(vm); + + if (flags == VIR_DOMAIN_SCHEDPARAM_CURRENT) { + if (isActive) + flags = VIR_DOMAIN_SCHEDPARAM_LIVE; + else + flags = VIR_DOMAIN_SCHEDPARAM_CONFIG; + } + + if (flags & VIR_DOMAIN_SCHEDPARAM_CONFIG) { + if (!vm->persistent) { + qemuReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("cannot query persistent config of a transient domain")); + goto cleanup; + } + + if (isActive) { + virDomainDefPtr persistentDef; + + persistentDef = virDomainObjGetPersistentDef(driver->caps, vm); + if (!persistentDef) { + qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("can't get persistentDef")); + goto cleanup; + } + val = persistentDef->cputune.shares; + } else { + val = vm->def->cputune.shares; + } goto out; } + if (!isActive) { + qemuReportError(VIR_ERR_OPERATION_INVALID, "%s", + _("domain is not running")); + goto cleanup; + } + + if (!qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPU)) { + qemuReportError(VIR_ERR_OPERATION_INVALID, + "%s", _("cgroup CPU controller is not mounted")); + goto cleanup; + } + if (virCgroupForDomain(driver->cgroup, vm->def->name, &group, 0) != 0) { qemuReportError(VIR_ERR_INTERNAL_ERROR, _("cannot find cgroup for domain %s"), vm->def->name); @@ -5251,6 +5297,14 @@ cleanup: return ret; } +static int +qemuGetSchedulerParameters(virDomainPtr dom, + virTypedParameterPtr params, + int *nparams) +{ + return qemuGetSchedulerParametersFlags(dom, params, nparams, + VIR_DOMAIN_SCHEDPARAM_CURRENT); +} /* This uses the 'info blockstats' monitor command which was * integrated into both qemu & kvm in late 2007. If the command is @@ -7758,7 +7812,9 @@ static virDriver qemuDriver = { .domainSetAutostart = qemudDomainSetAutostart, /* 0.2.1 */ .domainGetSchedulerType = qemuGetSchedulerType, /* 0.7.0 */ .domainGetSchedulerParameters = qemuGetSchedulerParameters, /* 0.7.0 */ + .domainGetSchedulerParametersFlags = qemuGetSchedulerParametersFlags, /* 0.9.2 */ .domainSetSchedulerParameters = qemuSetSchedulerParameters, /* 0.7.0 */ + .domainSetSchedulerParametersFlags = qemuSetSchedulerParametersFlags, /* 0.9.2 */ .domainMigratePerform = qemudDomainMigratePerform, /* 0.5.0 */ .domainBlockStats = qemudDomainBlockStats, /* 0.4.1 */ .domainInterfaceStats = qemudDomainInterfaceStats, /* 0.4.1 */ @@ -7810,7 +7866,6 @@ static virDriver qemuDriver = { .domainMigratePerform3 = qemuDomainMigratePerform3, /* 0.9.2 */ .domainMigrateFinish3 = qemuDomainMigrateFinish3, /* 0.9.2 */ .domainMigrateConfirm3 = qemuDomainMigrateConfirm3, /* 0.9.2 */ - .domainSetSchedulerParametersFlags = qemuSetSchedulerParametersFlags, /* 0.9.2 */ }; -- 1.7.4.4

* daemon/remote.c (remoteDispatchDomainGetSchedulerParameters): New function. * src/remote/remote_driver.c (remoteDomainGetSchedulerParameters): Likewise. * src/remote/remote_protocol.x (remote_domain_get_scheduler_parameters_flags_args) (remote_domain_get_scheduler_parameters_flags_ret): New types. (remote_procedure): New RPC. * src/remote_protocol-structs: Likewise. --- daemon/remote.c | 53 ++++++++++++++++++++++++++++++++++++++++++ src/remote/remote_driver.c | 42 ++++++++++++++++++++++++++++++++- src/remote/remote_protocol.x | 13 +++++++++- src/remote_protocol-structs | 11 ++++++++ 4 files changed, 117 insertions(+), 2 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 75abddd..bc9fd3b 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -685,6 +685,59 @@ no_memory: } static int +remoteDispatchDomainGetSchedulerParametersFlags(struct qemud_server *server ATTRIBUTE_UNUSED, + struct qemud_client *client ATTRIBUTE_UNUSED, + virConnectPtr conn, + remote_message_header *hdr ATTRIBUTE_UNUSED, + remote_error *rerr, + remote_domain_get_scheduler_parameters_flags_args *args, + remote_domain_get_scheduler_parameters_flags_ret *ret) +{ + virDomainPtr dom = NULL; + virTypedParameterPtr params = NULL; + int nparams = args->nparams; + int rv = -1; + + if (!conn) { + virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open")); + goto cleanup; + } + + if (nparams > REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX) { + virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("nparams too large")); + goto cleanup; + } + if (VIR_ALLOC_N(params, nparams) < 0) + goto no_memory; + + if (!(dom = get_nonnull_domain(conn, args->dom))) + goto cleanup; + + if (virDomainGetSchedulerParametersFlags(dom, params, &nparams, + args->flags) < 0) + goto cleanup; + + if (remoteSerializeTypedParameters(params, nparams, + &ret->params.params_len, + &ret->params.params_val) < 0) + goto cleanup; + + rv = 0; + +cleanup: + if (rv < 0) + remoteDispatchError(rerr); + if (dom) + virDomainFree(dom); + VIR_FREE(params); + return rv; + +no_memory: + virReportOOMError(); + goto cleanup; +} + +static int remoteDispatchDomainSetSchedulerParameters(struct qemud_server *server ATTRIBUTE_UNUSED, struct qemud_client *client ATTRIBUTE_UNUSED, virConnectPtr conn, diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c index 79ee8e7..ef1b785 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -2467,6 +2467,45 @@ done: } static int +remoteDomainGetSchedulerParametersFlags (virDomainPtr domain, + virTypedParameterPtr params, + int *nparams, + unsigned int flags) +{ + int rv = -1; + remote_domain_get_scheduler_parameters_flags_args args; + remote_domain_get_scheduler_parameters_flags_ret ret; + struct private_data *priv = domain->conn->privateData; + + remoteDriverLock(priv); + + make_nonnull_domain (&args.dom, domain); + args.nparams = *nparams; + args.flags = flags; + + memset (&ret, 0, sizeof ret); + if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_GET_SCHEDULER_PARAMETERS_FLAGS, + (xdrproc_t) xdr_remote_domain_get_scheduler_parameters_flags_args, (char *) &args, + (xdrproc_t) xdr_remote_domain_get_scheduler_parameters_flags_ret, (char *) &ret) == -1) + goto done; + + if (remoteDeserializeTypedParameters(ret.params.params_len, + ret.params.params_val, + REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX, + params, + nparams) < 0) + goto cleanup; + + rv = 0; + +cleanup: + xdr_free ((xdrproc_t) xdr_remote_domain_get_scheduler_parameters_flags_ret, (char *) &ret); +done: + remoteDriverUnlock(priv); + return rv; +} + +static int remoteDomainSetSchedulerParameters (virDomainPtr domain, virTypedParameterPtr params, int nparams) { @@ -6424,7 +6463,9 @@ static virDriver remote_driver = { .domainSetAutostart = remoteDomainSetAutostart, /* 0.3.0 */ .domainGetSchedulerType = remoteDomainGetSchedulerType, /* 0.3.0 */ .domainGetSchedulerParameters = remoteDomainGetSchedulerParameters, /* 0.3.0 */ + .domainGetSchedulerParametersFlags = remoteDomainGetSchedulerParametersFlags, /* 0.9.2 */ .domainSetSchedulerParameters = remoteDomainSetSchedulerParameters, /* 0.3.0 */ + .domainSetSchedulerParametersFlags = remoteDomainSetSchedulerParametersFlags, /* 0.9.2 */ .domainMigratePrepare = remoteDomainMigratePrepare, /* 0.3.2 */ .domainMigratePerform = remoteDomainMigratePerform, /* 0.3.2 */ .domainMigrateFinish = remoteDomainMigrateFinish, /* 0.3.2 */ @@ -6478,7 +6519,6 @@ static virDriver remote_driver = { .domainMigratePerform3 = remoteDomainMigratePerform3, /* 0.9.2 */ .domainMigrateFinish3 = remoteDomainMigrateFinish3, /* 0.9.2 */ .domainMigrateConfirm3 = remoteDomainMigrateConfirm3, /* 0.9.2 */ - .domainSetSchedulerParametersFlags = remoteDomainSetSchedulerParametersFlags, /* 0.9.2 */ }; static virNetworkDriver network_driver = { diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x index 00ea1b8..eb0783c 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -434,6 +434,16 @@ struct remote_domain_get_scheduler_parameters_ret { remote_typed_param params<REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX>; }; +struct remote_domain_get_scheduler_parameters_flags_args { + remote_nonnull_domain dom; + int nparams; + unsigned int flags; +}; + +struct remote_domain_get_scheduler_parameters_flags_ret { + remote_typed_param params<REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX>; +}; + struct remote_domain_set_scheduler_parameters_args { remote_nonnull_domain dom; remote_typed_param params<REMOTE_DOMAIN_SCHEDULER_PARAMETERS_MAX>; @@ -2265,7 +2275,8 @@ enum remote_procedure { REMOTE_PROC_DOMAIN_MIGRATE_PERFORM3 = 216, /* skipgen skipgen */ REMOTE_PROC_DOMAIN_MIGRATE_FINISH3 = 217, /* skipgen skipgen */ REMOTE_PROC_DOMAIN_MIGRATE_CONFIRM3 = 218, /* skipgen skipgen */ - REMOTE_PROC_DOMAIN_SET_SCHEDULER_PARAMETERS_FLAGS = 219 /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_SET_SCHEDULER_PARAMETERS_FLAGS = 219, /* skipgen skipgen */ + REMOTE_PROC_DOMAIN_GET_SCHEDULER_PARAMETERS_FLAGS = 220 /* skipgen skipgen */ /* Notice how the entries are grouped in sets of 10 ? * Nice isn't it. Please keep it this way when adding more. diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index 86ad107..9e4a92a 100644 --- a/src/remote_protocol-structs +++ b/src/remote_protocol-structs @@ -151,6 +151,17 @@ struct remote_domain_get_scheduler_parameters_ret { remote_typed_param * params_val; } params; }; +struct remote_domain_get_scheduler_parameters_flags_args { + remote_nonnull_domain dom; + int nparams; + u_int flags; +}; +struct remote_domain_get_scheduler_parameters_flags_ret { + struct { + u_int params_len; + remote_typed_param * params_val; + } params; +}; struct remote_domain_set_scheduler_parameters_args { remote_nonnull_domain dom; struct { -- 1.7.4.4

Since we can now set just --live or --config, we also need to be able to query that back. In the case of setting both --live and --config, it shouldn't matter which value we read back; otherwise, since querying treats the two flags as mutually exclusive, so does this patch. * tools/virsh.c (cmdSchedinfo): Use new API where appropriate. --- tools/virsh.c | 32 +++++++++++++++++++++++++++----- 1 files changed, 27 insertions(+), 5 deletions(-) diff --git a/tools/virsh.c b/tools/virsh.c index 1779843..314e821 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -1745,7 +1745,7 @@ cmdSchedinfo(vshControl *ctl, const vshCmd *cmd) /* Print SchedulerType */ schedulertype = virDomainGetSchedulerType(dom, &nparams); - if (schedulertype != NULL){ + if (schedulertype != NULL) { vshPrint(ctl, "%-15s: %s\n", _("Scheduler"), schedulertype); VIR_FREE(schedulertype); @@ -1758,12 +1758,22 @@ cmdSchedinfo(vshControl *ctl, const vshCmd *cmd) params = vshMalloc(ctl, sizeof(*params) * nparams); memset(params, 0, sizeof(*params) * nparams); - ret = virDomainGetSchedulerParameters(dom, params, &nparams); + if (flags || current) { + /* We cannot query both live and config at once, so settle + on current in that case. If we are setting, then the + two values should match when we re-query; otherwise, we + report the error later. */ + ret = virDomainGetSchedulerParametersFlags(dom, params, &nparams, + ((live && config) ? 0 + : flags)); + } else { + ret = virDomainGetSchedulerParameters(dom, params, &nparams); + } if (ret == -1) goto cleanup; /* See if any params are being set */ - for (i = 0; i < nparams; i++){ + for (i = 0; i < nparams; i++) { ret = cmdSchedInfoUpdate(ctl, cmd, &(params[i])); if (ret == -1) goto cleanup; @@ -1782,7 +1792,13 @@ cmdSchedinfo(vshControl *ctl, const vshCmd *cmd) if (ret == -1) goto cleanup; - ret = virDomainGetSchedulerParameters(dom, params, &nparams); + if (flags || current) + ret = virDomainGetSchedulerParametersFlags(dom, params, + &nparams, + ((live && config) ? 0 + : flags)); + else + ret = virDomainGetSchedulerParameters(dom, params, &nparams); if (ret == -1) goto cleanup; } else { @@ -1795,10 +1811,16 @@ cmdSchedinfo(vshControl *ctl, const vshCmd *cmd) var_value_pair); goto cleanup; } + /* When not doing --set, --live and --config do not mix. */ + if (live && config) { + vshError(ctl, "%s", + _("cannot query both live and config at once")); + goto cleanup; + } } ret_val = true; - for (i = 0; i < nparams; i++){ + for (i = 0; i < nparams; i++) { switch (params[i].type) { case VIR_TYPED_PARAM_INT: vshPrint(ctl, "%-15s: %d\n", params[i].field, params[i].value.i); -- 1.7.4.4

Well, the remaining drivers that already had the get/set scheduler parameter functionality to begin with. For now, this blindly treats VIR_DOMAIN_SCHEDINFO_CURRENT as the only supported operation for these 5 domains; it will take domain-specific patches if more specific behavior is preferred. * src/esx/esx_driver.c (esxDomainGetSchedulerParameters) (esxDomainSetSchedulerParameters): Move guts... (esxDomainGetSchedulerParametersFlags) (esxDomainSetSchedulerParametersFlags): ...to new functions. * src/libxl/libxl_driver.c (libxlDomainGetSchedulerParameters) (libxlDomainSetSchedulerParameters) (libxlDomainGetSchedulerParametersFlags) (libxlDomainSetSchedulerParametersFlags): Likewise. * src/lxc/lxc_driver.c (lxcGetSchedulerParameters) (lxcSetSchedulerParameters, lxcGetSchedulerParametersFlags) (lxcSetSchedulerParametersFlags): Likewise. * src/test/test_driver.c (testDomainGetSchedulerParams) (testDomainSetSchedulerParams, testDomainGetSchedulerParamsFlags) (testDomainSetSchedulerParamsFlags): Likewise. * src/xen/xen_driver.c (xenUnifiedDomainGetSchedulerParameters) (xenUnifiedDomainSetSchedulerParameters) (xenUnifiedDomainGetSchedulerParametersFlags) (xenUnifiedDomainSetSchedulerParametersFlags): Likewise. --- src/esx/esx_driver.c | 28 ++++++++++++++++++++++++---- src/libxl/libxl_driver.c | 32 ++++++++++++++++++++++++++++---- src/lxc/lxc_driver.c | 38 ++++++++++++++++++++++++++++++++------ src/test/test_driver.c | 37 +++++++++++++++++++++++++++++++------ src/xen/xen_driver.c | 38 ++++++++++++++++++++++++++++++++------ 5 files changed, 147 insertions(+), 26 deletions(-) diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index 89df457..64c51a7 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -3532,8 +3532,9 @@ esxDomainGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED, int *nparams) static int -esxDomainGetSchedulerParameters(virDomainPtr domain, - virTypedParameterPtr params, int *nparams) +esxDomainGetSchedulerParametersFlags(virDomainPtr domain, + virTypedParameterPtr params, int *nparams, + unsigned int flags) { int result = -1; esxPrivate *priv = domain->conn->privateData; @@ -3544,6 +3545,8 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, unsigned int mask = 0; int i = 0; + virCheckFlags(0, -1); + if (*nparams < 3) { ESX_ERROR(VIR_ERR_INVALID_ARG, "%s", _("Parameter array must have space for 3 items")); @@ -3654,11 +3657,18 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, return result; } +static int +esxDomainGetSchedulerParameters(virDomainPtr domain, + virTypedParameterPtr params, int *nparams) +{ + return esxDomainGetSchedulerParametersFlags(domain, params, nparams, 0); +} static int -esxDomainSetSchedulerParameters(virDomainPtr domain, - virTypedParameterPtr params, int nparams) +esxDomainSetSchedulerParametersFlags(virDomainPtr domain, + virTypedParameterPtr params, int nparams, + unsigned int flags) { int result = -1; esxPrivate *priv = domain->conn->privateData; @@ -3670,6 +3680,8 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, char *taskInfoErrorMessage = NULL; int i; + virCheckFlags(0, -1); + if (esxVI_EnsureSession(priv->primary) < 0) { return -1; } @@ -3785,6 +3797,12 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, return result; } +static int +esxDomainSetSchedulerParameters(virDomainPtr domain, + virTypedParameterPtr params, int nparams) +{ + return esxDomainSetSchedulerParametersFlags(domain, params, nparams, 0); +} static int @@ -4684,7 +4702,9 @@ static virDriver esxDriver = { .domainSetAutostart = esxDomainSetAutostart, /* 0.9.0 */ .domainGetSchedulerType = esxDomainGetSchedulerType, /* 0.7.0 */ .domainGetSchedulerParameters = esxDomainGetSchedulerParameters, /* 0.7.0 */ + .domainGetSchedulerParametersFlags = esxDomainGetSchedulerParametersFlags, /* 0.9.2 */ .domainSetSchedulerParameters = esxDomainSetSchedulerParameters, /* 0.7.0 */ + .domainSetSchedulerParametersFlags = esxDomainSetSchedulerParametersFlags, /* 0.9.2 */ .domainMigratePrepare = esxDomainMigratePrepare, /* 0.7.0 */ .domainMigratePerform = esxDomainMigratePerform, /* 0.7.0 */ .domainMigrateFinish = esxDomainMigrateFinish, /* 0.7.0 */ diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c index 492f61a..312d414 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -2950,8 +2950,10 @@ cleanup: } static int -libxlDomainGetSchedulerParameters(virDomainPtr dom, virTypedParameterPtr params, - int *nparams) +libxlDomainGetSchedulerParametersFlags(virDomainPtr dom, + virTypedParameterPtr params, + int *nparams, + unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; libxlDomainObjPrivatePtr priv; @@ -2960,6 +2962,8 @@ libxlDomainGetSchedulerParameters(virDomainPtr dom, virTypedParameterPtr params, int sched_id; int ret = -1; + virCheckFlags(0, -1); + libxlDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); libxlDriverUnlock(driver); @@ -3027,8 +3031,17 @@ cleanup: } static int -libxlDomainSetSchedulerParameters(virDomainPtr dom, virTypedParameterPtr params, - int nparams) +libxlDomainGetSchedulerParameters(virDomainPtr dom, virTypedParameterPtr params, + int *nparams) +{ + return libxlDomainGetSchedulerParametersFlags(dom, params, nparams, 0); +} + +static int +libxlDomainSetSchedulerParametersFlags(virDomainPtr dom, + virTypedParameterPtr params, + int nparams, + unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; libxlDomainObjPrivatePtr priv; @@ -3038,6 +3051,8 @@ libxlDomainSetSchedulerParameters(virDomainPtr dom, virTypedParameterPtr params, int i; int ret = -1; + virCheckFlags(0, -1); + libxlDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); libxlDriverUnlock(driver); @@ -3115,6 +3130,13 @@ cleanup: } static int +libxlDomainSetSchedulerParameters(virDomainPtr dom, virTypedParameterPtr params, + int nparams) +{ + return libxlDomainSetSchedulerParametersFlags(dom, params, nparams, 0); +} + +static int libxlDomainIsActive(virDomainPtr dom) { libxlDriverPrivatePtr driver = dom->conn->privateData; @@ -3266,7 +3288,9 @@ static virDriver libxlDriver = { .domainSetAutostart = libxlDomainSetAutostart, /* 0.9.0 */ .domainGetSchedulerType = libxlDomainGetSchedulerType, /* 0.9.0 */ .domainGetSchedulerParameters = libxlDomainGetSchedulerParameters, /* 0.9.0 */ + .domainGetSchedulerParametersFlags = libxlDomainGetSchedulerParametersFlags, /* 0.9.2 */ .domainSetSchedulerParameters = libxlDomainSetSchedulerParameters, /* 0.9.0 */ + .domainSetSchedulerParametersFlags = libxlDomainSetSchedulerParametersFlags, /* 0.9.2 */ .nodeGetFreeMemory = libxlNodeGetFreeMemory, /* 0.9.0 */ .domainEventRegister = libxlDomainEventRegister, /* 0.9.0 */ .domainEventDeregister = libxlDomainEventDeregister, /* 0.9.0 */ diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c index 00e3f2a..6ee13da 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -2161,9 +2161,11 @@ static char *lxcGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED, return schedulerType; } -static int lxcSetSchedulerParameters(virDomainPtr domain, - virTypedParameterPtr params, - int nparams) +static int +lxcSetSchedulerParametersFlags(virDomainPtr domain, + virTypedParameterPtr params, + int nparams, + unsigned int flags) { lxc_driver_t *driver = domain->conn->privateData; int i; @@ -2171,6 +2173,8 @@ static int lxcSetSchedulerParameters(virDomainPtr domain, virDomainObjPtr vm = NULL; int ret = -1; + virCheckFlags(0, -1); + if (driver->cgroup == NULL) return -1; @@ -2222,9 +2226,19 @@ cleanup: return ret; } -static int lxcGetSchedulerParameters(virDomainPtr domain, - virTypedParameterPtr params, - int *nparams) +static int +lxcSetSchedulerParameters(virDomainPtr domain, + virTypedParameterPtr params, + int nparams) +{ + return lxcSetSchedulerParametersFlags(domain, params, nparams, 0); +} + +static int +lxcGetSchedulerParametersFlags(virDomainPtr domain, + virTypedParameterPtr params, + int *nparams, + unsigned int flags) { lxc_driver_t *driver = domain->conn->privateData; virCgroupPtr group = NULL; @@ -2232,6 +2246,8 @@ static int lxcGetSchedulerParameters(virDomainPtr domain, unsigned long long val; int ret = -1; + virCheckFlags(0, -1); + if (driver->cgroup == NULL) return -1; @@ -2276,6 +2292,14 @@ cleanup: return ret; } +static int +lxcGetSchedulerParameters(virDomainPtr domain, + virTypedParameterPtr params, + int *nparams) +{ + return lxcGetSchedulerParametersFlags(domain, params, nparams, 0); +} + #ifdef __linux__ static int lxcDomainInterfaceStats(virDomainPtr dom, @@ -2752,7 +2776,9 @@ static virDriver lxcDriver = { .domainSetAutostart = lxcDomainSetAutostart, /* 0.7.0 */ .domainGetSchedulerType = lxcGetSchedulerType, /* 0.5.0 */ .domainGetSchedulerParameters = lxcGetSchedulerParameters, /* 0.5.0 */ + .domainGetSchedulerParametersFlags = lxcGetSchedulerParametersFlags, /* 0.9.2 */ .domainSetSchedulerParameters = lxcSetSchedulerParameters, /* 0.5.0 */ + .domainSetSchedulerParametersFlags = lxcSetSchedulerParametersFlags, /* 0.9.2 */ .domainInterfaceStats = lxcDomainInterfaceStats, /* 0.7.3 */ .nodeGetCellsFreeMemory = nodeGetCellsFreeMemory, /* 0.6.5 */ .nodeGetFreeMemory = nodeGetFreeMemory, /* 0.6.5 */ diff --git a/src/test/test_driver.c b/src/test/test_driver.c index f1cc681..7cf8eab 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2634,14 +2634,18 @@ static char *testDomainGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED, return type; } -static int testDomainGetSchedulerParams(virDomainPtr domain, - virTypedParameterPtr params, - int *nparams) +static int +testDomainGetSchedulerParamsFlags(virDomainPtr domain, + virTypedParameterPtr params, + int *nparams, + unsigned int flags) { testConnPtr privconn = domain->conn->privateData; virDomainObjPtr privdom; int ret = -1; + virCheckFlags(0, -1); + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); @@ -2671,15 +2675,26 @@ cleanup: return ret; } +static int +testDomainGetSchedulerParams(virDomainPtr domain, + virTypedParameterPtr params, + int *nparams) +{ + return testDomainGetSchedulerParamsFlags(domain, params, nparams, 0); +} -static int testDomainSetSchedulerParams(virDomainPtr domain, - virTypedParameterPtr params, - int nparams) +static int +testDomainSetSchedulerParamsFlags(virDomainPtr domain, + virTypedParameterPtr params, + int nparams, + unsigned int flags) { testConnPtr privconn = domain->conn->privateData; virDomainObjPtr privdom; int ret = -1, i; + virCheckFlags(0, -1); + testDriverLock(privconn); privdom = virDomainFindByName(&privconn->domains, domain->name); @@ -2711,6 +2726,14 @@ cleanup: return ret; } +static int +testDomainSetSchedulerParams(virDomainPtr domain, + virTypedParameterPtr params, + int nparams) +{ + return testDomainSetSchedulerParamsFlags(domain, params, nparams, 0); +} + static int testDomainBlockStats(virDomainPtr domain, const char *path, struct _virDomainBlockStats *stats) @@ -5374,7 +5397,9 @@ static virDriver testDriver = { .domainSetAutostart = testDomainSetAutostart, /* 0.3.2 */ .domainGetSchedulerType = testDomainGetSchedulerType, /* 0.3.2 */ .domainGetSchedulerParameters = testDomainGetSchedulerParams, /* 0.3.2 */ + .domainGetSchedulerParametersFlags = testDomainGetSchedulerParamsFlags, /* 0.9.2 */ .domainSetSchedulerParameters = testDomainSetSchedulerParams, /* 0.3.2 */ + .domainSetSchedulerParametersFlags = testDomainSetSchedulerParamsFlags, /* 0.9.2 */ .domainBlockStats = testDomainBlockStats, /* 0.7.0 */ .domainInterfaceStats = testDomainInterfaceStats, /* 0.7.0 */ .nodeGetCellsFreeMemory = testNodeGetCellsFreeMemory, /* 0.4.2 */ diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index f527a7a..88febba 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -1676,13 +1676,16 @@ xenUnifiedDomainGetSchedulerType (virDomainPtr dom, int *nparams) } static int -xenUnifiedDomainGetSchedulerParameters (virDomainPtr dom, - virTypedParameterPtr params, - int *nparams) +xenUnifiedDomainGetSchedulerParametersFlags(virDomainPtr dom, + virTypedParameterPtr params, + int *nparams, + unsigned int flags) { GET_PRIVATE(dom->conn); int i, ret; + virCheckFlags(0, -1); + for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i) { if (priv->opened[i] && drivers[i]->domainGetSchedulerParameters) { ret = drivers[i]->domainGetSchedulerParameters(dom, params, nparams); @@ -1694,13 +1697,25 @@ xenUnifiedDomainGetSchedulerParameters (virDomainPtr dom, } static int -xenUnifiedDomainSetSchedulerParameters (virDomainPtr dom, - virTypedParameterPtr params, - int nparams) +xenUnifiedDomainGetSchedulerParameters(virDomainPtr dom, + virTypedParameterPtr params, + int *nparams) +{ + return xenUnifiedDomainGetSchedulerParametersFlags(dom, params, + nparams, 0); +} + +static int +xenUnifiedDomainSetSchedulerParametersFlags(virDomainPtr dom, + virTypedParameterPtr params, + int nparams, + unsigned int flags) { GET_PRIVATE(dom->conn); int i, ret; + virCheckFlags(0, -1); + /* do the hypervisor call last to get better error */ for (i = XEN_UNIFIED_NR_DRIVERS - 1; i >= 0; i--) { if (priv->opened[i] && drivers[i]->domainSetSchedulerParameters) { @@ -1714,6 +1729,15 @@ xenUnifiedDomainSetSchedulerParameters (virDomainPtr dom, } static int +xenUnifiedDomainSetSchedulerParameters(virDomainPtr dom, + virTypedParameterPtr params, + int nparams) +{ + return xenUnifiedDomainSetSchedulerParametersFlags(dom, params, + nparams, 0); +} + +static int xenUnifiedDomainBlockStats (virDomainPtr dom, const char *path, struct _virDomainBlockStats *stats) { @@ -2197,7 +2221,9 @@ static virDriver xenUnifiedDriver = { .domainSetAutostart = xenUnifiedDomainSetAutostart, /* 0.4.4 */ .domainGetSchedulerType = xenUnifiedDomainGetSchedulerType, /* 0.2.3 */ .domainGetSchedulerParameters = xenUnifiedDomainGetSchedulerParameters, /* 0.2.3 */ + .domainGetSchedulerParametersFlags = xenUnifiedDomainGetSchedulerParametersFlags, /* 0.9.2 */ .domainSetSchedulerParameters = xenUnifiedDomainSetSchedulerParameters, /* 0.2.3 */ + .domainSetSchedulerParametersFlags = xenUnifiedDomainSetSchedulerParametersFlags, /* 0.9.2 */ .domainMigratePrepare = xenUnifiedDomainMigratePrepare, /* 0.3.2 */ .domainMigratePerform = xenUnifiedDomainMigratePerform, /* 0.3.2 */ .domainMigrateFinish = xenUnifiedDomainMigrateFinish, /* 0.3.2 */ -- 1.7.4.4

On 05/26/2011 12:17 PM, Eric Blake wrote:
V2 of this original series: https://www.redhat.com/archives/libvir-list/2011-May/msg01142.html
Changes in this version: rebase to latest avoid regression in virTypedParameter consolidation write new API in terms of virTypedParameter instead of virSchedParameter
Eric Blake (8): libvirt.h: avoid regression, and document preferred name maint: prefer newer API names internally remote: consolidate typed parameter handling sched: introduce virDomainGetSchedulerParametersFlags qemu: introduce qemuGetSchedulerParametersFlags remote: introduce remoteGetSchedulerParametersFlags virsh: improve schedinfo querying ability sched: provide new API shims for remaining drivers
For easier review, v3 of this series is now at: git fetch git://repo.or.cz/libvirt/ericb.git getsched or browse-able at http://repo.or.cz/w/libvirt/ericb.git/shortlog/refs/heads/getsched -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

On Thu, May 26, 2011 at 02:34:48PM -0600, Eric Blake wrote:
On 05/26/2011 12:17 PM, Eric Blake wrote:
V2 of this original series: https://www.redhat.com/archives/libvir-list/2011-May/msg01142.html
Changes in this version: rebase to latest avoid regression in virTypedParameter consolidation write new API in terms of virTypedParameter instead of virSchedParameter
Eric Blake (8): libvirt.h: avoid regression, and document preferred name maint: prefer newer API names internally remote: consolidate typed parameter handling sched: introduce virDomainGetSchedulerParametersFlags qemu: introduce qemuGetSchedulerParametersFlags remote: introduce remoteGetSchedulerParametersFlags virsh: improve schedinfo querying ability sched: provide new API shims for remaining drivers
For easier review, v3 of this series is now at:
git fetch git://repo.or.cz/libvirt/ericb.git getsched
or browse-able at http://repo.or.cz/w/libvirt/ericb.git/shortlog/refs/heads/getsched
ACK, Okay, thanks, I reviewed and pushed. As indicated previously 1/8 really had to make RC1 so I pushed this. I had to rebase 3 or 4 of the patches since new APIs had been commited since then, but I think that looks okay, a small double check might be worth the time though :-) Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

On 05/29/2011 05:05 AM, Daniel Veillard wrote:
For easier review, v3 of this series is now at:
git fetch git://repo.or.cz/libvirt/ericb.git getsched
or browse-able at http://repo.or.cz/w/libvirt/ericb.git/shortlog/refs/heads/getsched
ACK,
Okay, thanks, I reviewed and pushed. As indicated previously 1/8 really had to make RC1 so I pushed this. I had to rebase 3 or 4 of the patches since new APIs had been commited since then, but I think that looks okay, a small double check might be worth the time though :-)
I didn't see any problem with your rebase. Thanks for doing the work to get this into rc1. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org
participants (2)
-
Daniel Veillard
-
Eric Blake