On 29.09.2011, at 08:45, David Gibson wrote: > Alex Graf has already made qemu support KVM for the pseries machine > when using the Book3S-PR KVM variant (which runs the guest in > usermode, emulating supervisor operations). This code allows gets us > very close to also working with KVM Book3S-HV (using the hypervisor > capabilities of recent POWER CPUs). > > This patch moves us another step towards Book3S-HV support by > correctly handling SMT (multithreaded) POWER CPUs. There are two > parts to this: > > * Querying KVM to check SMT capability, and if present, adjusting the > cpu numbers that qemu assigns to cause KVM to assign guest threads > to cores in the right way (this isn't automatic, because the POWER > HV support has a limitation that different threads on a single core > cannot be in different guests at the same time). > > * Correctly informing the guest OS of the SMT thread to core mappings > via the device tree. > > Signed-off-by: David Gibson <da...@gibson.dropbear.id.au> > --- > hw/spapr.c | 23 ++++++++++++++++++++--- > target-ppc/helper.c | 11 +++++++++++ > target-ppc/kvm.c | 10 ++++++++++ > target-ppc/kvm_ppc.h | 6 ++++++ > 4 files changed, 47 insertions(+), 3 deletions(-) > > diff --git a/hw/spapr.c b/hw/spapr.c > index b118975..ba9ae1c 100644 > --- a/hw/spapr.c > +++ b/hw/spapr.c > @@ -29,6 +29,9 @@ > #include "elf.h" > #include "net.h" > #include "blockdev.h" > +#include "cpus.h" > +#include "kvm.h" > +#include "kvm_ppc.h" > > #include "hw/boards.h" > #include "hw/ppc.h" > @@ -103,6 +106,7 @@ static void *spapr_create_fdt_skel(const char *cpu_model, > uint32_t interrupt_server_ranges_prop[] = {0, cpu_to_be32(smp_cpus)}; > int i; > char *modelname; > + int smt = kvmppc_smt_threads(); > > #define _FDT(exp) \ > do { \ > @@ -162,13 +166,17 @@ static void *spapr_create_fdt_skel(const char > *cpu_model, > > for (env = first_cpu; env != NULL; env = env->next_cpu) { > int index = env->cpu_index; > - uint32_t gserver_prop[] = {cpu_to_be32(index), 0}; /* HACK! */ > + uint32_t servers_prop[smp_threads]; > + uint32_t gservers_prop[smp_threads * 2]; > char *nodename; > uint32_t segs[] = {cpu_to_be32(28), cpu_to_be32(40), > 0xffffffff, 0xffffffff}; > uint32_t tbfreq = kvm_enabled() ? kvmppc_get_tbfreq() : TIMEBASE_FREQ; > uint32_t cpufreq = kvm_enabled() ? kvmppc_get_clockfreq() : > 1000000000; > > + if ((index % smt) != 0) > + continue;
Please run through checkpatch.pl Alex