[libvirt] [PATCH 2/5] Support CPU placement in LXC driver

Daniel Veillard veillard at redhat.com
Thu Nov 24 13:55:26 UTC 2011


On Thu, Nov 24, 2011 at 11:38:13AM +0000, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
> 
> While LXC does not have the concept of VCPUS, so we cann't do

 s/nn/n/

> per-VCPU pCPU placement, we can support the VM level CPU
> placement. Todo this simply set the CPU affinity of the LXC
> controller at startup. All child processes will inherit this
> affinity.
> 
> * src/lxc/lxc_controller.c: Set process affinity
> ---
>  src/lxc/lxc_controller.c |   63 ++++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 63 insertions(+), 0 deletions(-)
> 
> diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
> index 4718fa8..1db25fb 100644
> --- a/src/lxc/lxc_controller.c
> +++ b/src/lxc/lxc_controller.c
> @@ -66,6 +66,8 @@
>  #include "virfile.h"
>  #include "virpidfile.h"
>  #include "command.h"
> +#include "processinfo.h"
> +#include "nodeinfo.h"
>  
>  #define VIR_FROM_THIS VIR_FROM_LXC
>  
> @@ -322,6 +324,64 @@ static int lxcSetContainerNUMAPolicy(virDomainDefPtr def)
>  }
>  #endif
>  
> +
> +/*
> + * To be run while still single threaded
> + */
> +static int lxcSetContainerCpuAffinity(virDomainDefPtr def)
> +{
> +    int i, hostcpus, maxcpu = CPU_SETSIZE;
> +    virNodeInfo nodeinfo;
> +    unsigned char *cpumap;
> +    int cpumaplen;
> +
> +    VIR_DEBUG("Setting CPU affinity");
> +
> +    if (nodeGetInfo(NULL, &nodeinfo) < 0)
> +        return -1;
> +
> +    /* setaffinity fails if you set bits for CPUs which
> +     * aren't present, so we have to limit ourselves */
> +    hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
> +    if (maxcpu > hostcpus)
> +        maxcpu = hostcpus;
> +
> +    cpumaplen = VIR_CPU_MAPLEN(maxcpu);
> +    if (VIR_ALLOC_N(cpumap, cpumaplen) < 0) {
> +        virReportOOMError();
> +        return -1;
> +    }
> +
> +    if (def->cpumask) {
> +        /* XXX why don't we keep 'cpumask' in the libvirt cpumap
> +         * format to start with ?!?! */
> +        for (i = 0 ; i < maxcpu && i < def->cpumasklen ; i++)
> +            if (def->cpumask[i])
> +                VIR_USE_CPU(cpumap, i);
> +    } else {
> +        /* You may think this is redundant, but we can't assume libvirtd
> +         * itself is running on all pCPUs, so we need to explicitly set
> +         * the spawned QEMU instance to all pCPUs if no map is given in

  Hum you mean LXC container instead of QEmu, right ?

> +         * its config file */
> +        for (i = 0 ; i < maxcpu ; i++)
> +            VIR_USE_CPU(cpumap, i);
> +    }
> +
> +    /* We are pressuming we are running between fork/exec of QEMU

  idem

> +     * so use '0' to indicate our own process ID. No threads are
> +     * running at this point
> +     */
> +    if (virProcessInfoSetAffinity(0, /* Self */
> +                                  cpumap, cpumaplen, maxcpu) < 0) {
> +        VIR_FREE(cpumap);
> +        return -1;
> +    }
> +    VIR_FREE(cpumap);
> +
> +    return 0;
> +}
> +
> +
>  /**
>   * lxcSetContainerResources
>   * @def: pointer to virtual machine structure
> @@ -347,6 +407,9 @@ static int lxcSetContainerResources(virDomainDefPtr def)
>          {'c', LXC_DEV_MAJ_TTY, LXC_DEV_MIN_PTMX},
>          {0,   0, 0}};
>  
> +    if (lxcSetContainerCpuAffinity(def) < 0)
> +        return -1;
> +
>      if (lxcSetContainerNUMAPolicy(def) < 0)
>          return -1;

  Either I don't understand the comments or they need fixing :)

  ACK

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list