2022-06-16 04:49:00

by Baolin Wang

[permalink] [raw]
Subject: [PATCH] arm64/hugetlb: Implement arm64 specific hugetlb_mask_last_hp

The HugeTLB address ranges are linearly scanned during fork, unmap and
remap operations, and the linear scan can skip to the end of range mapped
by the page table page if hitting a non-present entry, which can help
to speed linear scanning of the HugeTLB address ranges.

So hugetlb_mask_last_hp() is introduced to help to update the address in
the loop of HugeTLB linear scanning with getting the last huge page mapped
by the associated page table page[1], when a non-present entry is encountered.

Considering ARM64 specific cont-pte/pmd size HugeTLB, this patch implemented
an ARM64 specific hugetlb_mask_last_hp() to help this case.

[1] https://lore.kernel.org/linux-mm/[email protected]/

Signed-off-by: Baolin Wang <[email protected]>
---
Note: this patch is based on the series: "hugetlb: speed up linear
address scanning" from Mike. Mike, please fold it into your series.
Thanks.
---
arch/arm64/mm/hugetlbpage.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)

diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
index e2a5ec9..958935c 100644
--- a/arch/arm64/mm/hugetlbpage.c
+++ b/arch/arm64/mm/hugetlbpage.c
@@ -368,6 +368,26 @@ pte_t *huge_pte_offset(struct mm_struct *mm,
return NULL;
}

+unsigned long hugetlb_mask_last_hp(struct hstate *h)
+{
+ unsigned long hp_size = huge_page_size(h);
+
+ switch (hp_size) {
+ case PUD_SIZE:
+ return PGDIR_SIZE - PUD_SIZE;
+ case CONT_PMD_SIZE:
+ return PUD_SIZE - CONT_PMD_SIZE;
+ case PMD_SIZE:
+ return PUD_SIZE - PMD_SIZE;
+ case CONT_PTE_SIZE:
+ return PMD_SIZE - CONT_PTE_SIZE;
+ default:
+ break;
+ }
+
+ return ~0UL;
+}
+
pte_t arch_make_huge_pte(pte_t entry, unsigned int shift, vm_flags_t flags)
{
size_t pagesize = 1UL << shift;
--
1.8.3.1


2022-06-16 09:29:06

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] arm64/hugetlb: Implement arm64 specific hugetlb_mask_last_hp

Hi Baolin,

I love your patch! Perhaps something to improve:

[auto build test WARNING on arm64/for-next/core]
[also build test WARNING on linus/master]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/intel-lab-lkp/linux/commits/Baolin-Wang/arm64-hugetlb-Implement-arm64-specific-hugetlb_mask_last_hp/20220616-113640
base: https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/core
config: arm64-allyesconfig (https://download.01.org/0day-ci/archive/20220616/[email protected]/config)
compiler: aarch64-linux-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/f1309dfbc2b70ec5dd72ac38e95a49b7be42b9b6
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Baolin-Wang/arm64-hugetlb-Implement-arm64-specific-hugetlb_mask_last_hp/20220616-113640
git checkout f1309dfbc2b70ec5dd72ac38e95a49b7be42b9b6
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash arch/arm64/mm/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <[email protected]>

All warnings (new ones prefixed by >>):

>> arch/arm64/mm/hugetlbpage.c:371:15: warning: no previous prototype for 'hugetlb_mask_last_hp' [-Wmissing-prototypes]
371 | unsigned long hugetlb_mask_last_hp(struct hstate *h)
| ^~~~~~~~~~~~~~~~~~~~


vim +/hugetlb_mask_last_hp +371 arch/arm64/mm/hugetlbpage.c

370
> 371 unsigned long hugetlb_mask_last_hp(struct hstate *h)
372 {
373 unsigned long hp_size = huge_page_size(h);
374
375 switch (hp_size) {
376 case PUD_SIZE:
377 return PGDIR_SIZE - PUD_SIZE;
378 case CONT_PMD_SIZE:
379 return PUD_SIZE - CONT_PMD_SIZE;
380 case PMD_SIZE:
381 return PUD_SIZE - PMD_SIZE;
382 case CONT_PTE_SIZE:
383 return PMD_SIZE - CONT_PTE_SIZE;
384 default:
385 break;
386 }
387
388 return ~0UL;
389 }
390

--
0-DAY CI Kernel Test Service
https://01.org/lkp

2022-06-16 11:25:45

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] arm64/hugetlb: Implement arm64 specific hugetlb_mask_last_hp

Hi Baolin,

I love your patch! Yet something to improve:

[auto build test ERROR on arm64/for-next/core]
[also build test ERROR on linus/master v5.19-rc2 next-20220616]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/intel-lab-lkp/linux/commits/Baolin-Wang/arm64-hugetlb-Implement-arm64-specific-hugetlb_mask_last_hp/20220616-113640
base: https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/core
config: arm64-buildonly-randconfig-r001-20220616 (https://download.01.org/0day-ci/archive/20220616/[email protected]/config)
compiler: aarch64-linux-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/f1309dfbc2b70ec5dd72ac38e95a49b7be42b9b6
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Baolin-Wang/arm64-hugetlb-Implement-arm64-specific-hugetlb_mask_last_hp/20220616-113640
git checkout f1309dfbc2b70ec5dd72ac38e95a49b7be42b9b6
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.3.0 make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash arch/arm64/mm/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <[email protected]>

All errors (new ones prefixed by >>):

arch/arm64/mm/hugetlbpage.c:371:15: warning: no previous prototype for 'hugetlb_mask_last_hp' [-Wmissing-prototypes]
371 | unsigned long hugetlb_mask_last_hp(struct hstate *h)
| ^~~~~~~~~~~~~~~~~~~~
arch/arm64/mm/hugetlbpage.c: In function 'hugetlb_mask_last_hp':
>> arch/arm64/mm/hugetlbpage.c:380:9: error: duplicate case value
380 | case PMD_SIZE:
| ^~~~
arch/arm64/mm/hugetlbpage.c:376:9: note: previously used here
376 | case PUD_SIZE:
| ^~~~


vim +380 arch/arm64/mm/hugetlbpage.c

370
371 unsigned long hugetlb_mask_last_hp(struct hstate *h)
372 {
373 unsigned long hp_size = huge_page_size(h);
374
375 switch (hp_size) {
376 case PUD_SIZE:
377 return PGDIR_SIZE - PUD_SIZE;
378 case CONT_PMD_SIZE:
379 return PUD_SIZE - CONT_PMD_SIZE;
> 380 case PMD_SIZE:
381 return PUD_SIZE - PMD_SIZE;
382 case CONT_PTE_SIZE:
383 return PMD_SIZE - CONT_PTE_SIZE;
384 default:
385 break;
386 }
387
388 return ~0UL;
389 }
390

--
0-DAY CI Kernel Test Service
https://01.org/lkp

2022-06-16 12:12:59

by Baoquan He

[permalink] [raw]
Subject: Re: [PATCH] arm64/hugetlb: Implement arm64 specific hugetlb_mask_last_hp

On 06/16/22 at 11:34am, Baolin Wang wrote:
> The HugeTLB address ranges are linearly scanned during fork, unmap and
> remap operations, and the linear scan can skip to the end of range mapped
> by the page table page if hitting a non-present entry, which can help
> to speed linear scanning of the HugeTLB address ranges.
>
> So hugetlb_mask_last_hp() is introduced to help to update the address in
> the loop of HugeTLB linear scanning with getting the last huge page mapped
> by the associated page table page[1], when a non-present entry is encountered.
>
> Considering ARM64 specific cont-pte/pmd size HugeTLB, this patch implemented
> an ARM64 specific hugetlb_mask_last_hp() to help this case.
>
> [1] https://lore.kernel.org/linux-mm/[email protected]/
>
> Signed-off-by: Baolin Wang <[email protected]>
> ---
> Note: this patch is based on the series: "hugetlb: speed up linear
> address scanning" from Mike. Mike, please fold it into your series.
> Thanks.
> ---
> arch/arm64/mm/hugetlbpage.c | 20 ++++++++++++++++++++
> 1 file changed, 20 insertions(+)
>
> diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
> index e2a5ec9..958935c 100644
> --- a/arch/arm64/mm/hugetlbpage.c
> +++ b/arch/arm64/mm/hugetlbpage.c
> @@ -368,6 +368,26 @@ pte_t *huge_pte_offset(struct mm_struct *mm,
> return NULL;
> }
>
> +unsigned long hugetlb_mask_last_hp(struct hstate *h)
> +{
> + unsigned long hp_size = huge_page_size(h);

hp_size may not be a good name, it reminds me of hotplug. I would name
it hpage_size even though a little more characters are added.

> +
> + switch (hp_size) {
> + case PUD_SIZE:
> + return PGDIR_SIZE - PUD_SIZE;
> + case CONT_PMD_SIZE:
> + return PUD_SIZE - CONT_PMD_SIZE;
> + case PMD_SIZE:
> + return PUD_SIZE - PMD_SIZE;
> + case CONT_PTE_SIZE:
> + return PMD_SIZE - CONT_PTE_SIZE;
> + default:
> + break;
> + }
> +
> + return ~0UL;
> +}
> +
> pte_t arch_make_huge_pte(pte_t entry, unsigned int shift, vm_flags_t flags)
> {
> size_t pagesize = 1UL << shift;
> --
> 1.8.3.1
>
>

2022-06-16 17:49:57

by Mike Kravetz

[permalink] [raw]
Subject: Re: [PATCH] arm64/hugetlb: Implement arm64 specific hugetlb_mask_last_hp

On 06/16/22 20:05, Baoquan He wrote:
> On 06/16/22 at 11:34am, Baolin Wang wrote:
> > The HugeTLB address ranges are linearly scanned during fork, unmap and
> > remap operations, and the linear scan can skip to the end of range mapped
> > by the page table page if hitting a non-present entry, which can help
> > to speed linear scanning of the HugeTLB address ranges.
> >
> > So hugetlb_mask_last_hp() is introduced to help to update the address in
> > the loop of HugeTLB linear scanning with getting the last huge page mapped
> > by the associated page table page[1], when a non-present entry is encountered.
> >
> > Considering ARM64 specific cont-pte/pmd size HugeTLB, this patch implemented
> > an ARM64 specific hugetlb_mask_last_hp() to help this case.
> >
> > [1] https://lore.kernel.org/linux-mm/[email protected]/
> >
> > Signed-off-by: Baolin Wang <[email protected]>
> > ---
> > Note: this patch is based on the series: "hugetlb: speed up linear
> > address scanning" from Mike. Mike, please fold it into your series.
> > Thanks.
> > ---
> > arch/arm64/mm/hugetlbpage.c | 20 ++++++++++++++++++++
> > 1 file changed, 20 insertions(+)
> >
> > diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
> > index e2a5ec9..958935c 100644
> > --- a/arch/arm64/mm/hugetlbpage.c
> > +++ b/arch/arm64/mm/hugetlbpage.c
> > @@ -368,6 +368,26 @@ pte_t *huge_pte_offset(struct mm_struct *mm,
> > return NULL;
> > }
> >
> > +unsigned long hugetlb_mask_last_hp(struct hstate *h)
> > +{
> > + unsigned long hp_size = huge_page_size(h);
>
> hp_size may not be a good name, it reminds me of hotplug. I would name
> it hpage_size even though a little more characters are added.
>

How about just hugetlb_mask_last_page? Since the routine is prefixed
with 'hugetlb' and we are passing in a pointer to a hstate, I think there
is enough context to know we are talking about a huge page mask as
opposed to a base page mask.

If OK, I will change the name in my patches and here.
--
Mike Kravetz

2022-06-17 01:22:00

by Baoquan He

[permalink] [raw]
Subject: Re: [PATCH] arm64/hugetlb: Implement arm64 specific hugetlb_mask_last_hp

On 06/16/22 at 10:35am, Mike Kravetz wrote:
> On 06/16/22 20:05, Baoquan He wrote:
> > On 06/16/22 at 11:34am, Baolin Wang wrote:
> > > The HugeTLB address ranges are linearly scanned during fork, unmap and
> > > remap operations, and the linear scan can skip to the end of range mapped
> > > by the page table page if hitting a non-present entry, which can help
> > > to speed linear scanning of the HugeTLB address ranges.
> > >
> > > So hugetlb_mask_last_hp() is introduced to help to update the address in
> > > the loop of HugeTLB linear scanning with getting the last huge page mapped
> > > by the associated page table page[1], when a non-present entry is encountered.
> > >
> > > Considering ARM64 specific cont-pte/pmd size HugeTLB, this patch implemented
> > > an ARM64 specific hugetlb_mask_last_hp() to help this case.
> > >
> > > [1] https://lore.kernel.org/linux-mm/[email protected]/
> > >
> > > Signed-off-by: Baolin Wang <[email protected]>
> > > ---
> > > Note: this patch is based on the series: "hugetlb: speed up linear
> > > address scanning" from Mike. Mike, please fold it into your series.
> > > Thanks.
> > > ---
> > > arch/arm64/mm/hugetlbpage.c | 20 ++++++++++++++++++++
> > > 1 file changed, 20 insertions(+)
> > >
> > > diff --git a/arch/arm64/mm/hugetlbpage.c b/arch/arm64/mm/hugetlbpage.c
> > > index e2a5ec9..958935c 100644
> > > --- a/arch/arm64/mm/hugetlbpage.c
> > > +++ b/arch/arm64/mm/hugetlbpage.c
> > > @@ -368,6 +368,26 @@ pte_t *huge_pte_offset(struct mm_struct *mm,
> > > return NULL;
> > > }
> > >
> > > +unsigned long hugetlb_mask_last_hp(struct hstate *h)
> > > +{
> > > + unsigned long hp_size = huge_page_size(h);
> >
> > hp_size may not be a good name, it reminds me of hotplug. I would name
> > it hpage_size even though a little more characters are added.
> >
>
> How about just hugetlb_mask_last_page? Since the routine is prefixed
> with 'hugetlb' and we are passing in a pointer to a hstate, I think there
> is enough context to know we are talking about a huge page mask as
> opposed to a base page mask.

Agree, hugetlb_mask_last_page looks good to me regarding the function name,
thx.

2022-06-17 16:49:56

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH] arm64/hugetlb: Implement arm64 specific hugetlb_mask_last_hp

Hi Baolin,

I love your patch! Perhaps something to improve:

[auto build test WARNING on arm64/for-next/core]
[also build test WARNING on linus/master v5.19-rc2 next-20220617]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url: https://github.com/intel-lab-lkp/linux/commits/Baolin-Wang/arm64-hugetlb-Implement-arm64-specific-hugetlb_mask_last_hp/20220616-113640
base: https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/core
config: arm64-randconfig-r011-20220616 (https://download.01.org/0day-ci/archive/20220617/[email protected]/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project f0e608de27b3d568000046eebf3712ab542979d6)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm64 cross compiling tool for clang build
# apt-get install binutils-aarch64-linux-gnu
# https://github.com/intel-lab-lkp/linux/commit/f1309dfbc2b70ec5dd72ac38e95a49b7be42b9b6
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Baolin-Wang/arm64-hugetlb-Implement-arm64-specific-hugetlb_mask_last_hp/20220616-113640
git checkout f1309dfbc2b70ec5dd72ac38e95a49b7be42b9b6
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash arch/arm64/mm/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <[email protected]>

All warnings (new ones prefixed by >>):

>> arch/arm64/mm/hugetlbpage.c:371:15: warning: no previous prototype for function 'hugetlb_mask_last_hp' [-Wmissing-prototypes]
unsigned long hugetlb_mask_last_hp(struct hstate *h)
^
arch/arm64/mm/hugetlbpage.c:371:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
unsigned long hugetlb_mask_last_hp(struct hstate *h)
^
static
1 warning generated.


vim +/hugetlb_mask_last_hp +371 arch/arm64/mm/hugetlbpage.c

370
> 371 unsigned long hugetlb_mask_last_hp(struct hstate *h)
372 {
373 unsigned long hp_size = huge_page_size(h);
374
375 switch (hp_size) {
376 case PUD_SIZE:
377 return PGDIR_SIZE - PUD_SIZE;
378 case CONT_PMD_SIZE:
379 return PUD_SIZE - CONT_PMD_SIZE;
380 case PMD_SIZE:
381 return PUD_SIZE - PMD_SIZE;
382 case CONT_PTE_SIZE:
383 return PMD_SIZE - CONT_PTE_SIZE;
384 default:
385 break;
386 }
387
388 return ~0UL;
389 }
390

--
0-DAY CI Kernel Test Service
https://01.org/lkp

2022-06-18 03:48:58

by Baolin Wang

[permalink] [raw]
Subject: Re: [PATCH] arm64/hugetlb: Implement arm64 specific hugetlb_mask_last_hp

Hi,

On 6/17/2022 8:17 PM, kernel test robot wrote:
> Hi Baolin,
>
> I love your patch! Perhaps something to improve:
>
> [auto build test WARNING on arm64/for-next/core]
> [also build test WARNING on linus/master v5.19-rc2 next-20220617]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Baolin-Wang/arm64-hugetlb-Implement-arm64-specific-hugetlb_mask_last_hp/20220616-113640
> base: https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git for-next/core
> config: arm64-randconfig-r011-20220616 (https://download.01.org/0day-ci/archive/20220617/[email protected]/config)
> compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project f0e608de27b3d568000046eebf3712ab542979d6)
> reproduce (this is a W=1 build):
> wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> chmod +x ~/bin/make.cross
> # install arm64 cross compiling tool for clang build
> # apt-get install binutils-aarch64-linux-gnu
> # https://github.com/intel-lab-lkp/linux/commit/f1309dfbc2b70ec5dd72ac38e95a49b7be42b9b6
> git remote add linux-review https://github.com/intel-lab-lkp/linux
> git fetch --no-tags linux-review Baolin-Wang/arm64-hugetlb-Implement-arm64-specific-hugetlb_mask_last_hp/20220616-113640
> git checkout f1309dfbc2b70ec5dd72ac38e95a49b7be42b9b6
> # save the config file
> mkdir build_dir && cp config build_dir/.config
> COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash arch/arm64/mm/
>
> If you fix the issue, kindly add following tag where applicable
> Reported-by: kernel test robot <[email protected]>

Thanks for your reporting. However this patch is based on the Mike's
series [1] and has been folded into this series. So just skip testing
this patch separately. Thanks.

https://lore.kernel.org/all/[email protected]/