[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/3] pseries: Support SMT systems for KVM Book3S
From: |
Alexander Graf |
Subject: |
Re: [Qemu-devel] [PATCH 1/3] pseries: Support SMT systems for KVM Book3S-HV |
Date: |
Thu, 29 Sep 2011 15:17:11 +0200 |
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 <address@hidden>
> ---
> 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