On Wed, May 02, 2018 at 06:06:38PM -0300, Murilo Opsfelder Araujo wrote: > On Thu, Apr 19, 2018 at 04:29:11PM +1000, David Gibson wrote: > > The way the POWER Hash Page Table (HPT) MMU is virtualized by KVM HV means > > that every page that the guest puts in the pagetables must be truly > > physically contiguous, not just GPA-contiguous. In effect this means that > > an HPT guest can't use any pagesizes greater than the host page size used > > to back its memory. > > > > At present we handle this by changing what we advertise to the guest based > > on the backing pagesizes. This is pretty bad, because it means the guest > > sees a different environment depending on what should be host configuration > > details. > > > > As a start on fixing this, we add a new capability parameter to the pseries > > machine type which gives the maximum allowed pagesizes for an HPT guest (as > > a shift). For now we just create and validate the parameter without making > > it do anything. > > > > Signed-off-by: David Gibson <[email protected]> > > --- > > hw/ppc/spapr.c | 1 + > > hw/ppc/spapr_caps.c | 53 > > ++++++++++++++++++++++++++++++++++++++++++++++++++ > > include/hw/ppc/spapr.h | 4 +++- > > 3 files changed, 57 insertions(+), 1 deletion(-) > > > > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c > > index bdf72e1e89..36e41aff71 100644 > > --- a/hw/ppc/spapr.c > > +++ b/hw/ppc/spapr.c > > @@ -3876,6 +3876,7 @@ static void spapr_machine_class_init(ObjectClass *oc, > > void *data) > > smc->default_caps.caps[SPAPR_CAP_CFPC] = SPAPR_CAP_BROKEN; > > smc->default_caps.caps[SPAPR_CAP_SBBC] = SPAPR_CAP_BROKEN; > > smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_BROKEN; > > + smc->default_caps.caps[SPAPR_CAP_HPT_MPS] = 16; /* Allow 64kiB pages */ > > spapr_caps_add_properties(smc, &error_abort); > > } > > > > diff --git a/hw/ppc/spapr_caps.c b/hw/ppc/spapr_caps.c > > index 531e145114..cbc41f5b20 100644 > > --- a/hw/ppc/spapr_caps.c > > +++ b/hw/ppc/spapr_caps.c > > @@ -27,6 +27,7 @@ > > #include "qapi/visitor.h" > > #include "sysemu/hw_accel.h" > > #include "target/ppc/cpu.h" > > +#include "target/ppc/mmu-hash64.h" > > #include "cpu-models.h" > > #include "kvm_ppc.h" > > > > @@ -142,6 +143,39 @@ out: > > g_free(val); > > } > > > > +static void spapr_cap_get_int(Object *obj, Visitor *v, const char *name, > > + void *opaque, Error **errp) > > +{ > > + sPAPRCapabilityInfo *cap = opaque; > > + sPAPRMachineState *spapr = SPAPR_MACHINE(obj); > > + int64_t value = spapr_get_cap(spapr, cap->index); > > + > > + visit_type_int(v, name, &value, errp); > > +} > > + > > +static void spapr_cap_set_int(Object *obj, Visitor *v, const char *name, > > + void *opaque, Error **errp) > > +{ > > + sPAPRCapabilityInfo *cap = opaque; > > + sPAPRMachineState *spapr = SPAPR_MACHINE(obj); > > + int64_t value; > > + Error *local_err = NULL; > > + > > + visit_type_int(v, name, &value, &local_err); > > + if (local_err) { > > + error_propagate(errp, local_err); > > + return; > > + } > > + > > + if ((value < 0) || (value > 255)) { > > + error_setg(errp, "Value for %s out of range (0..255)", name); > > + return; > > + } > > + > > + spapr->cmd_line_caps[cap->index] = true; > > + spapr->eff.caps[cap->index] = value; > > +} > > + > > Hi, David. > > Do you think uint8_t would fit better for spapr_[gs]et_int() functions? > > Perhaps renaming them to spapr_[gs]set_int8() and calling > visit_type_int8() instead.
Yeah, that's a good idea. Using visit_type_uint8 means we don't need
to implement our own clamping.
--
David Gibson | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
| _way_ _around_!
http://www.ozlabs.org/~dgibson
signature.asc
Description: PGP signature
