On Wed, Jul 25, 2012 at 01:25:52PM +0800, tangchen wrote:
> From: Tang Chen <tangc...@cn.fujitsu.com>
> 
> Introduce 2 APIs to support hypervisor threads pin.
>     1) virDomainHypervisorPinAdd: setup hypervisor threads pin with a given 
> cpumap string.
>     2) virDomainHypervisorPinDel: remove all hypervisor threads pin.
> 
> Signed-off-by: Tang Chen <tangc...@cn.fujitsu.com>
> Signed-off-by: Hu Tao <hu...@cn.fujitsu.com>
> ---
>  src/conf/domain_conf.c   |   72 
> ++++++++++++++++++++++++++++++++++++++++++++++
>  src/conf/domain_conf.h   |    6 ++++
>  src/libvirt_private.syms |    2 ++
>  3 files changed, 80 insertions(+)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index bedbf79..cec158d 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -10957,6 +10957,78 @@ virDomainVcpuPinDel(virDomainDefPtr def, int vcpu)
>      return 0;
>  }
>  
> +int
> +virDomainHypervisorPinAdd(virDomainDefPtr def,
> +                          unsigned char *cpumap,
> +                          int maplen)
> +{
> +    virDomainVcpuPinDefPtr hypervisorpin = NULL;
> +    char *cpumask = NULL;
> +    int i;
> +
> +    if (VIR_ALLOC_N(cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0) {
> +        virReportOOMError();
> +        goto cleanup;
> +    }
> +

We have to check maplen here to avoid accessing beyond cpumask.

> +    /* Convert bitmap (cpumap) to cpumask, which is byte map. */
> +    for (i = 0; i < maplen; i++) {
> +        int cur;
> +
> +        for (cur = 0; cur < 8; cur++) {
> +            if (cpumap[i] & (1 << cur))
> +                cpumask[i * 8 + cur] = 1;
> +        }
> +    }
> +
> +    if (!def->cputune.hypervisorpin) {
> +        /* No hypervisorpin exists yet. */
> +        if (VIR_ALLOC(hypervisorpin) < 0) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +
> +        hypervisorpin->vcpuid = -1;
> +        hypervisorpin->cpumask = cpumask;
> +        def->cputune.hypervisorpin = hypervisorpin;
> +    } else {
> +        /* Since there is only 1 hypervisorpin for each vm,
> +         * juest replace the old one.
> +         */
> +        VIR_FREE(def->cputune.hypervisorpin->cpumask);
> +        def->cputune.hypervisorpin->cpumask = cpumask;
> +    }
> +
> +    return 0;
> +
> +cleanup:
> +    if (cpumask)
> +        VIR_FREE(cpumask);
> +    return -1;
> +}
> +
> +int
> +virDomainHypervisorPinDel(virDomainDefPtr def)
> +{
> +    virDomainVcpuPinDefPtr hypervisorpin = NULL;
> +
> +    /* No hypervisorpin exists yet */
> +    if (!def->cputune.hypervisorpin) {
> +        return 0;
> +    }
> +
> +    hypervisorpin = def->cputune.hypervisorpin;
> +
> +    VIR_FREE(hypervisorpin->cpumask);
> +    VIR_FREE(hypervisorpin);
> +    def->cputune.hypervisorpin = NULL;
> +
> +    if (def->cputune.hypervisorpin)
> +        return -1;
> +
> +    return 0;
> +}
> +
>  static int
>  virDomainLifecycleDefFormat(virBufferPtr buf,
>                              int type,
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index 11f0eb0..64096d5 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -1985,6 +1985,12 @@ int virDomainVcpuPinAdd(virDomainDefPtr def,
>  
>  int virDomainVcpuPinDel(virDomainDefPtr def, int vcpu);
>  
> +int virDomainHypervisorPinAdd(virDomainDefPtr def,
> +                              unsigned char *cpumap,
> +                              int maplen);
> +
> +int virDomainHypervisorPinDel(virDomainDefPtr def);
> +
>  int virDomainDiskIndexByName(virDomainDefPtr def, const char *name,
>                               bool allow_ambiguous);
>  const char *virDomainDiskPathByName(virDomainDefPtr, const char *name);
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 867c2e7..a57486a 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -491,6 +491,8 @@ virDomainTimerTrackTypeFromString;
>  virDomainTimerTrackTypeToString;
>  virDomainVcpuPinAdd;
>  virDomainVcpuPinDel;
> +virDomainHypervisorPinAdd;
> +virDomainHypervisorPinDel;
>  virDomainVcpuPinFindByVcpu;
>  virDomainVcpuPinIsDuplicate;
>  virDomainVideoDefFree;
> -- 
> 1.7.10.2
> 
> --
> libvir-list mailing list
> libvir-list@redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list

-- 
Thanks,
Hu Tao

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to