[PATCH v6 3/4] conf: introduce dirty_ring_size field

Peter Krempa pkrempa at redhat.com
Mon Nov 22 08:50:19 UTC 2021


On Sat, Nov 20, 2021 at 03:20:47 -0500, huangy81 at chinatelecom.cn wrote:
> From: Hyman Huang(黄勇) <huangy81 at chinatelecom.cn>
> 
> introduce dirty_ring_size in struct "_virDomainDef" to hold
> the ring size configured by user, and pass dirty_ring_size
> when building qemu commandline if dirty ring feature enabled.
> 
> Signed-off-by: Hyman Huang(黄勇) <huangy81 at chinatelecom.cn>
> ---
>  src/conf/domain_conf.c  | 76 ++++++++++++++++++++++++++++++++++++++++-
>  src/conf/domain_conf.h  |  4 +++
>  src/qemu/qemu_command.c |  3 ++
>  3 files changed, 82 insertions(+), 1 deletion(-)

[...]



> @@ -4826,6 +4827,18 @@ virDomainDefPostParseMemtune(virDomainDef *def)
>  }
>  
>  
> +static void
> +virDomainDefPostParseFeatures(virDomainDef *def)
> +{
> +    if (def->features[VIR_DOMAIN_FEATURE_KVM] == VIR_TRISTATE_SWITCH_ON &&
> +        def->kvm_features[VIR_DOMAIN_KVM_DIRTY_RING] == VIR_TRISTATE_SWITCH_ON &&
> +        def->dirty_ring_size == 0) {
> +        /* set 4096 as default size if dirty ring size not congfigured */

Instead of this quite obvious thing I'd prefer a justification of why
this setting is done in the global post-parse function rather than the
qemu specific one. If there is no good reason to have it globally,
please move it to the qemu-specific one.

> +        def->dirty_ring_size = 4096;
> +    }
> +}

[...]

> @@ -17566,8 +17581,10 @@ virDomainFeaturesHyperVDefParse(virDomainDef *def,
>  
>  static int
>  virDomainFeaturesKVMDefParse(virDomainDef *def,
> +                            xmlXPathContextPtr ctxt,
>                               xmlNodePtr node)
>  {
> +    xmlNodePtr tmp_node = ctxt->node;

We have an established approach for resetting the XPath context. Please
use it, as ...[1].

>      def->features[VIR_DOMAIN_FEATURE_KVM] = VIR_TRISTATE_SWITCH_ON;
>  
>      node = xmlFirstElementChild(node);
> @@ -17589,9 +17606,37 @@ virDomainFeaturesKVMDefParse(virDomainDef *def,
>  
>          def->kvm_features[feature] = value;
>  
> +        /* dirty ring feature should parse size property */
> +        if ((virDomainKVM) feature == VIR_DOMAIN_KVM_DIRTY_RING) {
> +            if (((virDomainKVM) feature) == VIR_DOMAIN_KVM_DIRTY_RING &&
> +                  value == VIR_TRISTATE_SWITCH_ON) {
> +                ctxt->node = node;
> +
> +                if (virXMLPropString(node, "size")) {

virXMLPropString returns an allocated string, so this is leaking memory. 


> +                    if (virXPathUInt("string(./@size)", ctxt,
> +                                     &def->dirty_ring_size) < 0) {

If you fetch the 'size' attribute via virXMLPropString there's no need
to re-parse it again using XPath. In fact you can avoid dragging xpath
into this function altogether.


> +                        virReportError(VIR_ERR_XML_ERROR, "%s",
> +                                      _("invalid number of dirty ring size"));
> +                        return -1;

... [1] on this error path it's not fixed.

> +                    }
> +
> +                    if ((def->dirty_ring_size & (def->dirty_ring_size - 1)) != 0 ||

We have a function/macro for checking power-of-two.

> +                        def->dirty_ring_size < 1024 ||
> +                        def->dirty_ring_size > 65536) {
> +                        virReportError(VIR_ERR_XML_ERROR, "%s",
> +                                       _("dirty ring must be power of 2 "
> +                                         "and ranges [1024, 65536]"));

Also per coding style error messages are not to be broken up.

Additionally, is this a qemu-specific range?

> +                        return -1;
> +                    }
> +                }
> +            }
> +        }
> +
>          node = xmlNextElementSibling(node);
>      }
>  
> +    ctxt->node = tmp_node;
> +
>      return 0;
>  }

[...]




More information about the libvir-list mailing list