[libvirt PATCH v5 2/7] ch: methods for cgroup mgmt in ch driver

Michal Prívozník mprivozn at redhat.com
Fri Jan 28 16:05:30 UTC 2022


On 1/25/22 17:19, 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_conf.c    |   2 +
>  src/ch/ch_conf.h    |   4 +-
>  src/ch/ch_domain.c  |  34 +++++
>  src/ch/ch_domain.h  |  11 +-
>  src/ch/ch_monitor.c |  96 ++++++++++++++
>  src/ch/ch_monitor.h |  54 +++++++-
>  src/ch/ch_process.c | 308 ++++++++++++++++++++++++++++++++++++++++++--
>  src/ch/ch_process.h |   3 +
>  8 files changed, 492 insertions(+), 20 deletions(-)
> 

> diff --git a/src/ch/ch_domain.c b/src/ch/ch_domain.c
> index a746d0f5fd..6f0cec8c6e 100644
> --- a/src/ch/ch_domain.c
> +++ b/src/ch/ch_domain.c
> @@ -319,6 +319,40 @@ chValidateDomainDeviceDef(const virDomainDeviceDef *dev,
>                         _("Serial can only be enabled for a PTY"));
>          return -1;
>      }
> +    return 0;
> +}
> +
> +int
> +virCHDomainRefreshThreadInfo(virDomainObj *vm)
> +{
> +    size_t maxvcpus = virDomainDefGetVcpusMax(vm->def);
> +    virCHMonitorThreadInfo *info = NULL;
> +    size_t nthreads, ncpus = 0;

We like one variable per line more, because it allows smaller diffs
should this area of code be ever changed.

> +    size_t i;
> +
> +    nthreads = virCHMonitorGetThreadInfo(virCHDomainGetMonitor(vm),
> +                                         true, &info);
> +
> +    for (i = 0; i < nthreads; i++) {
> +        virCHDomainVcpuPrivate *vcpupriv;
> +        virDomainVcpuDef *vcpu;
> +        virCHMonitorCPUInfo *vcpuInfo;
> +
> +        if (info[i].type != virCHThreadTypeVcpu)
> +            continue;
> +
> +        /* TODO: hotplug support */
> +        vcpuInfo = &info[i].vcpuInfo;
> +        vcpu = virDomainDefGetVcpu(vm->def, vcpuInfo->cpuid);
> +        vcpupriv = CH_DOMAIN_VCPU_PRIVATE(vcpu);
> +        vcpupriv->tid = vcpuInfo->tid;
> +        ncpus++;
> +    }
> +
> +    /* TODO: Remove the warning when hotplug is implemented.*/
> +    if (ncpus != maxvcpus)
> +        VIR_WARN("Mismatch in the number of cpus, expected: %ld, actual: %ld",
> +                 maxvcpus, ncpus);
>  
>      return 0;
>  }
> diff --git a/src/ch/ch_domain.h b/src/ch/ch_domain.h
> index 4d0b5479b8..cb94905b94 100644
> --- a/src/ch/ch_domain.h
> +++ b/src/ch/ch_domain.h
> @@ -53,11 +53,13 @@ typedef struct _virCHDomainObjPrivate virCHDomainObjPrivate;
>  struct _virCHDomainObjPrivate {
>      struct virCHDomainJobObj job;
>  
> -    virChrdevs *chrdevs;
> -    virCHDriver *driver;
> -    virCHMonitor *monitor;
>      char *machineName;
>      virBitmap *autoCpuset;
> +    virBitmap *autoNodeset;
> +    virCHDriver *driver;
> +    virCHMonitor *monitor;
> +    virCgroup *cgroup;
> +    virChrdevs *chrdevs;

Looks like you can't make up your mind about the order. I remember
seeing the order of the members being changed over and over. Any reason
for that?

>  };
>  
>  #define CH_DOMAIN_PRIVATE(vm) \
> @@ -87,7 +89,8 @@ void
>  virCHDomainObjEndJob(virDomainObj *obj);
>  
>  int
> -virCHDomainRefreshVcpuInfo(virDomainObj *vm);
> +virCHDomainRefreshThreadInfo(virDomainObj *vm);
> +
>  pid_t
>  virCHDomainGetVcpuPid(virDomainObj *vm,
>                        unsigned int vcpuid);
> diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c
> index a19f0c7e33..d984bf9822 100644
> --- a/src/ch/ch_monitor.c
> +++ b/src/ch/ch_monitor.c
> @@ -41,6 +41,7 @@ VIR_LOG_INIT("ch.ch_monitor");
>  
>  static virClass *virCHMonitorClass;
>  static void virCHMonitorDispose(void *obj);
> +static void virCHMonitorThreadInfoFree(virCHMonitor * mon);
>  
>  static int virCHMonitorOnceInit(void)
>  {
> @@ -578,6 +579,7 @@ static void virCHMonitorDispose(void *opaque)
>      virCHMonitor *mon = opaque;
>  
>      VIR_DEBUG("mon=%p", mon);
> +    virCHMonitorThreadInfoFree(mon);
>      virObjectUnref(mon->vm);
>  }
>  
> @@ -743,6 +745,100 @@ virCHMonitorGet(virCHMonitor *mon, const char *endpoint, virJSONValue **response
>      return ret;
>  }
>  
> +static void
> +virCHMonitorThreadInfoFree(virCHMonitor *mon)
> +{
> +    mon->nthreads = 0;
> +    if (mon->threads)
> +        VIR_FREE(mon->threads);

Since VIR_FREE() is really just g_clear_pointer() there's no point in
checking the pointer. In fact, glib will do that for us.

> +}
> +
> +static size_t
> +virCHMonitorRefreshThreadInfo(virCHMonitor *mon)
> +{
> +    virCHMonitorThreadInfo *info = NULL;
> +    g_autofree pid_t *tids = NULL;
> +    virDomainObj *vm = mon->vm;
> +    size_t ntids = 0;
> +    size_t i;
> +
> +
> +    virCHMonitorThreadInfoFree(mon);
> +    if (virProcessGetPids(vm->pid, &ntids, &tids) < 0) {
> +        mon->threads = NULL;

No need to set to NULL. It was done by virCHMonitorThreadInfoFree() above.

> +        return 0;
> +    }
> +

> diff --git a/src/ch/ch_process.c b/src/ch/ch_process.c
> index 49976d769e..1a0730a4d1 100644
> --- a/src/ch/ch_process.c
> +++ b/src/ch/ch_process.c

> +/**
> + * virCHProcessSetupPid:
> + *
> + * This function sets resource properties (affinity, cgroups,
> + * scheduler) for any PID associated with a domain.  It should be used
> + * to set up emulator PIDs as well as vCPU and I/O thread pids to
> + * ensure they are all handled the same way.
> + *
> + * Returns 0 on success, -1 on error.
> + */
> +static int
> +virCHProcessSetupPid(virDomainObj *vm,
> +                     pid_t pid,
> +                     virCgroupThreadName nameval,
> +                     int id,
> +                     virBitmap *cpumask,
> +                     unsigned long long period,
> +                     long long quota,
> +                     virDomainThreadSchedParam *sched)
> +{
> +    virCHDomainObjPrivate *priv = vm->privateData;
> +    virDomainNumatuneMemMode mem_mode;
> +    virCgroup *cgroup = NULL;

g_autoptr(virCgroup)

> +    virBitmap *use_cpumask = NULL;
> +    virBitmap *affinity_cpumask = NULL;
> +    g_autoptr(virBitmap) hostcpumap = NULL;
> +    g_autofree char *mem_mask = NULL;
> +    int ret = -1;

Michal




More information about the libvir-list mailing list