[PATCH v2] libxl: set vcpu affinity during domain creation

Jim Fehlig jfehlig at suse.com
Tue May 18 16:17:18 UTC 2021


Back from some time off...

On 5/5/21 8:06 AM, Olaf Hering wrote:
> Since Xen 4.5 libxl allows to set affinities during domain creation.
> This enables Xen to allocate the domain memory on NUMA systems close to
> the specified pcpus.
> 
> Libvirt can now handle <domain/cputune/vcpupin> in domU.xml correctly.
> 
> Without this change, Xen will create the domU and assign NUMA memory and
> vcpu affinities on its own. Later libvirt will adjust the affinity,
> which may move the vcpus away from the assigned NUMA node.
> 
> Signed-off-by: Olaf Hering <olaf at aepfle.de>

I see Daniel reviewed this patch but it had not been pushed. I've added the r-b 
and pushed it.

Thanks!
Jim

> ---
>   src/libxl/libxl_conf.c   | 53 ++++++++++++++++++++++++++++++++++++++++
>   src/libxl/libxl_domain.c | 46 ----------------------------------
>   src/libxl/libxl_domain.h |  4 ---
>   3 files changed, 53 insertions(+), 50 deletions(-)
> 
> diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
> index 6392d7795d..2a99626f92 100644
> --- a/src/libxl/libxl_conf.c
> +++ b/src/libxl/libxl_conf.c
> @@ -283,6 +283,56 @@ libxlMakeChrdevStr(virDomainChrDef *def, char **buf)
>       return 0;
>   }
>   
> +static int
> +libxlSetVcpuAffinities(virDomainDef *def,
> +                       libxl_ctx *ctx,
> +                       libxl_domain_build_info *b_info)
> +{
> +    libxl_bitmap *vcpu_affinity_array;
> +    unsigned int vcpuid;
> +    unsigned int vcpu_idx = 0;
> +    virDomainVcpuDef *vcpu;
> +    bool has_vcpu_pin = false;
> +
> +    /* Get highest vcpuid with cpumask */
> +    for (vcpuid = 0; vcpuid < b_info->max_vcpus; vcpuid++) {
> +        vcpu = virDomainDefGetVcpu(def, vcpuid);
> +        if (!vcpu)
> +            continue;
> +        if (!vcpu->cpumask)
> +            continue;
> +        vcpu_idx = vcpuid;
> +        has_vcpu_pin = true;
> +    }
> +    /* Nothing to do */
> +    if (!has_vcpu_pin)
> +        return 0;
> +
> +    /* Adjust index */
> +    vcpu_idx++;
> +
> +    b_info->num_vcpu_hard_affinity = vcpu_idx;
> +    /* Will be released by libxl_domain_config_dispose */
> +    b_info->vcpu_hard_affinity = g_new0(libxl_bitmap, vcpu_idx);
> +    vcpu_affinity_array = b_info->vcpu_hard_affinity;
> +
> +    for (vcpuid = 0; vcpuid < vcpu_idx; vcpuid++) {
> +        libxl_bitmap *map = &vcpu_affinity_array[vcpuid];
> +        libxl_bitmap_init(map);
> +        /* libxl owns the bitmap */
> +        if (libxl_cpu_bitmap_alloc(ctx, map, 0))
> +            return -1;
> +        vcpu = virDomainDefGetVcpu(def, vcpuid);
> +        /* Apply the given mask, or allow unhandled vcpus to run anywhere */
> +        if (vcpu && vcpu->cpumask)
> +            virBitmapToDataBuf(vcpu->cpumask, map->map, map->size);
> +        else
> +            libxl_bitmap_set_any(map);
> +    }
> +    libxl_defbool_set(&b_info->numa_placement, false);
> +    return 0;
> +}
> +
>   static int
>   libxlMakeDomBuildInfo(virDomainDef *def,
>                         libxlDriverConfig *cfg,
> @@ -320,6 +370,9 @@ libxlMakeDomBuildInfo(virDomainDef *def,
>       for (i = 0; i < virDomainDefGetVcpus(def); i++)
>           libxl_bitmap_set((&b_info->avail_vcpus), i);
>   
> +    if (libxlSetVcpuAffinities(def, ctx, b_info))
> +        return -1;
> +
>       switch ((virDomainClockOffsetType) clock.offset) {
>       case VIR_DOMAIN_CLOCK_OFFSET_VARIABLE:
>           if (clock.data.variable.basis == VIR_DOMAIN_CLOCK_BASIS_LOCALTIME)
> diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
> index d78765ad84..625e04a9b0 100644
> --- a/src/libxl/libxl_domain.c
> +++ b/src/libxl/libxl_domain.c
> @@ -967,49 +967,6 @@ libxlDomainAutoCoreDump(libxlDriverPrivate *driver,
>       return 0;
>   }
>   
> -int
> -libxlDomainSetVcpuAffinities(libxlDriverPrivate *driver, virDomainObj *vm)
> -{
> -    g_autoptr(libxlDriverConfig) cfg = libxlDriverConfigGet(driver);
> -    virDomainVcpuDef *vcpu;
> -    libxl_bitmap map;
> -    virBitmap *cpumask = NULL;
> -    size_t i;
> -    int ret = -1;
> -
> -    libxl_bitmap_init(&map);
> -
> -    for (i = 0; i < virDomainDefGetVcpus(vm->def); ++i) {
> -        vcpu = virDomainDefGetVcpu(vm->def, i);
> -
> -        if (!vcpu->online)
> -            continue;
> -
> -        if (!(cpumask = vcpu->cpumask))
> -            cpumask = vm->def->cpumask;
> -
> -        if (!cpumask)
> -            continue;
> -
> -        if (virBitmapToData(cpumask, &map.map, (int *)&map.size) < 0)
> -            goto cleanup;
> -
> -        if (libxl_set_vcpuaffinity(cfg->ctx, vm->def->id, i, &map, NULL) != 0) {
> -            virReportError(VIR_ERR_INTERNAL_ERROR,
> -                           _("Failed to pin vcpu '%zu' with libxenlight"), i);
> -            goto cleanup;
> -        }
> -
> -        libxl_bitmap_dispose(&map); /* Also returns to freshly-init'd state */
> -    }
> -
> -    ret = 0;
> -
> - cleanup:
> -    libxl_bitmap_dispose(&map);
> -    return ret;
> -}
> -
>   static int
>   libxlDomainFreeMem(libxl_ctx *ctx, libxl_domain_config *d_config)
>   {
> @@ -1460,9 +1417,6 @@ libxlDomainStart(libxlDriverPrivate *driver,
>           goto destroy_dom;
>       }
>   
> -    if (libxlDomainSetVcpuAffinities(driver, vm) < 0)
> -        goto destroy_dom;
> -
>       if (!start_paused) {
>           libxlDomainUnpauseWrapper(cfg->ctx, domid);
>           virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_BOOTED);
> diff --git a/src/libxl/libxl_domain.h b/src/libxl/libxl_domain.h
> index cbe7ba19ba..928ee8f5cd 100644
> --- a/src/libxl/libxl_domain.h
> +++ b/src/libxl/libxl_domain.h
> @@ -124,10 +124,6 @@ int
>   libxlDomainAutoCoreDump(libxlDriverPrivate *driver,
>                           virDomainObj *vm);
>   
> -int
> -libxlDomainSetVcpuAffinities(libxlDriverPrivate *driver,
> -                             virDomainObj *vm);
> -
>   int
>   libxlDomainStartNew(libxlDriverPrivate *driver,
>                       virDomainObj *vm,
> 




More information about the libvir-list mailing list