[libvirt] [PATCH 07/12] Add qemuProcessSetHypervisorAffinites and set hypervisor threads affinities
Hu Tao
hutao at cn.fujitsu.com
Fri Jul 27 05:28:33 UTC 2012
On Wed, Jul 25, 2012 at 01:25:16PM +0800, tangchen wrote:
> From: Tang Chen <tangchen at cn.fujitsu.com>
>
> Hypervisor threads should also be pinned by sched_setaffinity(), just
> the same as vcpu threads.
>
> Signed-off-by: Tang Chen <tangchen at cn.fujitsu.com>
> Signed-off-by: Hu Tao <hutao at cn.fujitsu.com>
> ---
> src/qemu/qemu_process.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 54 insertions(+)
>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index d89b4d5..bb1640a 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -2005,6 +2005,56 @@ cleanup:
> return ret;
> }
>
> +/* Set CPU affinities for hypervisor threads if hypervisorpin xml provided. */
> +static int
> +qemuProcessSetHypervisorAffinites(virConnectPtr conn,
> + virDomainObjPtr vm)
> +{
> + virDomainDefPtr def = vm->def;
> + pid_t pid = vm->pid;
> + unsigned char *cpumask = NULL;
> + unsigned char *cpumap = NULL;
> + virNodeInfo nodeinfo;
> + int cpumaplen, hostcpus, maxcpu, i;
> + int ret = -1;
> +
> + if (virNodeGetInfo(conn, &nodeinfo) != 0)
> + return -1;
> +
> + if (!def->cputune.hypervisorpin)
> + return 0;
Reorder into:
if (!def->cputune.hypervisorpin)
return 0;
if (virNodeGetInfo(conn, &nodeinfo) != 0)
return -1;
> +
> + hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
> + cpumaplen = VIR_CPU_MAPLEN(hostcpus);
> + maxcpu = cpumaplen * 8;
> +
> + if (maxcpu > hostcpus)
> + maxcpu = hostcpus;
> +
> + if (VIR_ALLOC_N(cpumap, cpumaplen) < 0) {
> + virReportOOMError();
> + return -1;
> + }
> +
> + cpumask = (unsigned char *)def->cputune.hypervisorpin->cpumask;
> + for(i = 0; i < VIR_DOMAIN_CPUMASK_LEN; i++) {
> + if (cpumask[i])
> + VIR_USE_CPU(cpumap, i);
> + }
> +
> + if (virProcessInfoSetAffinity(pid,
> + cpumap,
> + cpumaplen,
> + maxcpu) < 0) {
> + goto cleanup;
> + }
> +
> + ret = 0;
> +cleanup:
> + VIR_FREE(cpumap);
> + return ret;
> +}
> +
> static int
> qemuProcessInitPasswords(virConnectPtr conn,
> struct qemud_driver *driver,
> @@ -3765,6 +3815,10 @@ int qemuProcessStart(virConnectPtr conn,
> if (qemuProcessSetVcpuAffinites(conn, vm) < 0)
> goto cleanup;
>
> + VIR_DEBUG("Setting hypervisor threads affinities");
> + if (qemuProcessSetHypervisorAffinites(conn, vm) < 0)
> + goto cleanup;
> +
> VIR_DEBUG("Setting any required VM passwords");
> if (qemuProcessInitPasswords(conn, driver, vm) < 0)
> goto cleanup;
> --
> 1.7.10.2
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
--
Thanks,
Hu Tao
More information about the libvir-list
mailing list