diff mbox series

arm64/hugetlb: Implement arm64 specific hugetlb_mask_last_hp

Message ID 7256dbe078d7231f45b0f47c2c52a3bd3aa10da7.1655350193.git.baolin.wang@linux.alibaba.com (mailing list archive)
State New, archived
Headers show
Series arm64/hugetlb: Implement arm64 specific hugetlb_mask_last_hp | expand

Commit Message

Baolin Wang June 16, 2022, 3:34 a.m. UTC
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/20220527225849.284839-1-mike.kravetz@oracle.com/

Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
---
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(+)

Comments

kernel test robot June 16, 2022, 8:47 a.m. UTC | #1
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/202206161633.yB7NR9sh-lkp@intel.com/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 <lkp@intel.com>

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
kernel test robot June 16, 2022, 10:50 a.m. UTC | #2
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/202206161848.w1bWqr7O-lkp@intel.com/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 <lkp@intel.com>

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
Baoquan He June 16, 2022, 12:05 p.m. UTC | #3
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/20220527225849.284839-1-mike.kravetz@oracle.com/
> 
> Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
> ---
> 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
> 
>
Mike Kravetz June 16, 2022, 5:35 p.m. UTC | #4
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/20220527225849.284839-1-mike.kravetz@oracle.com/
> > 
> > Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
> > ---
> > 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.
Baoquan He June 17, 2022, 12:53 a.m. UTC | #5
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/20220527225849.284839-1-mike.kravetz@oracle.com/
> > > 
> > > Signed-off-by: Baolin Wang <baolin.wang@linux.alibaba.com>
> > > ---
> > > 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.
kernel test robot June 17, 2022, 12:17 p.m. UTC | #6
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/202206172000.6Fwmo99P-lkp@intel.com/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 <lkp@intel.com>

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
Baolin Wang June 18, 2022, 3:25 a.m. UTC | #7
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/202206172000.6Fwmo99P-lkp@intel.com/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 <lkp@intel.com>

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/20220616210518.125287-1-mike.kravetz@oracle.com/
diff mbox series

Patch

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;