Skip to content

Commit

Permalink
target/ppc: Add kvmppc_hpt_needs_host_contiguous_pages() helper
Browse files Browse the repository at this point in the history
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 <david@gibson.dropbear.id.au>
Reviewed-by: Greg Kurz <groug@kaod.org>
Reviewed-by: Cédric Le Goater <clg@kaod.org>
  • Loading branch information
dgibson committed Jun 21, 2018
1 parent e2e4f64 commit 24c6863
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 2 deletions.
17 changes: 15 additions & 2 deletions target/ppc/kvm.c
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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 {
Expand Down
6 changes: 6 additions & 0 deletions target/ppc/kvm_ppc.h
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 24c6863

Please sign in to comment.