Skip to content

Commit

Permalink
spapr: Allocate HTAB from machine init
Browse files Browse the repository at this point in the history
Allocate HTAB from ppc_spapr_init() so that we can abort the guest
if requested HTAB size is't allocated by the host. However retain the
htab reset call in spapr_reset_htab() so that HTAB gets reset (and
not allocated) during machine reset.

Signed-off-by: Bharata B Rao <bharata@linux.vnet.ibm.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
  • Loading branch information
Bharata B Rao authored and dgibson committed Oct 22, 2015
1 parent 6a6739d commit b817772
Showing 1 changed file with 27 additions and 7 deletions.
34 changes: 27 additions & 7 deletions hw/ppc/spapr.c
Expand Up @@ -979,7 +979,7 @@ static void emulate_spapr_hypercall(PowerPCCPU *cpu)
#define CLEAN_HPTE(_hpte) ((*(uint64_t *)(_hpte)) &= tswap64(~HPTE64_V_HPTE_DIRTY))
#define DIRTY_HPTE(_hpte) ((*(uint64_t *)(_hpte)) |= tswap64(HPTE64_V_HPTE_DIRTY))

static void spapr_reset_htab(sPAPRMachineState *spapr)
static void spapr_alloc_htab(sPAPRMachineState *spapr)
{
long shift;
int index;
Expand All @@ -994,18 +994,37 @@ static void spapr_reset_htab(sPAPRMachineState *spapr)
/* Kernel handles htab, we don't need to allocate one */
spapr->htab_shift = shift;
kvmppc_kern_htab = true;
} else {
/* Allocate htab */
spapr->htab = qemu_memalign(HTAB_SIZE(spapr), HTAB_SIZE(spapr));

/* And clear it */
memset(spapr->htab, 0, HTAB_SIZE(spapr));

for (index = 0; index < HTAB_SIZE(spapr) / HASH_PTE_SIZE_64; index++) {
DIRTY_HPTE(HPTE(spapr->htab, index));
}
}
}

/*
* Clear HTAB entries during reset.
*
* If host kernel has allocated HTAB, KVM_PPC_ALLOCATE_HTAB ioctl is
* used to clear HTAB. Otherwise QEMU-allocated HTAB is cleared manually.
*/
static void spapr_reset_htab(sPAPRMachineState *spapr)
{
long shift;
int index;

shift = kvmppc_reset_htab(spapr->htab_shift);
if (shift > 0) {
/* Tell readers to update their file descriptor */
if (spapr->htab_fd >= 0) {
spapr->htab_fd_stale = true;
}
} else {
if (!spapr->htab) {
/* Allocate an htab if we don't yet have one */
spapr->htab = qemu_memalign(HTAB_SIZE(spapr), HTAB_SIZE(spapr));
}

/* And clear it */
memset(spapr->htab, 0, HTAB_SIZE(spapr));

for (index = 0; index < HTAB_SIZE(spapr) / HASH_PTE_SIZE_64; index++) {
Expand Down Expand Up @@ -1710,6 +1729,7 @@ static void ppc_spapr_init(MachineState *machine)
}
spapr->htab_shift++;
}
spapr_alloc_htab(spapr);

/* Set up Interrupt Controller before we create the VCPUs */
spapr->icp = xics_system_init(machine,
Expand Down

0 comments on commit b817772

Please sign in to comment.