[libvirt] [PATCH v3 3/9] qemu: Implement the qemu driver fetch for IOThreads

John Ferlan jferlan at redhat.com
Thu Mar 5 12:51:33 UTC 2015



On 03/04/2015 12:45 PM, Ján Tomko wrote:
> On Tue, Feb 17, 2015 at 04:03:52PM -0500, John Ferlan wrote:
>> Depending on the flags passed, either attempt to return the active/live
>> IOThread data for the domain or the config data.
>>
>> The active/live path will call into the Monitor in order to get the
>> IOThread data and then correlate the thread_id's returned from the
>> monitor to the currently running system/threads in order to ascertain
>> the affinity for each iothread_id.
>>
>> The config path will map each of the configured IOThreads and return
>> any configured iothreadspin data
>>
>> Both paths will peruse the 'targetDef' domain list looking for 'disks'
>> that have been assigned to a specific IOThread.  An IOThread may have
>> no resources associated
>>
>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>> ---
>>  src/qemu/qemu_driver.c | 281 +++++++++++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 281 insertions(+)
>>
> 
> Just a few nits, until the API gets final...
> 
>> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
>> index 1bbbe9b..2c9d08c 100644
> 
>> +static int
>> +
>> +    if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
>> +        goto cleanup;
>> +
>> +    if (!virDomainObjIsActive(vm)) {
>> +        virReportError(VIR_ERR_OPERATION_INVALID, "%s",
>> +                       _("cannot list IOThreads for an inactive domain"));
>> +        goto endjob;
>> +    }
>> +
>> +    priv = vm->privateData;
>> +    if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_IOTHREAD)) {
>> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                       _("IOThreads not supported with this binary"));
>> +        goto endjob;
>> +    }
>> +
>> +    if (qemuDomainObjEnterMonitorAsync(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
>> +        goto endjob;
> 
> EnterMonitorAsync with ASYNC_JOB_NONE is essentially EnterMonitor
> 
>> +    for (i = 0; i < targetDef->iothreads; i++) {
>> +        if (VIR_ALLOC(info_ret[i]) < 0)
>> +            goto cleanup;
>> +
>> +        /* IOThreads being counting at 1 */
>> +        info_ret[i]->iothread_id = i + 1;
>> +
>> +        if (VIR_ALLOC_N(info_ret[i]->cpumap, maplen) < 0)
>> +            goto cleanup;
>> +
>> +        /* Initialize the cpumap */
>> +        info_ret[i]->cpumaplen = maplen;
>> +        memset(info_ret[i]->cpumap, 0xff, maplen);
>> +        if (maxcpu % 8)
>> +            info_ret[i]->cpumap[maplen - 1] &= (1 << maxcpu % 8) - 1;
> 
> virBitmapToData could make this more readable.
> 

This is where I'm not sure varying from the existing API's model w/r/t
cpumap & maplen, etc. should be done..


>> +    }
>> +
>> +    /* If iothreadspin setting exists, there are unused physical cpus */
>> +    iothreadspin_list = targetDef->cputune.iothreadspin;
> 
> A temporary variable pointing to iothreadspin[i] is more common.
> 

straight copy of qemuDomainGetVcpuPinInfo

>> +    for (i = 0; i < targetDef->cputune.niothreadspin; i++) {
>> +        /* vcpuid is the iothread_id...
>> +         * iothread_id is the index into info_ret + 1, so we can
>> +         * assume that the info_ret index we want is vcpuid - 1
>> +         */
>> +        cpumap = info_ret[iothreadspin_list[i]->vcpuid - 1]->cpumap;
>> +        cpumask = iothreadspin_list[i]->cpumask;
>> +
>> +        for (pcpu = 0; pcpu < maxcpu; pcpu++) {
>> +            if (virBitmapGetBit(cpumask, pcpu, &pinned) < 0)
>> +                goto cleanup;
>> +            if (!pinned)
>> +                VIR_UNUSE_CPU(cpumap, pcpu);
>> +        }
>> +    }
>> +

tks -

John




More information about the libvir-list mailing list