[libvirt PATCH v5 6/7] ch_process: Setup emulator and iothread settings

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


On 1/25/22 17:19, Praveen K Paladugu wrote:
> using virCHProcessSetupPid
> 
> Signed-off-by: Praveen K Paladugu <prapal at linux.microsoft.com>
> ---
>  src/ch/ch_monitor.c | 60 +++++++++++++++++++++++++++++++++++
>  src/ch/ch_monitor.h |  2 ++
>  src/ch/ch_process.c | 77 ++++++++++++++++++++++++++++++++++++++++++++-
>  3 files changed, 138 insertions(+), 1 deletion(-)
> 
> diff --git a/src/ch/ch_monitor.c b/src/ch/ch_monitor.c
> index 6c1d889a82..2a7cffb696 100644
> --- a/src/ch/ch_monitor.c
> +++ b/src/ch/ch_monitor.c
> @@ -930,3 +930,63 @@ virCHMonitorGetInfo(virCHMonitor *mon, virJSONValue **info)
>  {
>      return virCHMonitorGet(mon, URL_VM_INFO, info);
>  }
> +
> +/**
> + * virCHMonitorGetIOThreads:
> + * @mon: Pointer to the monitor
> + * @iothreads: Location to return array of IOThreadInfo data
> + *
> + * Retrieve the list of iothreads defined/running for the machine
> + *
> + * Returns count of IOThreadInfo structures on success
> + *        -1 on error.
> + */
> +int virCHMonitorGetIOThreads(virCHMonitor *mon,
> +                             virDomainIOThreadInfo ***iothreads)
> +{
> +    size_t nthreads = 0, niothreads = 0;
> +    int thd_index;
> +    virDomainIOThreadInfo **iothreadinfolist = NULL, *iothreadinfo = NULL;
> +
> +    *iothreads = NULL;
> +    nthreads = virCHMonitorRefreshThreadInfo(mon);
> +
> +    iothreadinfolist = g_new0(virDomainIOThreadInfo*, nthreads);
> +
> +    for (thd_index = 0; thd_index < nthreads; thd_index++) {
> +        virBitmap *map = NULL;
> +        if (mon->threads[thd_index].type == virCHThreadTypeIO) {
> +            iothreadinfo = g_new0(virDomainIOThreadInfo, 1);
> +
> +            iothreadinfo->iothread_id = mon->threads[thd_index].ioInfo.tid;
> +
> +            if (!(map = virProcessGetAffinity(iothreadinfo->iothread_id)))
> +                goto cleanup;
> +
> +            if (virBitmapToData(map, &(iothreadinfo->cpumap),
> +                                &(iothreadinfo->cpumaplen)) < 0) {
> +                virBitmapFree(map);
> +                goto cleanup;
> +            }
> +            virBitmapFree(map);
> +            /* Append to iothreadinfolist */
> +            iothreadinfolist[niothreads] = iothreadinfo;
> +            niothreads++;
> +        }
> +    }
> +    VIR_DELETE_ELEMENT_INPLACE(iothreadinfolist,
> +                                       niothreads, nthreads);

I'm sorry, but what are you trying to say here? It looks like you're
trying to turn @iothreadinfolist into a null terminated array. Well, for
that all you need to to pass nthreads + 1 into g_new0() above.

> +    *iothreads = iothreadinfolist;
> +    VIR_DEBUG("niothreads = %ld", niothreads);
> +    return niothreads;
> +
> +    cleanup:

This needs to be named 'error' because the control gets here only in
error cases. The label is not used in successful path.

> +        if (iothreadinfolist) {
> +            for (thd_index = 0; thd_index < niothreads; thd_index++)
> +                VIR_FREE(iothreadinfolist[thd_index]);

Life's not that simple. The argument is type of virDomainIOThreadInfo*
and as such might have ->cpumap member allocated. You need to call
virDomainIOThreadInfoFree() instead of plain VIR_FREE().

> +            VIR_FREE(iothreadinfolist);

This one is okay, because this is just an array of pointers.

> +        }
> +        if (iothreadinfo)
> +            VIR_FREE(iothreadinfo);

And again, no need for the if() and plain VIR_FREE() is not enough.

> +        return -1;
> +}

Michal




More information about the libvir-list mailing list