Re: [PATCH 10/10] mm/hugetlb: Introduce hugetlb_walk()

Mike Kravetz
2022-12-06T00:23:51Z

On 11/30/22 10:37, Peter Xu wrote:
> On Tue, Nov 29, 2022 at 09:18:08PM -0800, Eric Biggers wrote:
> > On Tue, Nov 29, 2022 at 02:35:26PM -0500, Peter Xu wrote:
> > > +static inline pte_t *
> > > +hugetlb_walk(struct vm_area_struct *vma, unsigned long addr, unsigned long sz)
> > > +{
> > > +#if defined(CONFIG_ARCH_WANT_HUGE_PMD_SHARE) && defined(CONFIG_LOCKDEP)
> > > + struct hugetlb_vma_lock *vma_lock = vma->vm_private_data;
> > > +
> > > + /*
> > > + * If pmd sharing possible, locking needed to safely walk the
> > > + * hugetlb pgtables. More information can be found at the comment
> > > + * above huge_pte_offset() in the same file.
> > > + *
> > > + * NOTE: lockdep_is_held() is only defined with CONFIG_LOCKDEP.
> > > + */
> > > + if (__vma_shareable_flags_pmd(vma))
> > > + WARN_ON_ONCE(!lockdep_is_held(&vma_lock->rw_sema) &&
> > > + !lockdep_is_held(
> > > + &vma->vm_file->f_mapping->i_mmap_rwsem));
> > > +#endif
> >
> > FYI, in next-20221130 there is a compile error here due to this commit:
> >
> > In file included from security/commoncap.c:19:
> > ./include/linux/hugetlb.h:1262:42: error: incomplete definition of type 'struct hugetlb_vma_lock'
> > WARN_ON_ONCE(!lockdep_is_held(&vma_lock->rw_sema) &&
> > ~~~~~~~~^
> > ./include/linux/lockdep.h:286:47: note: expanded from macro 'lockdep_is_held'
> > #define lockdep_is_held(lock) lock_is_held(&(lock)->dep_map)
> > ^~~~
>
> This probably means the config has:
>
> CONFIG_HUGETLB_PAGE=n
> CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
>
> And I'm surprised we didn't have a dependency that ARCH_WANT_HUGE_PMD_SHARE
> should depend on HUGETLB_PAGE already. Mike, what do you think?

Yes, ARCH_WANT_HUGE_PMD_SHARE should probably depend on HUGETLB_PAGE as it
makes no sense without it. There is also ARCH_WANT_GENERAL_HUGETLB that
seems to fall into the same category.

>
> I've also attached a quick fix for this patch to be squashed in. Hope it
> works.

Let's go with this quick fix for now since the only issue is in the new code
and spend more time on config dependencies later.

For the original patch and the quick fix,

Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com>
--
Mike Kravetz

>
> Thanks,
>
> --
> Peter Xu

> From 9787a7f5492ca251fcce5c09bd7e4a80ac157726 Mon Sep 17 00:00:00 2001
> From: Peter Xu <peterx@redhat.com>
> Date: Wed, 30 Nov 2022 10:33:44 -0500
> Subject: [PATCH] fixup! mm/hugetlb: Introduce hugetlb_walk()
> Content-type: text/plain
>
> Signed-off-by: Peter Xu <peterx@redhat.com>
> ---
> include/linux/hugetlb.h | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
> index 1a51c45fdf2e..ec2a1f93b12d 100644
> --- a/include/linux/hugetlb.h
> +++ b/include/linux/hugetlb.h
> @@ -1248,7 +1248,8 @@ __vma_shareable_flags_pmd(struct vm_area_struct *vma)
> static inline pte_t *
> hugetlb_walk(struct vm_area_struct *vma, unsigned long addr, unsigned long sz)
> {
> -#if defined(CONFIG_ARCH_WANT_HUGE_PMD_SHARE) && defined(CONFIG_LOCKDEP)
> +#if defined(CONFIG_HUGETLB_PAGE) && \
> + defined(CONFIG_ARCH_WANT_HUGE_PMD_SHARE) && defined(CONFIG_LOCKDEP)
> struct hugetlb_vma_lock *vma_lock = vma->vm_private_data;
>
> /*
> --
> 2.37.3
>