[libvirt] [PATCH v3 5/6] qemu: Add support to Add/Delete IOThreads

Peter Krempa pkrempa at redhat.com
Tue Apr 21 14:12:07 UTC 2015


On Tue, Apr 21, 2015 at 15:45:48 +0200, Peter Krempa wrote:
> On Tue, Apr 14, 2015 at 21:18:25 -0400, John Ferlan wrote:
> > Add qemuDomainAddIOThread and qemuDomainDelIOThread in order to add or
> > remove an IOThread to/from the host either for live or config optoins
> > 
> > The implementation for the 'live' option will use the iothreadpids list
> > in order to make decision, while the 'config' option will use the
> > iothreadids list.  Additionally, for deletion each may have to adjust
> > the iothreadpin list.
> > 
> > IOThreads are implemented by qmp objects, the code makes use of the existing
> > qemuMonitorAddObject or qemuMonitorDelObject APIs.
> > 
> > Signed-off-by: John Ferlan <jferlan at redhat.com>
> > ---
> >  src/conf/domain_audit.c  |   9 +
> >  src/conf/domain_audit.h  |   6 +
> >  src/libvirt_private.syms |   1 +
> >  src/qemu/qemu_driver.c   | 431 +++++++++++++++++++++++++++++++++++++++++++++++
> >  4 files changed, 447 insertions(+)
> > 
> 
> ...
> 
> > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> > index 008258f..f42d4fb 100644
> > --- a/src/qemu/qemu_driver.c
> > +++ b/src/qemu/qemu_driver.c
> > @@ -6179,6 +6179,435 @@ qemuDomainPinIOThread(virDomainPtr dom,

...

> > +
> > +    if (virDomainIOThreadIDAdd(vm->def, iothread_id) < 0)
> 
> virDomainIOThreadIDAdd could return the pointer to the created item ...
> 
> > +        goto cleanup;
> > +
> > +    if (!(iothrid = virDomainIOThreadIDFind(vm->def, iothread_id))) {
> > +        virReportError(VIR_ERR_INTERNAL_ERROR,
> > +                       _("cannot find just added IOThread '%u'"),
> > +                       iothread_id);
> 
> So that you don't have to look it up right after adding it.
> 
> > +        goto cleanup;
> > +    }
> > +
> > +    iothrid->thread_id = new_iothreads[idx]->thread_id;

You are also not marking the thread structure as 'defined' and thus
wouldn't format it later ...


> > +
> > +    /* Add IOThread to cgroup if present */
> > +    if (priv->cgroup) {
> > +        cgroup_iothread =
> > +            qemuDomainAddCgroupForThread(priv->cgroup,
> > +                                         VIR_CGROUP_THREAD_IOTHREAD,
> > +                                         iothread_id, mem_mask,
> > +                                         iothrid->thread_id);
> > +        if (!cgroup_iothread)
> > +            goto cleanup;
> > +    }
> > +
> > +    /* Inherit def->cpuset */
> > +    if (vm->def->cpumask) {
> 
> Automatic NUMA placement(priv->autoCpuset) needs to be taken into account too.
> 
> > +        if (qemuDomainHotplugAddPin(vm->def->cpumask, iothread_id,
> > +                                    &vm->def->cputune.iothreadspin,
> > +                                    &vm->def->cputune.niothreadspin) < 0)
> > +
> > +            goto cleanup;
> > +
> > +        if (qemuDomainHotplugPinThread(vm->def->cpumask, iothread_id,
> > +                                       iothrid->thread_id, cgroup_iothread) < 0)
> > +            goto cleanup;
> > +
> > +        if (qemuProcessSetSchedParams(iothread_id, iothrid->thread_id,
> > +                                      vm->def->cputune.niothreadsched,
> > +                                      vm->def->cputune.iothreadsched) < 0)
> 
> qemuProcessSetSchedParams won't do anything since the new thread doesn't
> have any scheduler assigned.
> 
> > +            goto cleanup;
> > +    }
> > +
> > +    ret = 0;
> > +
> > + cleanup:
> > +    if (new_iothreads) {
> > +        for (idx = 0; idx < new_niothreads; idx++)
> > +            qemuMonitorIOThreadInfoFree(new_iothreads[idx]);
> > +        VIR_FREE(new_iothreads);
> > +    }
> > +    VIR_FREE(mem_mask);
> > +    virDomainAuditIOThread(vm, orig_niothreads, new_niothreads,
> > +                           "update", rc == 0);
> > +    if (cgroup_iothread)
> > +        virCgroupFree(&cgroup_iothread);
> 
> virCgroupFree() handles NULL just fine.
> 
> > +    VIR_FREE(alias);
> > +    return ret;
> > +
> > + exit_monitor:
> > +    ignore_value(qemuDomainObjExitMonitor(driver, vm));
> > +    goto cleanup;
> > +}

Peter
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150421/2c843856/attachment-0001.sig>


More information about the libvir-list mailing list