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
--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list