[libvirt] [PATCH 3/3] lxc: Implement geting emulator pin info API in lxc driver
John Ferlan
jferlan at redhat.com
Wed Oct 22 15:34:24 UTC 2014
Fix the $SUBJ "s/geting/getting"
On 09/04/2014 03:52 AM, Wang Rui wrote:
> From: Yue Wenyuan <yuewenyuan at huawei.com>
>
> Implement the lxc driver method for virDomainGetEmulatorPinInfo
> to get container's cpuset.
>
> Signed-off-by: Wang Rui <moon.wangrui at huawei.com>
> Signed-off-by: Yue Wenyuan <yuewenyuan at huawei.com>
> ---
> src/lxc/lxc_driver.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 75 insertions(+)
>
> diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
> index 9e3a877..6694cf3 100644
> --- a/src/lxc/lxc_driver.c
> +++ b/src/lxc/lxc_driver.c
> @@ -1395,6 +1395,80 @@ lxcDomainPinEmulator(virDomainPtr dom,
> return ret;
> }
>
Since the following is essentially a copy of the qemu function with the
only changes being "LXC" for "QEMU" or "lxc" for "qemu" - it seems that
it should be possible to create some sort of common vir/util function
especially for all the lines between [1] and [2] below. Of course
that's probably true in other areas, but since I was comparing here I
guess it
> +static int
> +lxcDomainGetEmulatorPinInfo(virDomainPtr dom,
> + unsigned char *cpumaps,
> + int maplen,
> + unsigned int flags)
> +{
> + virLXCDriverPtr driver = dom->conn->privateData;
> + virDomainObjPtr vm = NULL;
> + virDomainDefPtr targetDef = NULL;
> + int ret = -1;
> + int maxcpu, hostcpus, pcpu;
> + virBitmapPtr cpumask = NULL;
> + bool pinned;
> + virCapsPtr caps = NULL;
> +
> + virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
> + VIR_DOMAIN_AFFECT_CONFIG, -1);
> +
> + if (!(vm = lxcDomObjFromDomain(dom)))
> + goto cleanup;
> +
> + if (virDomainGetEmulatorPinInfoEnsureACL(dom->conn, vm->def) < 0)
> + goto cleanup;
> +
> + if (!(caps = virLXCDriverGetCapabilities(driver, false)))
> + goto cleanup;
> +
> + if (virDomainLiveConfigHelperMethod(caps, driver->xmlopt,
> + vm, &flags, &targetDef) < 0)
> + goto cleanup;
> +
[1]
> + if (flags & VIR_DOMAIN_AFFECT_LIVE)
> + targetDef = vm->def;
> +
> + sa_assert(targetDef);
> +
> + if ((hostcpus = nodeGetCPUCount()) < 0)
> + goto cleanup;
> +
> + maxcpu = maplen * 8;
> + if (maxcpu > hostcpus)
> + maxcpu = hostcpus;
> +
> + /* initialize cpumaps */
> + memset(cpumaps, 0xff, maplen);
> + if (maxcpu % 8) {
> + cpumaps[maplen - 1] &= (1 << maxcpu % 8) - 1;
> + }
> +
> + if (targetDef->cputune.emulatorpin) {
> + cpumask = targetDef->cputune.emulatorpin->cpumask;
> + } else if (targetDef->cpumask) {
> + cpumask = targetDef->cpumask;
> + } else {
> + ret = 0;
> + goto cleanup;
> + }
> +
> + for (pcpu = 0; pcpu < maxcpu; pcpu++) {
> + if (virBitmapGetBit(cpumask, pcpu, &pinned) < 0)
> + goto cleanup;
> + if (!pinned)
> + VIR_UNUSE_CPU(cpumaps, pcpu);
> + }
[2]
> +
> + ret = 1;
> +
> + cleanup:
> + if (vm)
> + virObjectUnlock(vm);
> + virObjectUnref(caps);
> + return ret;
> +}
> +
> static int lxcDomainGetSecurityLabel(virDomainPtr dom, virSecurityLabelPtr seclabel)
> {
> virLXCDriverPtr driver = dom->conn->privateData;
> @@ -5831,6 +5905,7 @@ static virDriver lxcDriver = {
> .domainCreateXML = lxcDomainCreateXML, /* 0.4.4 */
> .domainCreateXMLWithFiles = lxcDomainCreateXMLWithFiles, /* 1.1.1 */
> .domainPinEmulator = lxcDomainPinEmulator, /*1.2.9*/
> + .domainGetEmulatorPinInfo = lxcDomainGetEmulatorPinInfo, /*1.2.9*/
Comment spacing is off, will now be at least /* 1.2.10 */
John
> .domainLookupByID = lxcDomainLookupByID, /* 0.4.2 */
> .domainLookupByUUID = lxcDomainLookupByUUID, /* 0.4.2 */
> .domainLookupByName = lxcDomainLookupByName, /* 0.4.2 */
>
More information about the libvir-list
mailing list