[libvirt] [PATCH 2/3] qemu: Keep the affinity when creating cgroup for emulator thread
Martin Kletzander
mkletzan at redhat.com
Wed Oct 24 13:43:44 UTC 2012
On 10/24/2012 03:41 PM, Osier Yang wrote:
> On 2012年10月24日 21:36, Martin Kletzander wrote:
>> On 10/24/2012 03:29 PM, Osier Yang wrote:
>>> On 2012年10月24日 21:17, Martin Kletzander wrote:
>>>> On 10/24/2012 12:00 PM, Osier Yang wrote:
>>>>> When the cpu placement model is "auto", it sets the affinity for
>>>>> domain process with the advisory nodeset from numad, however,
>>>>> creating cgroup for the domain process (called emulator thread
>>>>> in some contexts) later overrides that with pinning it to all
>>>>> available pCPUs.
>>>>>
>>>>> How to reproduce:
>>>>>
>>>>> * Configure the domain with "auto" placement for<vcpu>, e.g.
>>>>> <vcpu placement='auto'>4</vcpu>
>>>>> * % virsh start dom
>>>>> * % cat /proc/$dompid/status
>>>>>
>>>>> Though the emulator cgroup cause conflicts, but we can't simply
>>>>> prohibit creating it, as other tunables are still useful, such
>>>>> as "emulator_period", which is used by API
>>>>> virDomainSetSchedulerParameter. So this patch doesn't prohibit
>>>>> creating the emulator cgroup, but inherit the nodeset from numad,
>>>>> and reset the affinity for domain process.
>>>>>
>>>>> * src/qemu/qemu_cgroup.h: Modify definition of
>>>>> qemuSetupCgroupForEmulator
>>>>> to accept the passed nodenet
>>>>> * src/qemu/qemu_cgroup.c: Set the affinity with the passed nodeset
>>>>> ---
>>>>> src/qemu/qemu_cgroup.c | 17 ++++++++++++++---
>>>>> src/qemu/qemu_cgroup.h | 3 ++-
>>>>> src/qemu/qemu_process.c | 2 +-
>>>>> 3 files changed, 17 insertions(+), 5 deletions(-)
>>>>>
>>>>> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
>>>>> index db371a0..8e99c01 100644
>>>>> @@ -698,6 +706,9 @@ int qemuSetupCgroupForEmulator(struct
>>>>> qemud_driver *driver,
>>>>> if (rc< 0)
>>>>> goto cleanup;
>>>>
>>>> In case you go to the cleanup here, cpumask is not free()'d.
>>>
>>> Ah, okay.
>>>
>>> I will squash the following in:
>>>
>>> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
>>> index 1754d6f..8f8ef08 100644
>>> --- a/src/qemu/qemu_cgroup.c
>>> +++ b/src/qemu/qemu_cgroup.c
>>> @@ -706,9 +706,6 @@ int qemuSetupCgroupForEmulator(struct qemud_driver
>>> *driver,
>>> if (rc< 0)
>>> goto cleanup;
>>> }
>>> -
>>> - if (def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
>>> - virBitmapFree(cpumask);
>>> cpumask = NULL; /* sanity */
>>> }
>>>
>>> @@ -725,6 +722,8 @@ int qemuSetupCgroupForEmulator(struct qemud_driver
>>> *driver,
>>> return 0;
>>>
>>> cleanup:
>>> + virBitmapFree(cpumap);
>>> +
>>> if (cgroup_emulator) {
>>> virCgroupRemove(cgroup_emulator);
>>> virCgroupFree(&cgroup_emulator);
>>>
>>
>> Not quite the right thing to do, cleanup is not done if it is
>> successful, you have to _add_ it to cleanup or reorganize it :)
>
> Sigh, though rushing is always not good, but I will rush again.
>
> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
> index 1754d6f..5ce748a 100644
> --- a/src/qemu/qemu_cgroup.c
> +++ b/src/qemu/qemu_cgroup.c
> @@ -706,9 +706,6 @@ int qemuSetupCgroupForEmulator(struct qemud_driver
> *driver,
> if (rc < 0)
> goto cleanup;
> }
> -
> - if (def->placement_mode == VIR_DOMAIN_CPU_PLACEMENT_MODE_AUTO)
> - virBitmapFree(cpumask);
> cpumask = NULL; /* sanity */
> }
>
> @@ -722,9 +719,12 @@ int qemuSetupCgroupForEmulator(struct qemud_driver
> *driver,
>
> virCgroupFree(&cgroup_emulator);
> virCgroupFree(&cgroup);
> + virBitmapFree(cpumap);
> return 0;
>
> cleanup:
> + virBitmapFree(cpumap);
> +
> if (cgroup_emulator) {
> virCgroupRemove(cgroup_emulator);
> virCgroupFree(&cgroup_emulator);
>
>
This one looks clean, ACK =)
Martin
More information about the libvir-list
mailing list