[libvirt PATCH 05/13] ch_driver, ch_domain: vcpu info getter callbacks

Michal Prívozník mprivozn at redhat.com
Fri Oct 29 12:31:26 UTC 2021


On 10/22/21 5:37 PM, Praveen K Paladugu wrote:
> From: Vineeth Pillai <viremana at linux.microsoft.com>
> 
> Signed-off-by: Vineeth Pillai <viremana at linux.microsoft.com>
> Signed-off-by: Praveen K Paladugu <prapal at linux.microsoft.com>
> ---
>  src/ch/ch_domain.c |  25 ++++++++
>  src/ch/ch_domain.h |   4 ++
>  src/ch/ch_driver.c | 138 +++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 167 insertions(+)
> 
> diff --git a/src/ch/ch_domain.c b/src/ch/ch_domain.c
> index fedde4581b..c0b0b1005a 100644
> --- a/src/ch/ch_domain.c
> +++ b/src/ch/ch_domain.c
> @@ -338,3 +338,28 @@ virCHDomainGetMonitor(virDomainObj *vm)
>  {
>      return CH_DOMAIN_PRIVATE(vm)->monitor;
>  }
> +
> +pid_t
> +virCHDomainGetVcpuPid(virDomainObj *vm,
> +                     unsigned int vcpuid)
> +{
> +    virDomainVcpuDef *vcpu = virDomainDefGetVcpu(vm->def, vcpuid);
> +    return CH_DOMAIN_VCPU_PRIVATE(vcpu)->tid;
> +}
> +
> +bool
> +virCHDomainHasVcpuPids(virDomainObj *vm)
> +{
> +    size_t i;
> +    size_t maxvcpus = virDomainDefGetVcpusMax(vm->def);
> +    virDomainVcpuDef *vcpu;
> +
> +    for (i = 0; i < maxvcpus; i++) {
> +        vcpu = virDomainDefGetVcpu(vm->def, i);
> +
> +        if (CH_DOMAIN_VCPU_PRIVATE(vcpu)->tid > 0)
> +            return true;
> +    }
> +
> +    return false;
> +}
> diff --git a/src/ch/ch_domain.h b/src/ch/ch_domain.h
> index 75b9933130..d9c9d34a19 100644
> --- a/src/ch/ch_domain.h
> +++ b/src/ch/ch_domain.h
> @@ -82,3 +82,7 @@ virCHDomainObjBeginJob(virDomainObj *obj, enum virCHDomainJob job)
>  
>  void
>  virCHDomainObjEndJob(virDomainObj *obj);
> +
> +int virCHDomainRefreshVcpuInfo(virDomainObj *vm);
> +pid_t virCHDomainGetVcpuPid(virDomainObj *vm, unsigned int vcpuid);
> +bool virCHDomainHasVcpuPids(virDomainObj *vm);
> diff --git a/src/ch/ch_driver.c b/src/ch/ch_driver.c
> index 1824d2fd16..8ea5ce393d 100644
> --- a/src/ch/ch_driver.c
> +++ b/src/ch/ch_driver.c
> @@ -952,6 +952,141 @@ static int chStateInitialize(bool privileged,
>      return ret;
>  }
>  
> +static int
> +chDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
> +{
> +    virDomainObj *vm;
> +    virDomainDef *def;
> +    int ret = -1;
> +
> +    virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
> +                  VIR_DOMAIN_AFFECT_CONFIG |
> +                  VIR_DOMAIN_VCPU_MAXIMUM |
> +                  VIR_DOMAIN_VCPU_GUEST, -1);
> +
> +    if (!(vm = chDomObjFromDomain(dom)))
> +        return -1;
> +
> +    if (virDomainGetVcpusFlagsEnsureACL(dom->conn, vm->def, flags) < 0)
> +        goto cleanup;
> +
> +    if (!(def = virDomainObjGetOneDef(vm, flags)))
> +        goto cleanup;
> +
> +    if (flags & VIR_DOMAIN_VCPU_MAXIMUM)
> +        ret = virDomainDefGetVcpusMax(def);
> +    else
> +        ret = virDomainDefGetVcpus(def);
> +
> +
> +    cleanup:
> +        virDomainObjEndAPI(&vm);
> +        return ret;
> +}
> +
> +static int
> +chDomainGetMaxVcpus(virDomainPtr dom)
> +{
> +    return chDomainGetVcpusFlags(dom, (VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_VCPU_MAXIMUM));
> +}
> +
> +static int
> +chDomainHelperGetVcpus(virDomainObj *vm,
> +                       virVcpuInfoPtr info,
> +                       unsigned long long *cpuwait,
> +                       int maxinfo,
> +                       unsigned char *cpumaps,
> +                       int maplen)
> +{
> +    size_t ncpuinfo = 0;
> +    size_t i;
> +
> +    if (maxinfo == 0)
> +        return 0;
> +
> +    if (!virCHDomainHasVcpuPids(vm)) {
> +        virReportError(VIR_ERR_OPERATION_INVALID,
> +                       "%s", _("cpu affinity is not supported"));
> +        return -1;
> +    }
> +
> +    if (info)
> +        memset(info, 0, sizeof(*info) * maxinfo);
> +
> +    if (cpumaps)
> +        memset(cpumaps, 0, sizeof(*cpumaps) * maxinfo);
> +
> +    for (i = 0; i < virDomainDefGetVcpusMax(vm->def) && ncpuinfo < maxinfo; i++) {
> +        virDomainVcpuDef *vcpu = virDomainDefGetVcpu(vm->def, i);
> +        pid_t vcpupid = virCHDomainGetVcpuPid(vm, i);
> +        virVcpuInfoPtr vcpuinfo = info + ncpuinfo;
> +
> +        if (!vcpu->online)
> +            continue;
> +
> +        if (info) {
> +            vcpuinfo->number = i;
> +            vcpuinfo->state = VIR_VCPU_RUNNING;
> +            if (virProcessGetStatInfo(&vcpuinfo->cpuTime,
> +                                  &vcpuinfo->cpu, NULL,
> +                                  vm->pid, vcpupid) < 0) {
> +                virReportSystemError(errno, "%s",
> +                                     _("cannot get vCPU placement & pCPU time"));
> +                return -1;
> +            }
> +        }
> +
> +        if (cpumaps) {
> +            unsigned char *cpumap = VIR_GET_CPUMAP(cpumaps, maplen, ncpuinfo);
> +            virBitmap *map = NULL;

g_autoptr(virBitmap) ..

> +
> +            if (!(map = virProcessGetAffinity(vcpupid)))
> +                return -1;
> +
> +            virBitmapToDataBuf(map, cpumap, maplen);
> +            virBitmapFree(map);

.. and drop this explicit virBitmapFree().

> +        }
> +
> +        if (cpuwait) {
> +            if (virProcessGetSchedInfo(&(cpuwait[ncpuinfo]), vm->pid, vcpupid) < 0)
> +                return -1;
> +        }
> +
> +        ncpuinfo++;
> +    }
> +
> +    return ncpuinfo;
> +}
> +
> +static int
> +chDomainGetVcpus(virDomainPtr dom,
> +                   virVcpuInfoPtr info,
> +                   int maxinfo,
> +                   unsigned char *cpumaps,
> +                   int maplen)
> +{
> +    virDomainObj *vm;
> +    int ret = -1;
> +
> +    if (!(vm = chDomObjFromDomain(dom)))
> +        goto cleanup;
> +
> +    if (virDomainGetVcpusEnsureACL(dom->conn, vm->def) < 0)
> +        goto cleanup;
> +
> +    if (virDomainObjCheckActive(vm) < 0) {
> +        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> +                       _("cannot retrieve vcpu information for inactive domain"));
> +        goto cleanup;
> +    }
> +
> +    ret = chDomainHelperGetVcpus(vm, info, NULL, maxinfo, cpumaps, maplen);
> +
> +    cleanup:
> +        virDomainObjEndAPI(&vm);
> +        return ret;
> +}
> +
>  /* Function Tables */
>  static virHypervisorDriver chHypervisorDriver = {
>      .name = "CH",
> @@ -988,6 +1123,9 @@ static virHypervisorDriver chHypervisorDriver = {
>      .domainIsActive = chDomainIsActive,                     /* 7.5.0 */
>      .domainOpenConsole = chDomainOpenConsole,               /* 7.8.0 */
>      .nodeGetInfo = chNodeGetInfo,                           /* 7.5.0 */
> +    .domainGetVcpus = chDomainGetVcpus,                     /* 7.9.0 */
> +    .domainGetVcpusFlags = chDomainGetVcpusFlags,           /* 7.9.0 */
> +    .domainGetMaxVcpus = chDomainGetMaxVcpus,               /* 7.9.0 */

I'm sorry but this will miss this release. Please update this to 7.10.0.

Michal




More information about the libvir-list mailing list