[libvirt] [PATCH 2/5] Support CPU placement in LXC driver
Daniel P. Berrange
berrange at redhat.com
Mon Nov 28 12:07:31 UTC 2011
On Thu, Nov 24, 2011 at 09:55:26PM +0800, Daniel Veillard wrote:
> 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
Yes, these should obviously have been s/QEMU/LXC/ :-)
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list