[libvirt] [PATCH 04/17] Enable cpuset cgroup and synchronous vcpupin info to cgroup.
Hu Tao
hutao at cn.fujitsu.com
Wed Aug 8 02:33:39 UTC 2012
On Mon, Aug 06, 2012 at 03:41:29PM -0600, Eric Blake wrote:
> On 08/03/2012 12:36 AM, Hu Tao wrote:
> > From: Tang Chen <tangchen at cn.fujitsu.com>
> >
> > vcpu threads pin are implemented using sched_setaffinity(), but
> > not controlled by cgroup. This patch does the following things:
> >
> > 1) enable cpuset cgroup
> > 2) reflect all the vcpu threads pin info to cgroup
> >
> > Signed-off-by: Tang Chen <tangchen at cn.fujitsu.com>
> > Signed-off-by: Hu Tao <hutao at cn.fujitsu.com>
> > ---
>
> > @@ -3667,9 +3669,38 @@ qemudDomainPinVcpuFlags(virDomainPtr dom,
> > if (flags & VIR_DOMAIN_AFFECT_LIVE) {
> >
> > if (priv->vcpupids != NULL) {
> > + /* Add config to vm->def first, because qemuSetupCgroupVcpuPin needs it. */
> > + if (virDomainVcpuPinAdd(vm->def, cpumap, maplen, vcpu) < 0) {
> > + virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> > + _("failed to update or add vcpupin xml of "
> > + "a running domain"));
> > + goto cleanup;
> > + }
>
> If this succeeds,
>
> > +
> > + /* Configure the corresponding cpuset cgroup before set affinity. */
> > + if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPUSET)) {
> > + if (virCgroupForDomain(driver->cgroup, vm->def->name, &cgroup_dom, 0) == 0 &&
> > + virCgroupForVcpu(cgroup_dom, vcpu, &cgroup_vcpu, 0) == 0 &&
> > + qemuSetupCgroupVcpuPin(cgroup_vcpu, vm->def, vcpu) < 0) {
> > + virReportError(VIR_ERR_OPERATION_INVALID,
> > + _("failed to set cpuset.cpus in cgroup"
> > + " for vcpu %d"), vcpu);
> > + goto cleanup;
>
> but this fails, then where do we roll vm->def back to its pre-attempt state?
>
> > + }
> > + } else {
> > + /* Here, we should go on because even if cgroup is not active,
> > + * we can still use virProcessInfoSetAffinity.
> > + */
> > + VIR_WARN("cpuset cgroup is not active");
> > + }
> > +
> > if (virProcessInfoSetAffinity(priv->vcpupids[vcpu],
> > - cpumap, maplen, maxcpu) < 0)
> > + cpumap, maplen, maxcpu) < 0) {
> > + virReportError(VIR_ERR_SYSTEM_ERROR,
> > + _("failed to set cpu affinity for vcpu %d"),
> > + vcpu);
> > goto cleanup;
>
> Same situation - if set_affinity failed, where do we roll back to the
> original vm->def state (also, should we roll back to the original cpuset
> state)?
>
> If we don't roll back, then a failure can leave the domain in an unknown
> state for cpu pinning. Or are we just declaring that if these functions
> fail, the domain is in an unknown set of cpu pinning?
Oh yes, this is indeed a problem here, I'll fix it.
>
> Do we need both cpuset and set_affinity? Or is cpuset a superset of
> affinity (that is, if I alter cpuset, can I completely skip out on
> calling set_affinity and still get the same results)? If cpuset gives
> stronger pinning than affinity, then maybe we don't need to try both
> methods, which gives us a bit better mechanism for rollbacks; the only
The man page[1] says cpusets are integrated with sched_setaffinity(),
so I think it is better to choose one of them. If cpuset is avaiable, we
use cpuset. Otherwise we use sched_setaffinity().
> remaining thing is making sure you avoid altering vm->def except on
> success (perhaps by using a temporary structure rather than vm->def at
> the time you attempt the pinning).
Yes.
[1] man 7 cpuset
--
Thanks,
Hu Tao
More information about the libvir-list
mailing list