On Mon, 18 Jun 2018 16:36:01 +1000
David Gibson <da...@gibson.dropbear.id.au> wrote:

> KVM HV has a restriction that for HPT mode guests, guest pages must be hpa
> contiguous as well as gpa contiguous.  We have to account for that in
> various places.  We determine whether we're subject to this restriction
> from the SMMU information exposed by KVM.
> 
> Planned cleanups to the way we handle this will require knowing whether
> this restriction is in play in wider parts of the code.  So, expose a
> helper function which returns it.
> 
> This does mean some redundant calls to kvm_get_smmu_info(), but they'll go
> away again with future cleanups.
> 
> Signed-off-by: David Gibson <da...@gibson.dropbear.id.au>
> ---

Reviewed-by: Greg Kurz <gr...@kaod.org>

>  target/ppc/kvm.c     | 17 +++++++++++++++--
>  target/ppc/kvm_ppc.h |  6 ++++++
>  2 files changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/target/ppc/kvm.c b/target/ppc/kvm.c
> index 5c0e313ca6..50b5d01432 100644
> --- a/target/ppc/kvm.c
> +++ b/target/ppc/kvm.c
> @@ -406,9 +406,22 @@ target_ulong kvmppc_configure_v3_mmu(PowerPCCPU *cpu,
>      }
>  }
>  
> +bool kvmppc_hpt_needs_host_contiguous_pages(void)
> +{
> +    PowerPCCPU *cpu = POWERPC_CPU(first_cpu);
> +    static struct kvm_ppc_smmu_info smmu_info;
> +
> +    if (!kvm_enabled()) {
> +        return false;
> +    }
> +
> +    kvm_get_smmu_info(cpu, &smmu_info);
> +    return !!(smmu_info.flags & KVM_PPC_PAGE_SIZES_REAL);
> +}
> +
>  static bool kvm_valid_page_size(uint32_t flags, long rampgsize, uint32_t 
> shift)
>  {
> -    if (!(flags & KVM_PPC_PAGE_SIZES_REAL)) {
> +    if (!kvmppc_hpt_needs_host_contiguous_pages()) {
>          return true;
>      }
>  
> @@ -445,7 +458,7 @@ static void kvm_fixup_page_sizes(PowerPCCPU *cpu)
>      /* If we have HV KVM, we need to forbid CI large pages if our
>       * host page size is smaller than 64K.
>       */
> -    if (smmu_info.flags & KVM_PPC_PAGE_SIZES_REAL) {
> +    if (kvmppc_hpt_needs_host_contiguous_pages()) {
>          if (getpagesize() >= 0x10000) {
>              cpu->hash64_opts->flags |= PPC_HASH64_CI_LARGEPAGE;
>          } else {
> diff --git a/target/ppc/kvm_ppc.h b/target/ppc/kvm_ppc.h
> index e2840e1d33..a7ddb8a5d6 100644
> --- a/target/ppc/kvm_ppc.h
> +++ b/target/ppc/kvm_ppc.h
> @@ -70,6 +70,7 @@ int kvmppc_resize_hpt_prepare(PowerPCCPU *cpu, target_ulong 
> flags, int shift);
>  int kvmppc_resize_hpt_commit(PowerPCCPU *cpu, target_ulong flags, int shift);
>  bool kvmppc_pvr_workaround_required(PowerPCCPU *cpu);
>  
> +bool kvmppc_hpt_needs_host_contiguous_pages(void);
>  bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path);
>  
>  #else
> @@ -222,6 +223,11 @@ static inline uint64_t kvmppc_rma_size(uint64_t 
> current_size,
>      return ram_size;
>  }
>  
> +static inline bool kvmppc_hpt_needs_host_contiguous_pages(void)
> +{
> +    return false;
> +}
> +
>  static inline bool kvmppc_is_mem_backend_page_size_ok(const char *obj_path)
>  {
>      return true;


Reply via email to