
On 2012年10月19日 16:42, Martin Kletzander wrote:
On 10/19/2012 05:45 AM, Osier Yang wrote:
On 2012年10月17日 23:38, Martin Kletzander wrote:
According to our recent changes (clarifications), we should be pinning qemu's emulator processes using the<vcpu> 'cpuset' attribute in case there is no<emulatorpin> specified. This however doesn't work entirely as expected and this patch should resolve all the remaining issues. --- src/qemu/qemu_cgroup.c | 25 ++++++++++++++++--------- src/qemu/qemu_cgroup.h | 4 ++-- src/qemu/qemu_driver.c | 3 ++- src/qemu/qemu_process.c | 16 ++++++++-------- 4 files changed, 28 insertions(+), 20 deletions(-)
[...]
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index a94e9c4..e08ec67 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -2024,11 +2024,12 @@ cleanup: return ret; }
-/* Set CPU affinities for emulator threads if emulatorpin xml provided. */ +/* Set CPU affinities for emulator threads. */ static int qemuProcessSetEmulatorAffinites(virConnectPtr conn, virDomainObjPtr vm) { + virBitmapPtr cpumask; virDomainDefPtr def = vm->def; virNodeInfo nodeinfo; int ret = -1; @@ -2036,15 +2037,14 @@ qemuProcessSetEmulatorAffinites(virConnectPtr conn, if (virNodeGetInfo(conn,&nodeinfo) != 0) return -1;
- if (!def->cputune.emulatorpin) - return 0; - - if (virProcessInfoSetAffinity(vm->pid, - def->cputune.emulatorpin->cpumask)< 0) { + if (def->cputune.emulatorpin) + cpumask = def->cputune.emulatorpin->cpumask; + else if (def->cpumask) + cpumask = def->cpumask; + else goto cleanup; - }
- ret = 0; + ret = virProcessInfoSetAffinity(vm->pid, cpumask); cleanup: return ret; }
This patch actually duplicates the affinity setting on domain process with sched_setaffinity.
Assume "cpuset" of<vcpu> is specified, and no "<emulatorpin>".
qemuProcessInitCpuAffinity is excuted between the fork and exec, with this patch, qemuProcessSetEmulatorAffinites will set the affinity again using sched_setaffinity.
Cgroup setting is fine though, as there is no previous setting with cgroup.
I'm wondering why the domain process is not pinned to pCPUs specified "cpuset" of "<vcpu>" by qemuProcessInitCpuAffinity, when<emulatorpin> is not specified.
Regards, Osier
I'm glad you pointed it out. To be honest, it took me quite a while to see where this should be set to fix the problem with as few lines as possible. As Peter says, there is a mess with the pinning, cgroups and affinities.
Right. I'd think it just need some re-orgnization, resolve duplicates like this, and resort the logic. Regards, Osier