Messages in this thread | | | Subject | Re: [PATCH 3/3] powerpc/mm: call H_BLOCK_REMOVE when supported | From | "Aneesh Kumar K.V" <> | Date | Thu, 12 Sep 2019 19:50:14 +0530 |
| |
On 8/30/19 5:37 PM, Laurent Dufour wrote: > Instead of calling H_BLOCK_REMOVE all the time when the feature is > exhibited, call this hcall only when the couple base page size, page size > is supported as reported by the TLB Invalidate Characteristics. >
supported is not actually what we are checking here. We are checking whether the base page size actual page size remove can be done in chunks of 8 blocks. If we don't support 8 block you fallback to bulk invalidate. May be update the commit message accordingly?
> For regular pages and hugetlb, the assumption is made that the page size is > equal to the base page size. For THP the page size is assumed to be 16M. > > Signed-off-by: Laurent Dufour <ldufour@linux.ibm.com> > --- > arch/powerpc/platforms/pseries/lpar.c | 11 +++++++++-- > 1 file changed, 9 insertions(+), 2 deletions(-) > > diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c > index 375e19b3cf53..ef3dbf108a65 100644 > --- a/arch/powerpc/platforms/pseries/lpar.c > +++ b/arch/powerpc/platforms/pseries/lpar.c > @@ -1143,7 +1143,11 @@ static inline void __pSeries_lpar_hugepage_invalidate(unsigned long *slot, > if (lock_tlbie) > spin_lock_irqsave(&pSeries_lpar_tlbie_lock, flags); > > - if (firmware_has_feature(FW_FEATURE_BLOCK_REMOVE)) > + /* > + * Assuming THP size is 16M, and we only support 8 bytes size buffer > + * for the momment. > + */ > + if (mmu_psize_defs[psize].hblk[MMU_PAGE_16M] == 8) > hugepage_block_invalidate(slot, vpn, count, psize, ssize); > else > hugepage_bulk_invalidate(slot, vpn, count, psize, ssize);
So we don't use block invalidate if blocksize is != 8.
> @@ -1437,7 +1441,10 @@ static void pSeries_lpar_flush_hash_range(unsigned long number, int local) > if (lock_tlbie) > spin_lock_irqsave(&pSeries_lpar_tlbie_lock, flags); > > - if (firmware_has_feature(FW_FEATURE_BLOCK_REMOVE)) { > + /* > + * Currently, we only support 8 bytes size buffer in do_block_remove(). > + */ > + if (mmu_psize_defs[batch->psize].hblk[batch->psize] == 8) { > do_block_remove(number, batch, param); > goto out; > } >
-aneesh
| |