Message ID | 1475318516-8447-1-git-send-email-anton@ozlabs.org (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
On 10/01/2016 04:11 PM, Anton Blanchard wrote: > From: Anton Blanchard <anton@samba.org> > > An hcall was recently added that does exactly what we need > during kexec - it clears the entire MMU hash table, ignoring any > VRMA mappings. > > Try it and fall back to the old method if we get a failure. > > On a POWER8 box with 5TB of memory, this reduces the time it takes to > kexec a new kernel from from 4 minutes to 1 minute. > > Signed-off-by: Anton Blanchard <anton@samba.org> Tested-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> > --- > arch/powerpc/include/asm/hvcall.h | 3 ++- > arch/powerpc/platforms/pseries/lpar.c | 14 +++++++++++++- > 2 files changed, 15 insertions(+), 2 deletions(-) > > diff --git a/arch/powerpc/include/asm/hvcall.h b/arch/powerpc/include/asm/hvcall.h > index 708edeb..489748e 100644 > --- a/arch/powerpc/include/asm/hvcall.h > +++ b/arch/powerpc/include/asm/hvcall.h > @@ -275,7 +275,8 @@ > #define H_COP 0x304 > #define H_GET_MPP_X 0x314 > #define H_SET_MODE 0x31C > -#define MAX_HCALL_OPCODE H_SET_MODE > +#define H_CLEAR_HPT 0x358 > +#define MAX_HCALL_OPCODE H_CLEAR_HPT > > /* H_VIOCTL functions */ > #define H_GET_VIOA_DUMP_SIZE 0x01 > diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c > index 86707e6..03884a8 100644 > --- a/arch/powerpc/platforms/pseries/lpar.c > +++ b/arch/powerpc/platforms/pseries/lpar.c > @@ -221,7 +221,7 @@ static long pSeries_lpar_hpte_remove(unsigned long hpte_group) > return -1; > } > > -static void pSeries_lpar_hptab_clear(void) > +static void __pSeries_lpar_clear_hpt(void) > { > unsigned long size_bytes = 1UL << ppc64_pft_size; > unsigned long hpte_count = size_bytes >> 4; > @@ -249,6 +249,18 @@ static void pSeries_lpar_hptab_clear(void) > &(ptes[j].pteh), &(ptes[j].ptel)); > } > } > +} > + > +static void pSeries_lpar_hptab_clear(void) > +{ > + int rc; > + > + do { > + rc = plpar_hcall_norets(H_CLEAR_HPT); > + } while (rc == H_CONTINUE); > + > + if (rc != H_SUCCESS) > + __pSeries_lpar_clear_hpt(); > > #ifdef __LITTLE_ENDIAN__ > /* >
On Sat, 2016-01-10 at 10:41:56 UTC, Anton Blanchard wrote: > From: Anton Blanchard <anton@samba.org> > > An hcall was recently added that does exactly what we need > during kexec - it clears the entire MMU hash table, ignoring any > VRMA mappings. > > Try it and fall back to the old method if we get a failure. > > On a POWER8 box with 5TB of memory, this reduces the time it takes to > kexec a new kernel from from 4 minutes to 1 minute. > > Signed-off-by: Anton Blanchard <anton@samba.org> Applied to powerpc next, thanks. https://git.kernel.org/powerpc/c/5246adec59458b5d325b8e1462ea9e cheers
diff --git a/arch/powerpc/include/asm/hvcall.h b/arch/powerpc/include/asm/hvcall.h index 708edeb..489748e 100644 --- a/arch/powerpc/include/asm/hvcall.h +++ b/arch/powerpc/include/asm/hvcall.h @@ -275,7 +275,8 @@ #define H_COP 0x304 #define H_GET_MPP_X 0x314 #define H_SET_MODE 0x31C -#define MAX_HCALL_OPCODE H_SET_MODE +#define H_CLEAR_HPT 0x358 +#define MAX_HCALL_OPCODE H_CLEAR_HPT /* H_VIOCTL functions */ #define H_GET_VIOA_DUMP_SIZE 0x01 diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c index 86707e6..03884a8 100644 --- a/arch/powerpc/platforms/pseries/lpar.c +++ b/arch/powerpc/platforms/pseries/lpar.c @@ -221,7 +221,7 @@ static long pSeries_lpar_hpte_remove(unsigned long hpte_group) return -1; } -static void pSeries_lpar_hptab_clear(void) +static void __pSeries_lpar_clear_hpt(void) { unsigned long size_bytes = 1UL << ppc64_pft_size; unsigned long hpte_count = size_bytes >> 4; @@ -249,6 +249,18 @@ static void pSeries_lpar_hptab_clear(void) &(ptes[j].pteh), &(ptes[j].ptel)); } } +} + +static void pSeries_lpar_hptab_clear(void) +{ + int rc; + + do { + rc = plpar_hcall_norets(H_CLEAR_HPT); + } while (rc == H_CONTINUE); + + if (rc != H_SUCCESS) + __pSeries_lpar_clear_hpt(); #ifdef __LITTLE_ENDIAN__ /*