[libvirt] [PATCH] domain_conf: Use virDomainParseMemory more widely
Jiri Denemark
jdenemar at redhat.com
Fri Nov 7 15:53:35 UTC 2014
On Fri, Nov 07, 2014 at 15:30:10 +0100, Michal Privoznik wrote:
> As reviewing patches upstream it occurred to me, that we have two
> functions doing nearly the same: virDomainParseMemory which
> expects XML in the following format:
>
> <memory unit='MiB'>1337</memory>
>
> The other function being virDomainHugepagesParseXML expecting the
> following format:
>
> <someElement memory='1337' unit='MiB'/>
This should rather be
<someElement size=.../>
to match what the code really does.
> It wouldn't matter to have two functions handle two different
> scenarios like this if we could only not copy code that handles
> 32bit arches around. So this code merges the common parts into
> one by inventing new @units_xpath argument to
> virDomainParseMemory which allows overriding the default location
> of @unit attribute in XML. With this change both scenarios above
> can be parsed with virDomainParseMemory. Sweet. Of course,
> everything is commented as it should be.
>
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> src/conf/domain_conf.c | 137 +++++++++++++++++++++++++++++--------------------
> 1 file changed, 80 insertions(+), 57 deletions(-)
>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 21309b0..e097af7 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -6318,14 +6318,30 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
> goto cleanup;
> }
>
> -
> -/* Parse a value located at XPATH within CTXT, and store the
> - * result into val. If REQUIRED, then the value must exist;
> - * otherwise, the value is optional. The value is in bytes.
> - * Return 1 on success, 0 if the value was not present and
> - * is not REQUIRED, -1 on failure after issuing error. */
> +/**
> + * virDomainParseScaledValue:
> + * @bytes_xpath: XPath to memory amount
I think the "bytes_xpath" name is slightly misleading and plain "xpath"
would be better since this is a general function and we may be parsing
something completely different not to mention that the value may
represent for example Mebibytes depending on what is parsed from
@units_xpath.
> + * @units_xpath: XPath to units attribute
> + * @ctxt: XPath context
> + * @val: scaled value is stored here
> + * @scale: default scale for @val
> + * @max: maximal @val allowed
> + * @required: is the value required?
> + *
> + * Parse a value located at @bytes_xpath within @ctxt, and store
> + * the result into @val. By default, if @units_xpath is NULL the
> + * unit attribute must be an attribute to @bytes_xpath.
> + * Otherwise, the unit attribute is looked for under specified
> + * path. If @required is set, then the value must exist;
> + * otherwise, the value is optional. The value is in bytes.
> + *
> + * Returns 1 on success,
> + * 0 if the value was not present and !@required,
> + * -1 on failure after issuing error.
> + */
> static int
> -virDomainParseScaledValue(const char *xpath,
> +virDomainParseScaledValue(const char *bytes_xpath,
> + const char *units_xpath,
> xmlXPathContextPtr ctxt,
> unsigned long long *val,
> unsigned long long scale,
...
> @@ -6379,17 +6398,35 @@ virDomainParseScaledValue(const char *xpath,
> }
>
>
> -/* Parse a memory element located at XPATH within CTXT, and store the
> - * result into MEM, in blocks of 1024. If REQUIRED, then the value
> - * must exist; otherwise, the value is optional. The value must not
> - * exceed VIR_DOMAIN_MEMORY_PARAM_UNLIMITED once scaled; additionally,
> - * if CAPPED is true, the value must fit within an unsigned long (only
> - * matters on 32-bit platforms).
> +/**
> + * virDomainParseMemory:
> + * @bytes_xpath: XPath to memory amount
My comment about "bytes_xpath" above is applicable here as well.
Although we at least know the value has to do something with bytes.
> + * @units_xpath: XPath to units attribute
> + * @ctxt: XPath context
> + * @mem: scaled memory amount is stored here
> + * @required: whether value is required
> + * @capped: whether scaled value must fit within unsigned long
> *
> - * Return 0 on success, -1 on failure after issuing error. */
> + * Parse a memory element or attribute located at @bytes_xpath
> + * within @ctxt, and store the result into @mem, in blocks of
> + * 1024. By default, if @units_xpath is NULL the unit attribute
> + * must be an attribute to @bytes_xpath. Otherwise, the unit
> + * attribute is looked for under specified path. If @required is
> + * set, then the value must exist; otherwise, the value is
> + * optional. The value must not exceed
> + * VIR_DOMAIN_MEMORY_PARAM_UNLIMITED once scaled; additionally,
> + * if @capped is true, the value must fit within an unsigned long
> + * (only matters on 32-bit platforms).
> + *
> + * Return 0 on success, -1 on failure after issuing error.
> + */
> static int
> -virDomainParseMemory(const char *xpath, xmlXPathContextPtr ctxt,
> - unsigned long long *mem, bool required, bool capped)
> +virDomainParseMemory(const char *bytes_xpath,
> + const char *units_xpath,
> + xmlXPathContextPtr ctxt,
> + unsigned long long *mem,
> + bool required,
> + bool capped)
> {
> int ret = -1;
> unsigned long long bytes, max;
...
ACK
Jirka
More information about the libvir-list
mailing list