Re: [PATCH 11/23] KVM: PPC: Book3S PR: Allocate kvm_vcpu structs from kvm_vcpu_cache

2013-08-12 Thread Aneesh Kumar K.V
Paul Mackerras  writes:

> This makes PR KVM allocate its kvm_vcpu structs from the kvm_vcpu_cache
> rather than having them embedded in the kvmppc_vcpu_book3s struct,
> which is allocated with vzalloc.  The reason is to reduce the
> differences between PR and HV KVM in order to make is easier to have
> them coexist in one kernel binary.
>
> With this, the kvm_vcpu struct has a pointer to the kvmppc_vcpu_book3s
> struct.  The pointer to the kvmppc_book3s_shadow_vcpu struct has moved
> from the kvmppc_vcpu_book3s struct to the kvm_vcpu struct.
>
> Signed-off-by: Paul Mackerras 
> ---
>  arch/powerpc/include/asm/kvm_book3s.h|  4 +---
>  arch/powerpc/include/asm/kvm_book3s_32.h |  2 +-
>  arch/powerpc/include/asm/kvm_host.h  |  5 +
>  arch/powerpc/kvm/book3s_32_mmu.c |  8 
>  arch/powerpc/kvm/book3s_64_mmu.c | 11 +--
>  arch/powerpc/kvm/book3s_pr.c | 29 ++---
>  6 files changed, 34 insertions(+), 25 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/kvm_book3s.h 
> b/arch/powerpc/include/asm/kvm_book3s.h
> index 322b539..1b32f6c 100644
> --- a/arch/powerpc/include/asm/kvm_book3s.h
> +++ b/arch/powerpc/include/asm/kvm_book3s.h
> @@ -70,8 +70,6 @@ struct hpte_cache {
>  };
>  
>  struct kvmppc_vcpu_book3s {
> - struct kvm_vcpu vcpu;
> - struct kvmppc_book3s_shadow_vcpu *shadow_vcpu;
>   struct kvmppc_sid_map sid_map[SID_MAP_NUM];
>   struct {
>   u64 esid;
> @@ -192,7 +190,7 @@ extern int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned 
> long cmd);
>  
>  static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu)
>  {
> - return container_of(vcpu, struct kvmppc_vcpu_book3s, vcpu);
> + return vcpu->arch.book3s;
>  }
>  
>  extern void kvm_return_point(void);
> diff --git a/arch/powerpc/include/asm/kvm_book3s_32.h 
> b/arch/powerpc/include/asm/kvm_book3s_32.h
> index ce0ef6c..c720e0b 100644
> --- a/arch/powerpc/include/asm/kvm_book3s_32.h
> +++ b/arch/powerpc/include/asm/kvm_book3s_32.h
> @@ -22,7 +22,7 @@
>  
>  static inline struct kvmppc_book3s_shadow_vcpu *svcpu_get(struct kvm_vcpu 
> *vcpu)
>  {
> - return to_book3s(vcpu)->shadow_vcpu;
> + return vcpu->arch.shadow_vcpu;
>  }
>  
>  static inline void svcpu_put(struct kvmppc_book3s_shadow_vcpu *svcpu)
> diff --git a/arch/powerpc/include/asm/kvm_host.h 
> b/arch/powerpc/include/asm/kvm_host.h
> index c37207f..4d83972 100644
> --- a/arch/powerpc/include/asm/kvm_host.h
> +++ b/arch/powerpc/include/asm/kvm_host.h
> @@ -91,6 +91,9 @@ struct lppaca;
>  struct slb_shadow;
>  struct dtl_entry;
>  
> +struct kvmppc_vcpu_book3s;
> +struct kvmppc_book3s_shadow_vcpu;
> +
>  struct kvm_vm_stat {
>   u32 remote_tlb_flush;
>  };
> @@ -409,6 +412,8 @@ struct kvm_vcpu_arch {
>   int slb_max;/* 1 + index of last valid entry in slb[] */
>   int slb_nr; /* total number of entries in SLB */
>   struct kvmppc_mmu mmu;
> + struct kvmppc_vcpu_book3s *book3s;
> + struct kvmppc_book3s_shadow_vcpu *shadow_vcpu;
>  #endif

can the *shadow_vcpu be within  #ifdef CONFIG_PPC_BOOK3S_32 ? Rest of
the code access the variable under  #ifdef CONFIG_PPC_BOOK3S_32



-aneesh

--
To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 11/23] KVM: PPC: Book3S PR: Allocate kvm_vcpu structs from kvm_vcpu_cache

2013-08-05 Thread Paul Mackerras
This makes PR KVM allocate its kvm_vcpu structs from the kvm_vcpu_cache
rather than having them embedded in the kvmppc_vcpu_book3s struct,
which is allocated with vzalloc.  The reason is to reduce the
differences between PR and HV KVM in order to make is easier to have
them coexist in one kernel binary.

With this, the kvm_vcpu struct has a pointer to the kvmppc_vcpu_book3s
struct.  The pointer to the kvmppc_book3s_shadow_vcpu struct has moved
from the kvmppc_vcpu_book3s struct to the kvm_vcpu struct.

Signed-off-by: Paul Mackerras 
---
 arch/powerpc/include/asm/kvm_book3s.h|  4 +---
 arch/powerpc/include/asm/kvm_book3s_32.h |  2 +-
 arch/powerpc/include/asm/kvm_host.h  |  5 +
 arch/powerpc/kvm/book3s_32_mmu.c |  8 
 arch/powerpc/kvm/book3s_64_mmu.c | 11 +--
 arch/powerpc/kvm/book3s_pr.c | 29 ++---
 6 files changed, 34 insertions(+), 25 deletions(-)

diff --git a/arch/powerpc/include/asm/kvm_book3s.h 
b/arch/powerpc/include/asm/kvm_book3s.h
index 322b539..1b32f6c 100644
--- a/arch/powerpc/include/asm/kvm_book3s.h
+++ b/arch/powerpc/include/asm/kvm_book3s.h
@@ -70,8 +70,6 @@ struct hpte_cache {
 };
 
 struct kvmppc_vcpu_book3s {
-   struct kvm_vcpu vcpu;
-   struct kvmppc_book3s_shadow_vcpu *shadow_vcpu;
struct kvmppc_sid_map sid_map[SID_MAP_NUM];
struct {
u64 esid;
@@ -192,7 +190,7 @@ extern int kvmppc_h_pr(struct kvm_vcpu *vcpu, unsigned long 
cmd);
 
 static inline struct kvmppc_vcpu_book3s *to_book3s(struct kvm_vcpu *vcpu)
 {
-   return container_of(vcpu, struct kvmppc_vcpu_book3s, vcpu);
+   return vcpu->arch.book3s;
 }
 
 extern void kvm_return_point(void);
diff --git a/arch/powerpc/include/asm/kvm_book3s_32.h 
b/arch/powerpc/include/asm/kvm_book3s_32.h
index ce0ef6c..c720e0b 100644
--- a/arch/powerpc/include/asm/kvm_book3s_32.h
+++ b/arch/powerpc/include/asm/kvm_book3s_32.h
@@ -22,7 +22,7 @@
 
 static inline struct kvmppc_book3s_shadow_vcpu *svcpu_get(struct kvm_vcpu 
*vcpu)
 {
-   return to_book3s(vcpu)->shadow_vcpu;
+   return vcpu->arch.shadow_vcpu;
 }
 
 static inline void svcpu_put(struct kvmppc_book3s_shadow_vcpu *svcpu)
diff --git a/arch/powerpc/include/asm/kvm_host.h 
b/arch/powerpc/include/asm/kvm_host.h
index c37207f..4d83972 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -91,6 +91,9 @@ struct lppaca;
 struct slb_shadow;
 struct dtl_entry;
 
+struct kvmppc_vcpu_book3s;
+struct kvmppc_book3s_shadow_vcpu;
+
 struct kvm_vm_stat {
u32 remote_tlb_flush;
 };
@@ -409,6 +412,8 @@ struct kvm_vcpu_arch {
int slb_max;/* 1 + index of last valid entry in slb[] */
int slb_nr; /* total number of entries in SLB */
struct kvmppc_mmu mmu;
+   struct kvmppc_vcpu_book3s *book3s;
+   struct kvmppc_book3s_shadow_vcpu *shadow_vcpu;
 #endif
 
ulong gpr[32];
diff --git a/arch/powerpc/kvm/book3s_32_mmu.c b/arch/powerpc/kvm/book3s_32_mmu.c
index 856af98..b14af6d 100644
--- a/arch/powerpc/kvm/book3s_32_mmu.c
+++ b/arch/powerpc/kvm/book3s_32_mmu.c
@@ -111,10 +111,11 @@ static void kvmppc_mmu_book3s_32_reset_msr(struct 
kvm_vcpu *vcpu)
kvmppc_set_msr(vcpu, 0);
 }
 
-static hva_t kvmppc_mmu_book3s_32_get_pteg(struct kvmppc_vcpu_book3s 
*vcpu_book3s,
+static hva_t kvmppc_mmu_book3s_32_get_pteg(struct kvm_vcpu *vcpu,
  u32 sre, gva_t eaddr,
  bool primary)
 {
+   struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu);
u32 page, hash, pteg, htabmask;
hva_t r;
 
@@ -132,7 +133,7 @@ static hva_t kvmppc_mmu_book3s_32_get_pteg(struct 
kvmppc_vcpu_book3s *vcpu_book3
kvmppc_get_pc(&vcpu_book3s->vcpu), eaddr, vcpu_book3s->sdr1, 
pteg,
sr_vsid(sre));
 
-   r = gfn_to_hva(vcpu_book3s->vcpu.kvm, pteg >> PAGE_SHIFT);
+   r = gfn_to_hva(vcpu->kvm, pteg >> PAGE_SHIFT);
if (kvm_is_error_hva(r))
return r;
return r | (pteg & ~PAGE_MASK);
@@ -203,7 +204,6 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu 
*vcpu, gva_t eaddr,
 struct kvmppc_pte *pte, bool data,
 bool primary)
 {
-   struct kvmppc_vcpu_book3s *vcpu_book3s = to_book3s(vcpu);
u32 sre;
hva_t ptegp;
u32 pteg[16];
@@ -218,7 +218,7 @@ static int kvmppc_mmu_book3s_32_xlate_pte(struct kvm_vcpu 
*vcpu, gva_t eaddr,
 
pte->vpage = kvmppc_mmu_book3s_32_ea_to_vp(vcpu, eaddr, data);
 
-   ptegp = kvmppc_mmu_book3s_32_get_pteg(vcpu_book3s, sre, eaddr, primary);
+   ptegp = kvmppc_mmu_book3s_32_get_pteg(vcpu, sre, eaddr, primary);
if (kvm_is_error_hva(ptegp)) {
printk(KERN_INFO "KVM: Invalid PTEG!\n");
goto no_page_found;
diff --git a/arch/powerpc/kvm/book3s_64_mmu.c b/arch/powerpc/kvm/book3s_64_mmu.c
inde