[libvirt] [PATCH 13/34] qemu: Move and rename qemuProcessDetectVcpuPIDs to qemuDomainDetectVcpuPids
John Ferlan
jferlan at redhat.com
Mon Jan 18 14:57:31 UTC 2016
On 01/14/2016 11:27 AM, Peter Krempa wrote:
> Future patches will tweak and reuse the function in different places so
> move it separately first.
> ---
> src/qemu/qemu_domain.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++
> src/qemu/qemu_domain.h | 2 ++
> src/qemu/qemu_process.c | 76 ++------------------------------------------
> 3 files changed, 88 insertions(+), 74 deletions(-)
>
Although essentially code motion - one nit though in the new part...
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 0fa2dbe..1ea1cd3 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -4257,3 +4257,87 @@ qemuDomainGetVcpuPid(virDomainObjPtr vm,
>
> return priv->vcpupids[vcpu];
> }
> +
> +
> +/**
> + * qemuDomainDetectVcpuPIDs:
> + * @driver: qemu driver data
> + * @vm: domain object
> + * @asyncJob: current asynchronous job type
> + *
> + * Updates vCPU trhead ids in the private data of @vm.
s/trhead/thread
John
> + *
> + * Returns 0 on success -1 on error and reports an appropriate error.
> + */
> +int
> +qemuDomainDetectVcpuPids(virQEMUDriverPtr driver,
> + virDomainObjPtr vm,
> + int asyncJob)
> +{
> + pid_t *cpupids = NULL;
> + int ncpupids;
> + qemuDomainObjPrivatePtr priv = vm->privateData;
> +
> + /*
> + * Current QEMU *can* report info about host threads mapped
> + * to vCPUs, but it is not in a manner we can correctly
> + * deal with. The TCG CPU emulation does have a separate vCPU
> + * thread, but it runs every vCPU in that same thread. So it
> + * is impossible to setup different affinity per thread.
> + *
> + * What's more the 'query-cpus' command returns bizarre
> + * data for the threads. It gives the TCG thread for the
> + * vCPU 0, but for vCPUs 1-> N, it actually replies with
> + * the main process thread ID.
> + *
> + * The result is that when we try to set affinity for
> + * vCPU 1, it will actually change the affinity of the
> + * emulator thread :-( When you try to set affinity for
> + * vCPUs 2, 3.... it will fail if the affinity was
> + * different from vCPU 1.
> + *
> + * We *could* allow vcpu pinning with TCG, if we made the
> + * restriction that all vCPUs had the same mask. This would
> + * at least let us separate emulator from vCPUs threads, as
> + * we do for KVM. It would need some changes to our cgroups
> + * CPU layout though, and error reporting for the config
> + * restrictions.
> + *
> + * Just disable CPU pinning with TCG until someone wants
> + * to try to do this hard work.
> + */
> + if (vm->def->virtType == VIR_DOMAIN_VIRT_QEMU) {
> + priv->nvcpupids = 0;
> + priv->vcpupids = NULL;
> + return 0;
> + }
> +
> + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
> + return -1;
> + ncpupids = qemuMonitorGetCPUInfo(priv->mon, &cpupids);
> + if (qemuDomainObjExitMonitor(driver, vm) < 0)
> + return -1;
> + /* failure to get the VCPU<-> PID mapping or to execute the query
> + * command will not be treated fatal as some versions of qemu don't
> + * support this command */
> + if (ncpupids <= 0) {
> + virResetLastError();
> +
> + priv->nvcpupids = 0;
> + priv->vcpupids = NULL;
> + return 0;
> + }
> +
> + if (ncpupids != virDomainDefGetVcpus(vm->def)) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("got wrong number of vCPU pids from QEMU monitor. "
> + "got %d, wanted %d"),
> + ncpupids, virDomainDefGetVcpus(vm->def));
> + VIR_FREE(cpupids);
> + return -1;
> + }
> +
> + priv->nvcpupids = ncpupids;
> + priv->vcpupids = cpupids;
> + return 0;
> +}
> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> index 7fc4fff..6a8cf70 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -508,5 +508,7 @@ int qemuDomainDefValidateMemoryHotplug(const virDomainDef *def,
>
> bool qemuDomainHasVcpuPids(virDomainObjPtr vm);
> pid_t qemuDomainGetVcpuPid(virDomainObjPtr vm, unsigned int vcpu);
> +int qemuDomainDetectVcpuPids(virQEMUDriverPtr driver, virDomainObjPtr vm,
> + int asyncJob);
>
> #endif /* __QEMU_DOMAIN_H__ */
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index dec4572..a7c3094 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -1962,78 +1962,6 @@ qemuProcessWaitForMonitor(virQEMUDriverPtr driver,
> return ret;
> }
>
> -static int
> -qemuProcessDetectVcpuPIDs(virQEMUDriverPtr driver,
> - virDomainObjPtr vm, int asyncJob)
> -{
> - pid_t *cpupids = NULL;
> - int ncpupids;
> - qemuDomainObjPrivatePtr priv = vm->privateData;
> -
> - /*
> - * Current QEMU *can* report info about host threads mapped
> - * to vCPUs, but it is not in a manner we can correctly
> - * deal with. The TCG CPU emulation does have a separate vCPU
> - * thread, but it runs every vCPU in that same thread. So it
> - * is impossible to setup different affinity per thread.
> - *
> - * What's more the 'query-cpus' command returns bizarre
> - * data for the threads. It gives the TCG thread for the
> - * vCPU 0, but for vCPUs 1-> N, it actually replies with
> - * the main process thread ID.
> - *
> - * The result is that when we try to set affinity for
> - * vCPU 1, it will actually change the affinity of the
> - * emulator thread :-( When you try to set affinity for
> - * vCPUs 2, 3.... it will fail if the affinity was
> - * different from vCPU 1.
> - *
> - * We *could* allow vcpu pinning with TCG, if we made the
> - * restriction that all vCPUs had the same mask. This would
> - * at least let us separate emulator from vCPUs threads, as
> - * we do for KVM. It would need some changes to our cgroups
> - * CPU layout though, and error reporting for the config
> - * restrictions.
> - *
> - * Just disable CPU pinning with TCG until someone wants
> - * to try to do this hard work.
> - */
> - if (vm->def->virtType == VIR_DOMAIN_VIRT_QEMU) {
> - priv->nvcpupids = 0;
> - priv->vcpupids = NULL;
> - return 0;
> - }
> -
> - if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
> - return -1;
> - ncpupids = qemuMonitorGetCPUInfo(priv->mon, &cpupids);
> - if (qemuDomainObjExitMonitor(driver, vm) < 0)
> - return -1;
> - /* failure to get the VCPU<-> PID mapping or to execute the query
> - * command will not be treated fatal as some versions of qemu don't
> - * support this command */
> - if (ncpupids <= 0) {
> - virResetLastError();
> -
> - priv->nvcpupids = 0;
> - priv->vcpupids = NULL;
> - return 0;
> - }
> -
> - if (ncpupids != virDomainDefGetVcpus(vm->def)) {
> - virReportError(VIR_ERR_INTERNAL_ERROR,
> - _("got wrong number of vCPU pids from QEMU monitor. "
> - "got %d, wanted %d"),
> - ncpupids, virDomainDefGetVcpus(vm->def));
> - VIR_FREE(cpupids);
> - return -1;
> - }
> -
> - priv->nvcpupids = ncpupids;
> - priv->vcpupids = cpupids;
> - return 0;
> -}
> -
>
> static int
> qemuProcessDetectIOThreadPIDs(virQEMUDriverPtr driver,
> @@ -4982,7 +4910,7 @@ qemuProcessLaunch(virConnectPtr conn,
> goto cleanup;
>
> VIR_DEBUG("Detecting VCPU PIDs");
> - if (qemuProcessDetectVcpuPIDs(driver, vm, asyncJob) < 0)
> + if (qemuDomainDetectVcpuPids(driver, vm, asyncJob) < 0)
> goto cleanup;
>
> VIR_DEBUG("Detecting IOThread PIDs");
> @@ -5689,7 +5617,7 @@ int qemuProcessAttach(virConnectPtr conn ATTRIBUTE_UNUSED,
> }
>
> VIR_DEBUG("Detecting VCPU PIDs");
> - if (qemuProcessDetectVcpuPIDs(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
> + if (qemuDomainDetectVcpuPids(driver, vm, QEMU_ASYNC_JOB_NONE) < 0)
> goto error;
>
> VIR_DEBUG("Detecting IOThread PIDs");
>
More information about the libvir-list
mailing list