From mboxrd@z Thu Jan 1 00:00:00 1970 From: Balbir Singh Subject: Re: [PATCH 01/18] powerpc/64: Don't try to use radix MMU under a hypervisor Date: Thu, 12 Jan 2017 22:18:59 +0530 Message-ID: <20170112164859.GA7027@localhost.localdomain> References: <1484212046-29591-1-git-send-email-paulus@ozlabs.org> <1484212046-29591-2-git-send-email-paulus@ozlabs.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: linuxppc-dev@ozlabs.org, kvm@vger.kernel.org, kvm-ppc@vger.kernel.org To: Paul Mackerras Return-path: Received: from mail-pf0-f195.google.com ([209.85.192.195]:36149 "EHLO mail-pf0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750733AbdALQtH (ORCPT ); Thu, 12 Jan 2017 11:49:07 -0500 Content-Disposition: inline In-Reply-To: <1484212046-29591-2-git-send-email-paulus@ozlabs.org> Sender: kvm-owner@vger.kernel.org List-ID: On Thu, Jan 12, 2017 at 08:07:09PM +1100, Paul Mackerras wrote: > Currently, if the kernel is running on a POWER9 processor under a > hypervisor, it will try to use the radix MMU even though it doesn't > have the necessary code to use radix under a hypervisor (it doesn't > negotiate use of radix, and it doesn't do the H_REGISTER_PROC_TBL H_REGISTER_PROCESS_TABLE for consistency > hcall). The result is that the guest kernel will crash when it tries > to turn on the MMU. > > This fixes it by looking for the /chosen/ibm,architecture-vec-5 > property, and if it exists, clears the radix MMU feature bit, > before we decide whether to initialize for radix or HPT. This > property is created by the hypervisor as a result of the guest > calling the ibm,client-architecture-support method to indicate > its capabilities, so it will indicate whether the hypervisor > agreed to us using radix. > > Systems without a hypervisor may have this property also (for > example, skiboot creates it), so we check the HV bit in the MSR > to see whether we are running as a guest or not. If we are in > hypervisor mode, then we can do whatever we like including > using the radix MMU. > > The reason for using this property is that in future, when we > have support for using radix under a hypervisor, we will need > to check this property to see whether the hypervisor agreed to > us using radix. > > Cc: stable@vger.kernel.org # v4.8+ > Signed-off-by: Paul Mackerras > --- > arch/powerpc/mm/init_64.c | 33 +++++++++++++++++++++++++++++++++ > 1 file changed, 33 insertions(+) > > diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c > index 93abf8a..4d9481e 100644 > --- a/arch/powerpc/mm/init_64.c > +++ b/arch/powerpc/mm/init_64.c > @@ -42,6 +42,8 @@ > #include > #include > #include > +#include > +#include > > #include > #include > @@ -344,12 +346,43 @@ static int __init parse_disable_radix(char *p) > } > early_param("disable_radix", parse_disable_radix); > > +/* > + * If we're running under a hypervisor, we currently can't do radix > + * since we don't have the code to do the H_REGISTER_PROC_TBL hcall. _PROCESS_TABLE > + * We tell that we're running under a hypervisor by looking for the > + * /chosen/ibm,architecture-vec-5 property. > + */ > +static void early_check_vec5(void) > +{ The function is called early_check, but it also disables MMU_FTR_TYPE_RADIX, should the disabling be moved out to the caller, since the check has nothing to do with disabling the feature? > + unsigned long root, chosen; > + int size; > + const u8 *vec5; > + > + root = of_get_flat_dt_root(); > + chosen = of_get_flat_dt_subnode_by_name(root, "chosen"); > + if (chosen == -FDT_ERR_NOTFOUND) > + return; > + vec5 = of_get_flat_dt_prop(chosen, "ibm,architecture-vec-5", &size); > + if (!vec5) > + return; > + cur_cpu_spec->mmu_features &= ~MMU_FTR_TYPE_RADIX; > +} > + > void __init mmu_early_init_devtree(void) > { > /* Disable radix mode based on kernel command line. */ > if (disable_radix) > cur_cpu_spec->mmu_features &= ~MMU_FTR_TYPE_RADIX; > > + /* > + * Check /chosen/ibm,architecture-vec-5 if running as a guest. > + * When running bare-metal, we can use radix if we like > + * even though the ibm,architecture-vec-5 property created by > + * skiboot doesn't have the necessary bits set. > + */ > + if (early_radix_enabled() && !(mfmsr() & MSR_HV)) > + early_check_vec5(); Balbir Singh.