On 1/25/22 17:19, Praveen K Paladugu wrote: > using virCHProcessSetupPid > > Signed-off-by: Praveen K Paladugu <prapal@xxxxxxxxxxxxxxxxxxx> > --- > 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