[libvirt] [PATCH 0/7] round out persistent cpu.shares patches

When I pushed Hu's patch series this morning, I pointed out that it was incomplete. This should fill in the gaps. Eric Blake (7): libvirt.h: consolidate typed parameter handling 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 | 549 +++++++++++++++++------------------------- include/libvirt/libvirt.h.in | 152 +++++++----- python/generator.py | 13 + src/driver.h | 8 + src/esx/esx_driver.c | 28 ++- src/libvirt.c | 84 ++++++- src/libvirt_public.syms | 1 + src/libxl/libxl_driver.c | 32 +++- src/lxc/lxc_driver.c | 34 +++- src/qemu/qemu_driver.c | 77 +++++- src/remote/remote_driver.c | 513 ++++++++++++++++----------------------- src/remote/remote_protocol.x | 87 +++----- src/remote_protocol-structs | 63 ++--- src/test/test_driver.c | 37 +++- src/xen/xen_driver.c | 36 +++- tools/virsh.c | 32 ++- 16 files changed, 900 insertions(+), 846 deletions(-) -- 1.7.4.4

* include/libvirt/libvirt.h.in (virTypedParameterType) (VIR_TYPED_PARAM_FIELD_LENGTH, _virTypedParameter): New enum, macro, and type. (virSchedParameter, virBlkioParameter, virMemoryParameter): Rewrite in terms of a common type, while keeping all old public names for backwards compatibility. (struct _virSchedParameter, struct _virBlkioParameter) (struct _virMemoryParameter): Delete - these are private names. * python/generator.py (enum): Cope with the refactoring. --- include/libvirt/libvirt.h.in | 144 +++++++++++++++++++++++------------------ python/generator.py | 12 ++++ 2 files changed, 93 insertions(+), 63 deletions(-) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index a174201..7cd6e13 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -281,18 +281,70 @@ struct _virNodeInfo { }; +/* Common data types shared among interfaces with name/type/value lists. */ + +/** + * virTypedParameterType: + * + * Express the type of a virTypedParameter + */ +typedef enum { + VIR_TYPED_PARAM_INT = 1, /* integer case */ + VIR_TYPED_PARAM_UINT = 2, /* unsigned integer case */ + VIR_TYPED_PARAM_LLONG = 3, /* long long case */ + VIR_TYPED_PARAM_ULLONG = 4, /* unsigned long long case */ + VIR_TYPED_PARAM_DOUBLE = 5, /* double case */ + VIR_TYPED_PARAM_BOOLEAN = 6 /* boolean(character) case */ +} virTypedParameterType; + +/** + * VIR_TYPED_PARAM_FIELD_LENGTH: + * + * Macro providing the field length of virTypedParameter name + */ +#define VIR_TYPED_PARAM_FIELD_LENGTH 80 + +/** + * virTypedParameter: + * + * A named parameter, including a type and value. + */ +typedef struct _virTypedParameter virTypedParameter; + +struct _virTypedParameter { + char field[VIR_TYPED_PARAM_FIELD_LENGTH]; /* parameter name */ + int type; /* parameter type, virTypedParameterType */ + union { + int i; /* type is INT */ + unsigned int ui; /* type is UINT */ + long long int l; /* type is LLONG */ + unsigned long long int ul; /* type is ULLONG */ + double d; /* type is DOUBLE */ + char b; /* type is BOOLEAN */ + } value; /* parameter value */ +}; + +/** + * virTypedParameterPtr: + * + * a pointer to a virTypedParameter structure. + */ +typedef virTypedParameter *virTypedParameterPtr; + +/* Management of scheduler parameters */ + /** * virDomainSchedParameterType: * * A scheduler parameter field type */ typedef enum { - VIR_DOMAIN_SCHED_FIELD_INT = 1, /* integer case */ - VIR_DOMAIN_SCHED_FIELD_UINT = 2, /* unsigned integer case */ - VIR_DOMAIN_SCHED_FIELD_LLONG = 3, /* long long case */ - VIR_DOMAIN_SCHED_FIELD_ULLONG = 4, /* unsigned long long case */ - VIR_DOMAIN_SCHED_FIELD_DOUBLE = 5, /* double case */ - VIR_DOMAIN_SCHED_FIELD_BOOLEAN = 6 /* boolean(character) case */ + 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; typedef enum { @@ -307,7 +359,7 @@ typedef enum { * Macro providing the field length of virSchedParameter */ -#define VIR_DOMAIN_SCHED_FIELD_LENGTH 80 +#define VIR_DOMAIN_SCHED_FIELD_LENGTH VIR_TYPED_PARAM_FIELD_LENGTH /** * virDomainSchedParameter: @@ -315,20 +367,7 @@ typedef enum { * a virDomainSchedParameter is the set of scheduler parameters */ -typedef struct _virSchedParameter virSchedParameter; - -struct _virSchedParameter { - char field[VIR_DOMAIN_SCHED_FIELD_LENGTH]; /* parameter name */ - int type; /* parameter type */ - union { - int i; /* data for integer case */ - unsigned int ui; /* data for unsigned integer case */ - long long int l; /* data for long long integer case */ - unsigned long long int ul; /* data for unsigned long long integer case */ - double d; /* data for double case */ - char b; /* data for char case */ - } value; /* parameter value */ -}; +typedef struct _virTypedParameter virSchedParameter; /** * virSchedParameterPtr: @@ -758,18 +797,21 @@ 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 = 1, /* integer case */ - VIR_DOMAIN_BLKIO_PARAM_UINT = 2, /* unsigned integer case */ - VIR_DOMAIN_BLKIO_PARAM_LLONG = 3, /* long long case */ - VIR_DOMAIN_BLKIO_PARAM_ULLONG = 4, /* unsigned long long case */ - VIR_DOMAIN_BLKIO_PARAM_DOUBLE = 5, /* double case */ - VIR_DOMAIN_BLKIO_PARAM_BOOLEAN = 6 /* boolean(character) case */ + 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; /** @@ -778,7 +820,7 @@ typedef enum { * Macro providing the field length of virBlkioParameter */ -#define VIR_DOMAIN_BLKIO_FIELD_LENGTH 80 +#define VIR_DOMAIN_BLKIO_FIELD_LENGTH VIR_TYPED_PARAM_FIELD_LENGTH /** * VIR_DOMAIN_BLKIO_WEIGHT: @@ -795,20 +837,7 @@ typedef enum { * a virDomainBlkioParameter is the set of blkio parameters */ -typedef struct _virBlkioParameter virBlkioParameter; - -struct _virBlkioParameter { - char field[VIR_DOMAIN_BLKIO_FIELD_LENGTH]; /* parameter name */ - int type; /* parameter type */ - union { - int i; /* data for integer case */ - unsigned int ui; /* data for unsigned integer case */ - long long int l; /* data for long long integer case */ - unsigned long long int ul; /* data for unsigned long long integer case */ - double d; /* data for double case */ - char b; /* data for char case */ - } value; /* parameter value */ -}; +typedef struct _virTypedParameter virBlkioParameter; /** * virBlkioParameterPtr: @@ -826,18 +855,20 @@ int virDomainGetBlkioParameters(virDomainPtr domain, virBlkioParameterPtr params, int *nparams, unsigned int flags); +/* Manage memory parameters. */ + /** * virDomainMemoryParameterType: * * A memory parameter field type */ typedef enum { - VIR_DOMAIN_MEMORY_PARAM_INT = 1, /* integer case */ - VIR_DOMAIN_MEMORY_PARAM_UINT = 2, /* unsigned integer case */ - VIR_DOMAIN_MEMORY_PARAM_LLONG = 3, /* long long case */ - VIR_DOMAIN_MEMORY_PARAM_ULLONG = 4, /* unsigned long long case */ - VIR_DOMAIN_MEMORY_PARAM_DOUBLE = 5, /* double case */ - VIR_DOMAIN_MEMORY_PARAM_BOOLEAN = 6 /* boolean(character) case */ + 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; /** @@ -846,7 +877,7 @@ typedef enum { * Macro providing the field length of virMemoryParameter */ -#define VIR_DOMAIN_MEMORY_FIELD_LENGTH 80 +#define VIR_DOMAIN_MEMORY_FIELD_LENGTH VIR_TYPED_PARAM_FIELD_LENGTH /** * VIR_DOMAIN_MEMORY_PARAM_UNLIMITED: @@ -899,20 +930,7 @@ typedef enum { * a virDomainMemoryParameter is the set of scheduler parameters */ -typedef struct _virMemoryParameter virMemoryParameter; - -struct _virMemoryParameter { - char field[VIR_DOMAIN_MEMORY_FIELD_LENGTH]; /* parameter name */ - int type; /* parameter type */ - union { - int i; /* data for integer case */ - unsigned int ui; /* data for unsigned integer case */ - long long int l; /* data for long long integer case */ - unsigned long long int ul; /* data for unsigned long long integer case */ - double d; /* data for double case */ - char b; /* data for char case */ - } value; /* parameter value */ -}; +typedef struct _virTypedParameter virMemoryParameter; /** * virMemoryParameterPtr: diff --git a/python/generator.py b/python/generator.py index 9f9deb2..1741bba 100755 --- a/python/generator.py +++ b/python/generator.py @@ -154,6 +154,18 @@ def function(name, desc, ret, args, file, cond): def enum(type, name, value): if not enums.has_key(type): enums[type] = {} + if value == 'VIR_TYPED_PARAM_INT': + value = 1 + elif value == 'VIR_TYPED_PARAM_UINT': + value = 2 + elif value == 'VIR_TYPED_PARAM_LLONG': + value = 3 + elif value == 'VIR_TYPED_PARAM_ULLONG': + value = 4 + elif value == 'VIR_TYPED_PARAM_DOUBLE': + value = 5 + elif value == 'VIR_TYPED_PARAM_BOOLEAN': + value = 6 enums[type][name] = value ####################################################################### -- 1.7.4.4

On Tue, May 17, 2011 at 04:42:09PM -0600, Eric Blake wrote:
* include/libvirt/libvirt.h.in (virTypedParameterType) (VIR_TYPED_PARAM_FIELD_LENGTH, _virTypedParameter): New enum, macro, and type. (virSchedParameter, virBlkioParameter, virMemoryParameter): Rewrite in terms of a common type, while keeping all old public names for backwards compatibility. (struct _virSchedParameter, struct _virBlkioParameter) (struct _virMemoryParameter): Delete - these are private names. * python/generator.py (enum): Cope with the refactoring. --- include/libvirt/libvirt.h.in | 144 +++++++++++++++++++++++------------------ python/generator.py | 12 ++++ 2 files changed, 93 insertions(+), 63 deletions(-)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index a174201..7cd6e13 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -281,18 +281,70 @@ struct _virNodeInfo { };
+/* Common data types shared among interfaces with name/type/value lists. */ + +/** + * virTypedParameterType: + * + * Express the type of a virTypedParameter + */ +typedef enum { + VIR_TYPED_PARAM_INT = 1, /* integer case */ + VIR_TYPED_PARAM_UINT = 2, /* unsigned integer case */ + VIR_TYPED_PARAM_LLONG = 3, /* long long case */ + VIR_TYPED_PARAM_ULLONG = 4, /* unsigned long long case */ + VIR_TYPED_PARAM_DOUBLE = 5, /* double case */ + VIR_TYPED_PARAM_BOOLEAN = 6 /* boolean(character) case */ +} virTypedParameterType; + +/** + * VIR_TYPED_PARAM_FIELD_LENGTH: + * + * Macro providing the field length of virTypedParameter name + */ +#define VIR_TYPED_PARAM_FIELD_LENGTH 80 + +/** + * virTypedParameter: + * + * A named parameter, including a type and value. + */ +typedef struct _virTypedParameter virTypedParameter; + +struct _virTypedParameter { + char field[VIR_TYPED_PARAM_FIELD_LENGTH]; /* parameter name */ + int type; /* parameter type, virTypedParameterType */
virTypedParameterType type; ?
+ union { + int i; /* type is INT */ + unsigned int ui; /* type is UINT */ + long long int l; /* type is LLONG */ + unsigned long long int ul; /* type is ULLONG */ + double d; /* type is DOUBLE */ + char b; /* type is BOOLEAN */ + } value; /* parameter value */ +}; + +/** + * virTypedParameterPtr: + * + * a pointer to a virTypedParameter structure. + */ +typedef virTypedParameter *virTypedParameterPtr; + +/* Management of scheduler parameters */ + /** * virDomainSchedParameterType: * * A scheduler parameter field type */ typedef enum { - VIR_DOMAIN_SCHED_FIELD_INT = 1, /* integer case */ - VIR_DOMAIN_SCHED_FIELD_UINT = 2, /* unsigned integer case */ - VIR_DOMAIN_SCHED_FIELD_LLONG = 3, /* long long case */ - VIR_DOMAIN_SCHED_FIELD_ULLONG = 4, /* unsigned long long case */ - VIR_DOMAIN_SCHED_FIELD_DOUBLE = 5, /* double case */ - VIR_DOMAIN_SCHED_FIELD_BOOLEAN = 6 /* boolean(character) case */ + 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;
Can we remove VIR_DOMAIN_SCHED_FIELD_XXX and use VIR_TYPED_PARAM_XXX directly since parameter types are basically types like int, long, ... and don't depend on what parameters are? Likewise for other PARAMs in this patch.
typedef enum { @@ -307,7 +359,7 @@ typedef enum { * Macro providing the field length of virSchedParameter */
-#define VIR_DOMAIN_SCHED_FIELD_LENGTH 80 +#define VIR_DOMAIN_SCHED_FIELD_LENGTH VIR_TYPED_PARAM_FIELD_LENGTH
/** * virDomainSchedParameter: @@ -315,20 +367,7 @@ typedef enum { * a virDomainSchedParameter is the set of scheduler parameters */
-typedef struct _virSchedParameter virSchedParameter; - -struct _virSchedParameter { - char field[VIR_DOMAIN_SCHED_FIELD_LENGTH]; /* parameter name */ - int type; /* parameter type */ - union { - int i; /* data for integer case */ - unsigned int ui; /* data for unsigned integer case */ - long long int l; /* data for long long integer case */ - unsigned long long int ul; /* data for unsigned long long integer case */ - double d; /* data for double case */ - char b; /* data for char case */ - } value; /* parameter value */ -}; +typedef struct _virTypedParameter virSchedParameter;
/** * virSchedParameterPtr: @@ -758,18 +797,21 @@ 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 = 1, /* integer case */ - VIR_DOMAIN_BLKIO_PARAM_UINT = 2, /* unsigned integer case */ - VIR_DOMAIN_BLKIO_PARAM_LLONG = 3, /* long long case */ - VIR_DOMAIN_BLKIO_PARAM_ULLONG = 4, /* unsigned long long case */ - VIR_DOMAIN_BLKIO_PARAM_DOUBLE = 5, /* double case */ - VIR_DOMAIN_BLKIO_PARAM_BOOLEAN = 6 /* boolean(character) case */ + 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;
/** @@ -778,7 +820,7 @@ typedef enum { * Macro providing the field length of virBlkioParameter */
-#define VIR_DOMAIN_BLKIO_FIELD_LENGTH 80 +#define VIR_DOMAIN_BLKIO_FIELD_LENGTH VIR_TYPED_PARAM_FIELD_LENGTH
/** * VIR_DOMAIN_BLKIO_WEIGHT: @@ -795,20 +837,7 @@ typedef enum { * a virDomainBlkioParameter is the set of blkio parameters */
-typedef struct _virBlkioParameter virBlkioParameter; - -struct _virBlkioParameter { - char field[VIR_DOMAIN_BLKIO_FIELD_LENGTH]; /* parameter name */ - int type; /* parameter type */ - union { - int i; /* data for integer case */ - unsigned int ui; /* data for unsigned integer case */ - long long int l; /* data for long long integer case */ - unsigned long long int ul; /* data for unsigned long long integer case */ - double d; /* data for double case */ - char b; /* data for char case */ - } value; /* parameter value */ -}; +typedef struct _virTypedParameter virBlkioParameter;
/** * virBlkioParameterPtr: @@ -826,18 +855,20 @@ int virDomainGetBlkioParameters(virDomainPtr domain, virBlkioParameterPtr params, int *nparams, unsigned int flags);
+/* Manage memory parameters. */ + /** * virDomainMemoryParameterType: * * A memory parameter field type */ typedef enum { - VIR_DOMAIN_MEMORY_PARAM_INT = 1, /* integer case */ - VIR_DOMAIN_MEMORY_PARAM_UINT = 2, /* unsigned integer case */ - VIR_DOMAIN_MEMORY_PARAM_LLONG = 3, /* long long case */ - VIR_DOMAIN_MEMORY_PARAM_ULLONG = 4, /* unsigned long long case */ - VIR_DOMAIN_MEMORY_PARAM_DOUBLE = 5, /* double case */ - VIR_DOMAIN_MEMORY_PARAM_BOOLEAN = 6 /* boolean(character) case */ + 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;
/** @@ -846,7 +877,7 @@ typedef enum { * Macro providing the field length of virMemoryParameter */
-#define VIR_DOMAIN_MEMORY_FIELD_LENGTH 80 +#define VIR_DOMAIN_MEMORY_FIELD_LENGTH VIR_TYPED_PARAM_FIELD_LENGTH
/** * VIR_DOMAIN_MEMORY_PARAM_UNLIMITED: @@ -899,20 +930,7 @@ typedef enum { * a virDomainMemoryParameter is the set of scheduler parameters */
-typedef struct _virMemoryParameter virMemoryParameter; - -struct _virMemoryParameter { - char field[VIR_DOMAIN_MEMORY_FIELD_LENGTH]; /* parameter name */ - int type; /* parameter type */ - union { - int i; /* data for integer case */ - unsigned int ui; /* data for unsigned integer case */ - long long int l; /* data for long long integer case */ - unsigned long long int ul; /* data for unsigned long long integer case */ - double d; /* data for double case */ - char b; /* data for char case */ - } value; /* parameter value */ -}; +typedef struct _virTypedParameter virMemoryParameter;
/** * virMemoryParameterPtr: diff --git a/python/generator.py b/python/generator.py index 9f9deb2..1741bba 100755 --- a/python/generator.py +++ b/python/generator.py @@ -154,6 +154,18 @@ def function(name, desc, ret, args, file, cond): def enum(type, name, value): if not enums.has_key(type): enums[type] = {} + if value == 'VIR_TYPED_PARAM_INT': + value = 1 + elif value == 'VIR_TYPED_PARAM_UINT': + value = 2 + elif value == 'VIR_TYPED_PARAM_LLONG': + value = 3 + elif value == 'VIR_TYPED_PARAM_ULLONG': + value = 4 + elif value == 'VIR_TYPED_PARAM_DOUBLE': + value = 5 + elif value == 'VIR_TYPED_PARAM_BOOLEAN': + value = 6 enums[type][name] = value
####################################################################### -- 1.7.4.4
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

2011/5/18 Hu Tao <hutao@cn.fujitsu.com>:
On Tue, May 17, 2011 at 04:42:09PM -0600, Eric Blake wrote:
* include/libvirt/libvirt.h.in (virTypedParameterType) (VIR_TYPED_PARAM_FIELD_LENGTH, _virTypedParameter): New enum, macro, and type. (virSchedParameter, virBlkioParameter, virMemoryParameter): Rewrite in terms of a common type, while keeping all old public names for backwards compatibility. (struct _virSchedParameter, struct _virBlkioParameter) (struct _virMemoryParameter): Delete - these are private names. * python/generator.py (enum): Cope with the refactoring. --- include/libvirt/libvirt.h.in | 144 +++++++++++++++++++++++------------------ python/generator.py | 12 ++++ 2 files changed, 93 insertions(+), 63 deletions(-)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index a174201..7cd6e13 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -281,18 +281,70 @@ struct _virNodeInfo { };
+/* Common data types shared among interfaces with name/type/value lists. */ + +/** + * virTypedParameterType: + * + * Express the type of a virTypedParameter + */ +typedef enum { + VIR_TYPED_PARAM_INT = 1, /* integer case */ + VIR_TYPED_PARAM_UINT = 2, /* unsigned integer case */ + VIR_TYPED_PARAM_LLONG = 3, /* long long case */ + VIR_TYPED_PARAM_ULLONG = 4, /* unsigned long long case */ + VIR_TYPED_PARAM_DOUBLE = 5, /* double case */ + VIR_TYPED_PARAM_BOOLEAN = 6 /* boolean(character) case */ +} virTypedParameterType; + +/** + * VIR_TYPED_PARAM_FIELD_LENGTH: + * + * Macro providing the field length of virTypedParameter name + */ +#define VIR_TYPED_PARAM_FIELD_LENGTH 80 + +/** + * virTypedParameter: + * + * A named parameter, including a type and value. + */ +typedef struct _virTypedParameter virTypedParameter; + +struct _virTypedParameter { + char field[VIR_TYPED_PARAM_FIELD_LENGTH]; /* parameter name */ + int type; /* parameter type, virTypedParameterType */
virTypedParameterType type; ?
We typically use int even for enum values. There is probably a reason for that but I'm not aware of it right now. In this case we might need to stick to int for ABI compatibility, because the old structs used int. Assuming that enum is not guaranteed to be the same size as int by the C standard, but I don't know.
+ union { + int i; /* type is INT */ + unsigned int ui; /* type is UINT */ + long long int l; /* type is LLONG */ + unsigned long long int ul; /* type is ULLONG */ + double d; /* type is DOUBLE */ + char b; /* type is BOOLEAN */ + } value; /* parameter value */ +}; + +/** + * virTypedParameterPtr: + * + * a pointer to a virTypedParameter structure. + */ +typedef virTypedParameter *virTypedParameterPtr; + +/* Management of scheduler parameters */ + /** * virDomainSchedParameterType: * * A scheduler parameter field type */ typedef enum { - VIR_DOMAIN_SCHED_FIELD_INT = 1, /* integer case */ - VIR_DOMAIN_SCHED_FIELD_UINT = 2, /* unsigned integer case */ - VIR_DOMAIN_SCHED_FIELD_LLONG = 3, /* long long case */ - VIR_DOMAIN_SCHED_FIELD_ULLONG = 4, /* unsigned long long case */ - VIR_DOMAIN_SCHED_FIELD_DOUBLE = 5, /* double case */ - VIR_DOMAIN_SCHED_FIELD_BOOLEAN = 6 /* boolean(character) case */ + 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;
Can we remove VIR_DOMAIN_SCHED_FIELD_XXX and use VIR_TYPED_PARAM_XXX directly since parameter types are basically types like int, long, ... and don't depend on what parameters are?
Likewise for other PARAMs in this patch.
We cannot, because the old symbols are part of the released API so we cannot remove them without breaking backwards compatibility. Matthias

On Wed, May 18, 2011 at 07:52:43AM +0200, Matthias Bolte wrote:
2011/5/18 Hu Tao <hutao@cn.fujitsu.com>:
On Tue, May 17, 2011 at 04:42:09PM -0600, Eric Blake wrote:
* include/libvirt/libvirt.h.in (virTypedParameterType) (VIR_TYPED_PARAM_FIELD_LENGTH, _virTypedParameter): New enum, macro, and type. (virSchedParameter, virBlkioParameter, virMemoryParameter): Rewrite in terms of a common type, while keeping all old public names for backwards compatibility. (struct _virSchedParameter, struct _virBlkioParameter) (struct _virMemoryParameter): Delete - these are private names. * python/generator.py (enum): Cope with the refactoring. --- include/libvirt/libvirt.h.in | 144 +++++++++++++++++++++++------------------ python/generator.py | 12 ++++ 2 files changed, 93 insertions(+), 63 deletions(-)
+/** + * virTypedParameter: + * + * A named parameter, including a type and value. + */ +typedef struct _virTypedParameter virTypedParameter; + +struct _virTypedParameter { + char field[VIR_TYPED_PARAM_FIELD_LENGTH]; /* parameter name */ + int type; /* parameter type, virTypedParameterType */
virTypedParameterType type; ?
We typically use int even for enum values. There is probably a reason for that but I'm not aware of it right now.
enum don't have a fixed size defined by the C standard. So we avoid using then for any API either in function signature or within public structure because we can't guarantee that the resulting ABI will be stable from one compiler to another.
In this case we might need to stick to int for ABI compatibility, because the old structs used int. Assuming that enum is not guaranteed to be the same size as int by the C standard, but I don't know.
yes we must keep int.
+ union { + int i; /* type is INT */ + unsigned int ui; /* type is UINT */ + long long int l; /* type is LLONG */ + unsigned long long int ul; /* type is ULLONG */ + double d; /* type is DOUBLE */ + char b; /* type is BOOLEAN */ + } value; /* parameter value */ +}; + +/** + * virTypedParameterPtr: + * + * a pointer to a virTypedParameter structure. + */ +typedef virTypedParameter *virTypedParameterPtr; + +/* Management of scheduler parameters */ + /** * virDomainSchedParameterType: * * A scheduler parameter field type */ typedef enum { - VIR_DOMAIN_SCHED_FIELD_INT = 1, /* integer case */ - VIR_DOMAIN_SCHED_FIELD_UINT = 2, /* unsigned integer case */ - VIR_DOMAIN_SCHED_FIELD_LLONG = 3, /* long long case */ - VIR_DOMAIN_SCHED_FIELD_ULLONG = 4, /* unsigned long long case */ - VIR_DOMAIN_SCHED_FIELD_DOUBLE = 5, /* double case */ - VIR_DOMAIN_SCHED_FIELD_BOOLEAN = 6 /* boolean(character) case */ + 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;
Can we remove VIR_DOMAIN_SCHED_FIELD_XXX and use VIR_TYPED_PARAM_XXX directly since parameter types are basically types like int, long, ... and don't depend on what parameters are?
Likewise for other PARAMs in this patch.
We cannot, because the old symbols are part of the released API so we cannot remove them without breaking backwards compatibility.
Agreed. Patch looks fine to me, and we should do that cleanup before the next release ! ACK, 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/18/2011 02:11 AM, Daniel Veillard wrote:
typedef enum { - VIR_DOMAIN_SCHED_FIELD_INT = 1, /* integer case */ - VIR_DOMAIN_SCHED_FIELD_UINT = 2, /* unsigned integer case */ - VIR_DOMAIN_SCHED_FIELD_LLONG = 3, /* long long case */ - VIR_DOMAIN_SCHED_FIELD_ULLONG = 4, /* unsigned long long case */ - VIR_DOMAIN_SCHED_FIELD_DOUBLE = 5, /* double case */ - VIR_DOMAIN_SCHED_FIELD_BOOLEAN = 6 /* boolean(character) case */ + 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;
Can we remove VIR_DOMAIN_SCHED_FIELD_XXX and use VIR_TYPED_PARAM_XXX directly since parameter types are basically types like int, long, ... and don't depend on what parameters are?
No, but I could do a followup patch that moves the old names to the bottom of the file along with a comment that they are old names; as well as clean up the rest of the code to use the new (shorter) names consistently.
Patch looks fine to me, and we should do that cleanup before the next release !
ACK,
Thanks; I've pushed this one as-is. New interfaces that follow the same paradigm can use the new type without having to create wrapper names (for example, I know that the net_cls cgroup controller has some name/value pairs worth exposing through libvirt someday). -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

* 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. --- I checked that on-the-wire format of the RPC call is identical. daemon/remote.c | 502 ++++++++++++++--------------------------- src/remote/remote_driver.c | 471 ++++++++++++++------------------------- src/remote/remote_protocol.x | 74 ++----- src/remote_protocol-structs | 52 +---- 4 files changed, 367 insertions(+), 732 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 42e1cb9..001e5bf 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -531,6 +531,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, @@ -542,7 +679,6 @@ remoteDispatchDomainGetSchedulerParameters(struct qemud_server *server ATTRIBUTE { virDomainPtr dom = NULL; virSchedParameterPtr params = NULL; - int i; int nparams = args->nparams; int rv = -1; @@ -564,48 +700,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); @@ -627,7 +731,7 @@ remoteDispatchDomainSetSchedulerParameters(struct qemud_server *server ATTRIBUTE { virDomainPtr dom = NULL; virSchedParameterPtr params = NULL; - int i, nparams; + int nparams; int rv = -1; if (!conn) { @@ -637,38 +741,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; @@ -698,7 +775,7 @@ remoteDispatchDomainSetSchedulerParametersFlags(struct qemud_server *server ATTR { virDomainPtr dom = NULL; virSchedParameterPtr params = NULL; - int i, nparams; + int nparams; int rv = -1; if (!conn) { @@ -706,40 +783,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; @@ -1340,7 +1388,7 @@ remoteDispatchDomainSetMemoryParameters(struct qemud_server *server { virDomainPtr dom = NULL; virMemoryParameterPtr params = NULL; - int i, nparams; + int nparams; unsigned int flags; int rv = -1; @@ -1349,61 +1397,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; @@ -1438,7 +1438,6 @@ remoteDispatchDomainGetMemoryParameters(struct qemud_server *server { virDomainPtr dom = NULL; virMemoryParameterPtr params = NULL; - int i; int nparams = args->nparams; unsigned int flags; int rv = -1; @@ -1473,75 +1472,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 @@ -1558,7 +1503,7 @@ remoteDispatchDomainSetBlkioParameters(struct qemud_server *server { virDomainPtr dom = NULL; virBlkioParameterPtr params = NULL; - int i, nparams; + int nparams; unsigned int flags; int rv = -1; @@ -1567,61 +1512,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; @@ -1656,7 +1553,6 @@ remoteDispatchDomainGetBlkioParameters(struct qemud_server *server { virDomainPtr dom = NULL; virBlkioParameterPtr params = NULL; - int i; int nparams = args->nparams; unsigned int flags; int rv = -1; @@ -1691,75 +1587,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 8c69743..5348ea3 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1780,64 +1780,157 @@ done: return rv; } +/* Helper to serialize typed parameters. */ static int -remoteDomainSetMemoryParameters (virDomainPtr domain, - virMemoryParameterPtr 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, + virMemoryParameterPtr 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; @@ -1863,7 +1956,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); @@ -1878,14 +1970,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 */ @@ -1895,49 +1979,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; @@ -1952,61 +1999,22 @@ done: static int remoteDomainSetBlkioParameters (virDomainPtr domain, virBlkioParameterPtr params, - int nparams, - unsigned int flags) + int nparams, + unsigned int flags) { 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; @@ -2032,7 +2040,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); @@ -2047,14 +2054,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 */ @@ -2064,49 +2063,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; @@ -2508,7 +2470,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); @@ -2522,45 +2483,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; @@ -2577,50 +2505,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; } @@ -2644,51 +2539,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 5932b2c..16141df 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. -----*/ @@ -468,23 +428,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; }; @@ -495,13 +455,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; }; @@ -512,7 +472,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 5b43cb4..64222cc 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

The older names still work, but we might as well use the newer type and enum names internally. * 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. * src/driver.h: Likewise. * 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. * python/libvirt-override.c: Likewise. --- Designed for use after 2/7, with minor fallout in the rest of the series when introducing the new virDomainGetSchedulerParametersFlags. daemon/remote.c | 14 +- include/libvirt/libvirt.h.in | 264 +++++++++++++++++++++++------------------- python/libvirt-override.c | 28 +++--- 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 | 16 ++-- 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 ++++++------ 16 files changed, 305 insertions(+), 281 deletions(-) diff --git a/daemon/remote.c b/daemon/remote.c index 001e5bf..425bce7 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -678,7 +678,7 @@ remoteDispatchDomainGetSchedulerParameters(struct qemud_server *server ATTRIBUTE remote_domain_get_scheduler_parameters_ret *ret) { virDomainPtr dom = NULL; - virSchedParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int nparams = args->nparams; int rv = -1; @@ -730,7 +730,7 @@ remoteDispatchDomainSetSchedulerParameters(struct qemud_server *server ATTRIBUTE void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom = NULL; - virSchedParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int nparams; int rv = -1; @@ -774,7 +774,7 @@ remoteDispatchDomainSetSchedulerParametersFlags(struct qemud_server *server ATTR void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom = NULL; - virSchedParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int nparams; int rv = -1; @@ -1387,7 +1387,7 @@ remoteDispatchDomainSetMemoryParameters(struct qemud_server *server * args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom = NULL; - virMemoryParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int nparams; unsigned int flags; int rv = -1; @@ -1437,7 +1437,7 @@ remoteDispatchDomainGetMemoryParameters(struct qemud_server *server * ret) { virDomainPtr dom = NULL; - virMemoryParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int nparams = args->nparams; unsigned int flags; int rv = -1; @@ -1502,7 +1502,7 @@ remoteDispatchDomainSetBlkioParameters(struct qemud_server *server * args, void *ret ATTRIBUTE_UNUSED) { virDomainPtr dom = NULL; - virBlkioParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int nparams; unsigned int flags; int rv = -1; @@ -1552,7 +1552,7 @@ remoteDispatchDomainGetBlkioParameters(struct qemud_server *server * ret) { virDomainPtr dom = NULL; - virBlkioParameterPtr params = NULL; + virTypedParameterPtr params = NULL; int nparams = args->nparams; unsigned int flags; int rv = -1; diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 7cd6e13..2174cfd 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); @@ -798,29 +765,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: @@ -831,55 +777,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" @@ -924,28 +832,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. */ @@ -2617,6 +2509,136 @@ 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. + */ +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. + */ +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. + */ +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 11e1d0c..26b8f62 100644 --- a/python/libvirt-override.c +++ b/python/libvirt-override.c @@ -203,7 +203,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)) @@ -239,27 +239,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; @@ -284,7 +284,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)) @@ -322,27 +322,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 :-( diff --git a/src/driver.h b/src/driver.h index 450dd53..d3842d0 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 bb9d60a..5d3325b 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -3483,12 +3483,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 @@ -3496,7 +3496,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 @@ -3522,7 +3522,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; @@ -3558,10 +3558,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) { @@ -3574,10 +3574,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) { @@ -3590,10 +3590,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) { @@ -3647,7 +3647,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; @@ -3673,7 +3673,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; } @@ -3687,7 +3687,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; } @@ -3702,7 +3702,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; @@ -4495,7 +4495,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; @@ -4523,7 +4523,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; } @@ -4567,7 +4567,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; @@ -4611,7 +4611,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 56b1257..0292b66 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; @@ -3129,7 +3129,7 @@ error: */ int virDomainSetBlkioParameters(virDomainPtr domain, - virBlkioParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags) { virConnectPtr conn; @@ -3187,7 +3187,7 @@ error: */ int virDomainGetBlkioParameters(virDomainPtr domain, - virBlkioParameterPtr params, + virTypedParameterPtr params, int *nparams, unsigned int flags) { virConnectPtr conn; @@ -5027,7 +5027,7 @@ error: */ int virDomainGetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int *nparams) + virTypedParameterPtr params, int *nparams) { virConnectPtr conn; @@ -5071,7 +5071,7 @@ error: */ int virDomainSetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int nparams) + virTypedParameterPtr params, int nparams) { virConnectPtr conn; @@ -5121,7 +5121,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 6226a49..25e8adb 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -2427,7 +2427,7 @@ cleanup: } static int -libxlDomainGetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, +libxlDomainGetSchedulerParameters(virDomainPtr dom, virTypedParameterPtr params, int *nparams) { libxlDriverPrivatePtr driver = dom->conn->privateData; @@ -2479,7 +2479,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")); @@ -2487,7 +2487,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")); @@ -2503,7 +2503,7 @@ cleanup: } static int -libxlDomainSetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, +libxlDomainSetSchedulerParameters(virDomainPtr dom, virTypedParameterPtr params, int nparams) { libxlDriverPrivatePtr driver = dom->conn->privateData; @@ -2549,10 +2549,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; @@ -2560,7 +2560,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 2bb592d..40e1746 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 < *nparams; 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 */ @@ -2161,7 +2161,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; @@ -2188,7 +2188,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, @@ -2196,7 +2196,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; @@ -2222,7 +2222,7 @@ cleanup: } static int lxcGetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int *nparams) { lxc_driver_t *driver = domain->conn->privateData; @@ -2262,7 +2262,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; ret = 0; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index fdb3b30..ffc9e78 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4638,7 +4638,7 @@ cleanup: } static int qemuDomainSetBlkioParameters(virDomainPtr dom, - virBlkioParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags) { @@ -4677,11 +4677,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; @@ -4717,7 +4717,7 @@ cleanup: } static int qemuDomainGetBlkioParameters(virDomainPtr dom, - virBlkioParameterPtr params, + virTypedParameterPtr params, int *nparams, unsigned int flags) { @@ -4771,10 +4771,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 */ @@ -4810,7 +4810,7 @@ cleanup: } static int qemuDomainSetMemoryParameters(virDomainPtr dom, - virMemoryParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags ATTRIBUTE_UNUSED) { @@ -4849,11 +4849,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; @@ -4868,7 +4868,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; @@ -4883,7 +4883,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; @@ -4916,7 +4916,7 @@ cleanup: } static int qemuDomainGetMemoryParameters(virDomainPtr dom, - virMemoryParameterPtr params, + virTypedParameterPtr params, int *nparams, unsigned int flags ATTRIBUTE_UNUSED) { @@ -4970,10 +4970,10 @@ static int qemuDomainGetMemoryParameters(virDomainPtr dom, } for (i = 0; i < *nparams; 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 */ @@ -5039,7 +5039,7 @@ cleanup: } static int qemuSetSchedulerParametersFlags(virDomainPtr dom, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags) { @@ -5100,11 +5100,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; @@ -5154,7 +5154,7 @@ cleanup: } static int qemuSetSchedulerParameters(virDomainPtr dom, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams) { return qemuSetSchedulerParametersFlags(dom, @@ -5164,7 +5164,7 @@ static int qemuSetSchedulerParameters(virDomainPtr dom, } static int qemuGetSchedulerParameters(virDomainPtr dom, - virSchedParameterPtr params, + virTypedParameterPtr params, int *nparams) { struct qemud_driver *driver = dom->conn->privateData; @@ -5214,7 +5214,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 5348ea3..a53b781 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -1914,7 +1914,7 @@ cleanup: static int remoteDomainSetMemoryParameters (virDomainPtr domain, - virMemoryParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags) { @@ -1950,7 +1950,7 @@ done: static int remoteDomainGetMemoryParameters (virDomainPtr domain, - virMemoryParameterPtr params, int *nparams, + virTypedParameterPtr params, int *nparams, unsigned int flags) { int rv = -1; @@ -1998,7 +1998,7 @@ done: static int remoteDomainSetBlkioParameters (virDomainPtr domain, - virBlkioParameterPtr params, + virTypedParameterPtr params, int nparams, unsigned int flags) { @@ -2034,8 +2034,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; @@ -2465,7 +2465,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; @@ -2501,7 +2501,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; @@ -2533,7 +2533,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 658bcee..abcdb9d 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2626,7 +2626,7 @@ static char *testDomainGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED, } static int testDomainGetSchedulerParams(virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int *nparams) { testConnPtr privconn = domain->conn->privateData; @@ -2648,7 +2648,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; @@ -2662,7 +2662,7 @@ cleanup: static int testDomainSetSchedulerParams(virDomainPtr domain, - virSchedParameterPtr params, + virTypedParameterPtr params, int nparams) { testConnPtr privconn = domain->conn->privateData; @@ -2687,7 +2687,7 @@ static int testDomainSetSchedulerParams(virDomainPtr domain, testError(VIR_ERR_INVALID_ARG, "field"); goto cleanup; } - if (params[0].type != VIR_DOMAIN_SCHED_FIELD_UINT) { + if (params[0].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 3ec6e2b..efd70cb 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; @@ -1308,7 +1308,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) { @@ -1316,7 +1316,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 = 2; @@ -1342,7 +1342,7 @@ xenHypervisorGetSchedulerParameters(virDomainPtr domain, */ int xenHypervisorSetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int nparams) + virTypedParameterPtr params, int nparams) { int i; unsigned int val; @@ -1416,7 +1416,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); @@ -1425,7 +1425,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 dfa0342..b712e8e 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -3598,7 +3598,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; @@ -3657,7 +3657,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) { @@ -3665,7 +3665,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; @@ -3693,7 +3693,7 @@ error: */ static int xenDaemonSetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int nparams) + virTypedParameterPtr params, int nparams) { xenUnifiedPrivatePtr priv; struct sexpr *root; @@ -3745,10 +3745,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 c2f4de6..d98ac03 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

On Wed, May 18, 2011 at 09:51:44AM -0600, Eric Blake wrote:
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 7cd6e13..2174cfd 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);
@@ -798,29 +765,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: @@ -831,55 +777,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" @@ -924,28 +832,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. */ @@ -2617,6 +2509,136 @@ 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. + */ +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. + */ +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. + */ +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
While the structs are ABI compatible, this still constitutes a change in API. ie apps doing this int np = 5; struct _virMemoryParameter p[np]; virDomainGetSchedulerParameters(dom, p, &np); will get a compile warning/error demo.c: In function ‘main’: demo.c:35:3: warning: passing argument 2 of ‘virDomainGetSchedulerParameters’ from incompatible pointer type demo.c:25:12: note: expected ‘virTypedParameterPtr’ but argument is of type ‘struct _virMemoryParameter *’ so NACK to this change. Regards, Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 05/18/2011 10:14 AM, Daniel P. Berrange wrote:
While the structs are ABI compatible, this still constitutes a change in API. ie apps doing this
int np = 5; struct _virMemoryParameter p[np];
Apps shouldn't be doing this (struct _virMemoryParameter is a private name). Furthermore, we already deleted that private name in patch 1/7; applications using the private name will now be declaring an incomplete type, which explains the warning you saw in your demo program. You should instead be using the public typedef: int np = 5; virMemoryParameter p[np];
virDomainGetSchedulerParameters(dom, p, &np);
And since virMemoryParameter and virTypedParameter are two typedefs for the same type, they shouldn't get a compiler warning.
will get a compile warning/error
demo.c: In function ‘main’: demo.c:35:3: warning: passing argument 2 of ‘virDomainGetSchedulerParameters’ from incompatible pointer type demo.c:25:12: note: expected ‘virTypedParameterPtr’ but argument is of type ‘struct _virMemoryParameter *’
so NACK to this change.
Even if you convince me to not change the public signatures of the functions that existed prior to 0.9.2, I still think that it is worth changing the signature of virDomainSetSchedulerFlags (since we haven't released it yet), as well as all internal signatures. Does your NACK still hold with my explanation? Do I need to prepare a v2 that just changes internal names but not the public API use of the old names? -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

On Wed, May 18, 2011 at 10:32:29AM -0600, Eric Blake wrote:
On 05/18/2011 10:14 AM, Daniel P. Berrange wrote:
While the structs are ABI compatible, this still constitutes a change in API. ie apps doing this
int np = 5; struct _virMemoryParameter p[np];
Apps shouldn't be doing this (struct _virMemoryParameter is a private name). Furthermore, we already deleted that private name in patch 1/7; applications using the private name will now be declaring an incomplete type, which explains the warning you saw in your demo program.
IMHO 'struct _virMemoryParameter' is just as much a public name as anything else in the public header file. The typedef serves as convenient syntactic sugar, but using either is valid for app developers, so we should not be deleting it.
will get a compile warning/error
demo.c: In function ‘main’: demo.c:35:3: warning: passing argument 2 of ‘virDomainGetSchedulerParameters’ from incompatible pointer type demo.c:25:12: note: expected ‘virTypedParameterPtr’ but argument is of type ‘struct _virMemoryParameter *’
so NACK to this change.
Even if you convince me to not change the public signatures of the functions that existed prior to 0.9.2, I still think that it is worth changing the signature of virDomainSetSchedulerFlags (since we haven't released it yet), as well as all internal signatures.
I think we could perhaps achieve the same cleanup using #defines instead of typedefs, which would avoid breaking app code. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 05/18/2011 10:55 AM, Daniel P. Berrange wrote:
Apps shouldn't be doing this (struct _virMemoryParameter is a private name). Furthermore, we already deleted that private name in patch 1/7; applications using the private name will now be declaring an incomplete type, which explains the warning you saw in your demo program.
IMHO 'struct _virMemoryParameter' is just as much a public name as anything else in the public header file. The typedef serves as convenient syntactic sugar, but using either is valid for app developers, so we should not be deleting it.
Then I'm working on a patch to restore the missing names (I deleted _virMemoryParameter, _virBlkioParameter, and _virSchedParameter).
will get a compile warning/error
demo.c: In function ‘main’: demo.c:35:3: warning: passing argument 2 of ‘virDomainGetSchedulerParameters’ from incompatible pointer type demo.c:25:12: note: expected ‘virTypedParameterPtr’ but argument is of type ‘struct _virMemoryParameter *’
so NACK to this change.
Even if you convince me to not change the public signatures of the functions that existed prior to 0.9.2, I still think that it is worth changing the signature of virDomainSetSchedulerFlags (since we haven't released it yet), as well as all internal signatures.
I think we could perhaps achieve the same cleanup using #defines instead of typedefs, which would avoid breaking app code.
Indeed, and I'll give that a shot for restoring the old names. The goal here is ABI stability (the bits are the same, regardless of when it was compiled - we have that) and API stability (recompiling works without introducing new warnings or errors while using the old names - patch 1/7 broke that for the leading _ names). -- 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. --- There is a race between this patch and Matthias' libvirt.c cleanup (https://www.redhat.com/archives/libvir-list/2011-May/msg01105.html); whoever pushes first wins and the other better remember to rebase the patch to do NULL parameter checking on today's new API. include/libvirt/libvirt.h.in | 8 ++-- python/generator.py | 1 + src/driver.h | 8 ++++ src/libvirt.c | 84 +++++++++++++++++++++++++++++++++++++---- src/libvirt_public.syms | 1 + 5 files changed, 89 insertions(+), 13 deletions(-) diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in index 7cd6e13..efd205b 100644 --- a/include/libvirt/libvirt.h.in +++ b/include/libvirt/libvirt.h.in @@ -383,6 +383,10 @@ typedef virSchedParameter *virSchedParameterPtr; int virDomainGetSchedulerParameters (virDomainPtr domain, virSchedParameterPtr params, int *nparams); +int virDomainGetSchedulerParametersFlags (virDomainPtr domain, + virSchedParameterPtr params, + int *nparams, + unsigned int flags); /* * Change scheduler parameters @@ -390,10 +394,6 @@ int virDomainGetSchedulerParameters (virDomainPtr domain, int virDomainSetSchedulerParameters (virDomainPtr domain, virSchedParameterPtr params, int nparams); - -/* - * Change scheduler parameters - */ int virDomainSetSchedulerParametersFlags (virDomainPtr domain, virSchedParameterPtr 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 450dd53..b8417d1 100644 --- a/src/driver.h +++ b/src/driver.h @@ -280,6 +280,13 @@ typedef int int *nparams); typedef int + (*virDrvDomainGetSchedulerParametersFlags) + (virDomainPtr domain, + virSchedParameterPtr params, + int *nparams, + unsigned int flags); + +typedef int (*virDrvDomainSetSchedulerParameters) (virDomainPtr domain, virSchedParameterPtr params, @@ -683,6 +690,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 56b1257..a72bdf7 100644 --- a/src/libvirt.c +++ b/src/libvirt.c @@ -5021,7 +5021,9 @@ error: * nparams of virDomainGetSchedulerType) * * Get the scheduler parameters, the @params array will be filled with the - * values. + * values. 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. */ @@ -5058,14 +5060,76 @@ 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, + virSchedParameterPtr 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 - * @nparams: number of scheduler parameter - * (this value should be same or less than the returned value - * nparams of virDomainGetSchedulerType) + * @nparams: number of scheduler parameter (should be non-zero, and the + * same or less than the returned value nparams of virDomainGetSchedulerType) * - * Change the scheduler parameters + * Change 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. */ @@ -5110,12 +5174,14 @@ error: * virDomainSetSchedulerParametersFlags: * @domain: pointer to domain object * @params: pointer to scheduler parameter objects - * @nparams: number of scheduler parameter - * (this value should be same or less than the returned value - * nparams of virDomainGetSchedulerType) + * @nparams: number of scheduler parameter (should be non-zero, and the + * same or less than the returned value nparams of virDomainGetSchedulerType) * @flags: virDomainSchedParameterFlags * - * Change the scheduler parameters + * Change the 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 0590535..b7bede9 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

+int +virDomainGetSchedulerParametersFlags(virDomainPtr domain, + virSchedParameterPtr 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; + }
Causes problem with: virsh schedinfo vm --set cpu_shares=1024 --current where vm is an inactive domain.

On 05/17/2011 09:18 PM, Hu Tao wrote:
+int +virDomainGetSchedulerParametersFlags(virDomainPtr domain, + virSchedParameterPtr 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; + }
Causes problem with:
virsh schedinfo vm --set cpu_shares=1024 --current
where vm is an inactive domain.
Yep, the solution is the same as for your SetSchedulerParametersFlags - I agree with removing the flag check in libvirt.c and instead making the callbacks do the check. -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

* 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 fdb3b30..ba02379 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5073,7 +5073,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; @@ -5163,9 +5163,11 @@ static int qemuSetSchedulerParameters(virDomainPtr dom, VIR_DOMAIN_SCHEDPARAM_LIVE); } -static int qemuGetSchedulerParameters(virDomainPtr dom, - virSchedParameterPtr params, - int *nparams) +static int +qemuGetSchedulerParametersFlags(virDomainPtr dom, + virSchedParameterPtr params, + int *nparams, + unsigned int flags) { struct qemud_driver *driver = dom->conn->privateData; virCgroupPtr group = NULL; @@ -5173,11 +5175,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; } @@ -5187,6 +5193,7 @@ static int qemuGetSchedulerParameters(virDomainPtr dom, goto cleanup; } + qemuDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); if (vm == NULL) { @@ -5195,11 +5202,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); @@ -5231,6 +5277,14 @@ cleanup: return ret; } +static int +qemuGetSchedulerParameters(virDomainPtr dom, + virSchedParameterPtr 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 @@ -7676,7 +7730,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 */ @@ -7728,7 +7784,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 001e5bf..4ec5e96 100644 --- a/daemon/remote.c +++ b/daemon/remote.c @@ -721,6 +721,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; + virSchedParameterPtr 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 5348ea3..76cc24b 100644 --- a/src/remote/remote_driver.c +++ b/src/remote/remote_driver.c @@ -2500,6 +2500,45 @@ done: } static int +remoteDomainGetSchedulerParametersFlags (virDomainPtr domain, + virSchedParameterPtr 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, virSchedParameterPtr params, int nparams) { @@ -6676,7 +6715,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 */ @@ -6730,7 +6771,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 16141df..87daef2 100644 --- a/src/remote/remote_protocol.x +++ b/src/remote/remote_protocol.x @@ -431,6 +431,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>; @@ -2251,7 +2261,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 ? diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs index 64222cc..ff54746 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 77cadcb..a47d938 100644 --- a/tools/virsh.c +++ b/tools/virsh.c @@ -1732,7 +1732,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); @@ -1745,12 +1745,22 @@ cmdSchedinfo(vshControl *ctl, const vshCmd *cmd) params = vshMalloc(ctl, sizeof(virSchedParameter)* nparams); memset(params, 0, sizeof(virSchedParameter)* 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; @@ -1769,7 +1779,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 { @@ -1782,10 +1798,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_DOMAIN_SCHED_FIELD_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 | 34 +++++++++++++++++++++++++++++----- src/test/test_driver.c | 37 +++++++++++++++++++++++++++++++------ src/xen/xen_driver.c | 36 ++++++++++++++++++++++++++++++++---- 5 files changed, 144 insertions(+), 23 deletions(-) diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c index bb9d60a..d2e96ec 100644 --- a/src/esx/esx_driver.c +++ b/src/esx/esx_driver.c @@ -3521,8 +3521,9 @@ esxDomainGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED, int *nparams) static int -esxDomainGetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int *nparams) +esxDomainGetSchedulerParametersFlags(virDomainPtr domain, + virSchedParameterPtr params, int *nparams, + unsigned int flags) { int result = -1; esxPrivate *priv = domain->conn->privateData; @@ -3533,6 +3534,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")); @@ -3643,11 +3646,18 @@ esxDomainGetSchedulerParameters(virDomainPtr domain, return result; } +static int +esxDomainGetSchedulerParameters(virDomainPtr domain, + virSchedParameterPtr params, int *nparams) +{ + return esxDomainGetSchedulerParametersFlags(domain, params, nparams, 0); +} static int -esxDomainSetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, int nparams) +esxDomainSetSchedulerParametersFlags(virDomainPtr domain, + virSchedParameterPtr params, int nparams, + unsigned int flags) { int result = -1; esxPrivate *priv = domain->conn->privateData; @@ -3659,6 +3669,8 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, char *taskInfoErrorMessage = NULL; int i; + virCheckFlags(0, -1); + if (esxVI_EnsureSession(priv->primary) < 0) { return -1; } @@ -3774,6 +3786,12 @@ esxDomainSetSchedulerParameters(virDomainPtr domain, return result; } +static int +esxDomainSetSchedulerParameters(virDomainPtr domain, + virSchedParameterPtr params, int nparams) +{ + return esxDomainSetSchedulerParametersFlags(domain, params, nparams, 0); +} static int @@ -4673,7 +4691,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 5cc9362..a433021 100644 --- a/src/libxl/libxl_driver.c +++ b/src/libxl/libxl_driver.c @@ -2425,8 +2425,10 @@ cleanup: } static int -libxlDomainGetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, - int *nparams) +libxlDomainGetSchedulerParametersFlags(virDomainPtr dom, + virSchedParameterPtr params, + int *nparams, + unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; libxlDomainObjPrivatePtr priv; @@ -2435,6 +2437,8 @@ libxlDomainGetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, int sched_id; int ret = -1; + virCheckFlags(0, -1); + libxlDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); libxlDriverUnlock(driver); @@ -2501,8 +2505,17 @@ cleanup: } static int -libxlDomainSetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, - int nparams) +libxlDomainGetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, + int *nparams) +{ + return libxlDomainGetSchedulerParametersFlags(dom, params, nparams, 0); +} + +static int +libxlDomainSetSchedulerParametersFlags(virDomainPtr dom, + virSchedParameterPtr params, + int nparams, + unsigned int flags) { libxlDriverPrivatePtr driver = dom->conn->privateData; libxlDomainObjPrivatePtr priv; @@ -2512,6 +2525,8 @@ libxlDomainSetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, int i; int ret = -1; + virCheckFlags(0, -1); + libxlDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); libxlDriverUnlock(driver); @@ -2587,6 +2602,13 @@ cleanup: } static int +libxlDomainSetSchedulerParameters(virDomainPtr dom, virSchedParameterPtr params, + int nparams) +{ + return libxlDomainSetSchedulerParametersFlags(dom, params, nparams, 0); +} + +static int libxlDomainIsActive(virDomainPtr dom) { libxlDriverPrivatePtr driver = dom->conn->privateData; @@ -2733,7 +2755,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 2bb592d..687248a 100644 --- a/src/lxc/lxc_driver.c +++ b/src/lxc/lxc_driver.c @@ -2160,9 +2160,11 @@ static char *lxcGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED, return schedulerType; } -static int lxcSetSchedulerParameters(virDomainPtr domain, - virSchedParameterPtr params, - int nparams) +static int +lxcSetSchedulerParametersFlags(virDomainPtr domain, + virSchedParameterPtr params, + int nparams, + unsigned int flags) { lxc_driver_t *driver = domain->conn->privateData; int i; @@ -2170,6 +2172,8 @@ static int lxcSetSchedulerParameters(virDomainPtr domain, virDomainObjPtr vm = NULL; int ret = -1; + virCheckFlags(0, -1); + if (driver->cgroup == NULL) return -1; @@ -2221,9 +2225,18 @@ cleanup: return ret; } -static int lxcGetSchedulerParameters(virDomainPtr domain, +static int lxcSetSchedulerParameters(virDomainPtr domain, virSchedParameterPtr params, - int *nparams) + int nparams) +{ + return lxcSetSchedulerParametersFlags(domain, params, nparams, 0); +} + +static int +lxcGetSchedulerParametersFlags(virDomainPtr domain, + virSchedParameterPtr params, + int *nparams, + unsigned int flags) { lxc_driver_t *driver = domain->conn->privateData; virCgroupPtr group = NULL; @@ -2231,6 +2244,8 @@ static int lxcGetSchedulerParameters(virDomainPtr domain, unsigned long long val; int ret = -1; + virCheckFlags(0, -1); + if (driver->cgroup == NULL) return -1; @@ -2274,6 +2289,13 @@ cleanup: return ret; } +static int lxcGetSchedulerParameters(virDomainPtr domain, + virSchedParameterPtr params, + int *nparams) +{ + return lxcGetSchedulerParametersFlags(domain, params, nparams, 0); +} + #ifdef __linux__ static int lxcDomainInterfaceStats(virDomainPtr dom, @@ -2750,7 +2772,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 658bcee..2daec83 100644 --- a/src/test/test_driver.c +++ b/src/test/test_driver.c @@ -2625,14 +2625,18 @@ static char *testDomainGetSchedulerType(virDomainPtr domain ATTRIBUTE_UNUSED, return type; } -static int testDomainGetSchedulerParams(virDomainPtr domain, - virSchedParameterPtr params, - int *nparams) +static int +testDomainGetSchedulerParamsFlags(virDomainPtr domain, + virSchedParameterPtr 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); @@ -2660,15 +2664,26 @@ cleanup: return ret; } +static int +testDomainGetSchedulerParams(virDomainPtr domain, + virSchedParameterPtr params, + int *nparams) +{ + return testDomainGetSchedulerParamsFlags(domain, params, nparams, 0); +} -static int testDomainSetSchedulerParams(virDomainPtr domain, - virSchedParameterPtr params, - int nparams) +static int +testDomainSetSchedulerParamsFlags(virDomainPtr domain, + virSchedParameterPtr 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); @@ -2701,6 +2716,14 @@ cleanup: return ret; } +static int +testDomainSetSchedulerParams(virDomainPtr domain, + virSchedParameterPtr params, + int nparams) +{ + return testDomainSetSchedulerParamsFlags(domain, params, nparams, 0); +} + static int testDomainBlockStats(virDomainPtr domain, const char *path, struct _virDomainBlockStats *stats) @@ -5364,7 +5387,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 fea8548..25479c4 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -1676,12 +1676,16 @@ xenUnifiedDomainGetSchedulerType (virDomainPtr dom, int *nparams) } static int -xenUnifiedDomainGetSchedulerParameters (virDomainPtr dom, - virSchedParameterPtr params, int *nparams) +xenUnifiedDomainGetSchedulerParametersFlags(virDomainPtr dom, + virSchedParameterPtr 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); @@ -1693,12 +1697,25 @@ xenUnifiedDomainGetSchedulerParameters (virDomainPtr dom, } static int -xenUnifiedDomainSetSchedulerParameters (virDomainPtr dom, - virSchedParameterPtr params, int nparams) +xenUnifiedDomainGetSchedulerParameters(virDomainPtr dom, + virSchedParameterPtr params, + int *nparams) +{ + return xenUnifiedDomainGetSchedulerParametersFlags(dom, params, + nparams, 0); +} + +static int +xenUnifiedDomainSetSchedulerParametersFlags(virDomainPtr dom, + virSchedParameterPtr 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) { @@ -1712,6 +1729,15 @@ xenUnifiedDomainSetSchedulerParameters (virDomainPtr dom, } static int +xenUnifiedDomainSetSchedulerParameters(virDomainPtr dom, + virSchedParameterPtr params, + int nparams) +{ + return xenUnifiedDomainSetSchedulerParametersFlags(dom, params, + nparams, 0); +} + +static int xenUnifiedDomainBlockStats (virDomainPtr dom, const char *path, struct _virDomainBlockStats *stats) { @@ -2195,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
participants (5)
-
Daniel P. Berrange
-
Daniel Veillard
-
Eric Blake
-
Hu Tao
-
Matthias Bolte