Message ID | 1563724685-6540-3-git-send-email-linux.bhar@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | sgi-gru: get_user_page changes | expand |
On 7/21/19 8:58 AM, Bharath Vedartham wrote: > is_vm_hugetlb_page has checks for whether CONFIG_HUGETLB_PAGE is defined > or not. If CONFIG_HUGETLB_PAGE is not defined is_vm_hugetlb_page will > always return false. There is no need to have an uneccessary > CONFIG_HUGETLB_PAGE check in the code. > > Cc: Ira Weiny <ira.weiny@intel.com> > Cc: John Hubbard <jhubbard@nvidia.com> > Cc: Jérôme Glisse <jglisse@redhat.com> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Cc: Dimitri Sivanich <sivanich@sgi.com> > Cc: Arnd Bergmann <arnd@arndb.de> > Cc: linux-kernel@vger.kernel.org > Cc: linux-mm@kvack.org > Signed-off-by: Bharath Vedartham <linux.bhar@gmail.com> > --- > drivers/misc/sgi-gru/grufault.c | 11 +++-------- > 1 file changed, 3 insertions(+), 8 deletions(-) > > diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c > index 61b3447..75108d2 100644 > --- a/drivers/misc/sgi-gru/grufault.c > +++ b/drivers/misc/sgi-gru/grufault.c > @@ -180,11 +180,8 @@ static int non_atomic_pte_lookup(struct vm_area_struct *vma, > { > struct page *page; > > -#ifdef CONFIG_HUGETLB_PAGE > *pageshift = is_vm_hugetlb_page(vma) ? HPAGE_SHIFT : PAGE_SHIFT; > -#else > - *pageshift = PAGE_SHIFT; > -#endif > + > if (get_user_pages(vaddr, 1, write ? FOLL_WRITE : 0, &page, NULL) <= 0) > return -EFAULT; > *paddr = page_to_phys(page); > @@ -238,11 +235,9 @@ static int atomic_pte_lookup(struct vm_area_struct *vma, unsigned long vaddr, > return 1; > > *paddr = pte_pfn(pte) << PAGE_SHIFT; > -#ifdef CONFIG_HUGETLB_PAGE > + > *pageshift = is_vm_hugetlb_page(vma) ? HPAGE_SHIFT : PAGE_SHIFT; > -#else > - *pageshift = PAGE_SHIFT; > -#endif > + > return 0; > > err: > Looks like an accurate cleanup to me. Reviewed-by: John Hubbard <jhubbard@nvidia.com> thanks,
I suspect I'm being massively pedantic here, but the comments for atomic_pte_lookup() note: * Only supports Intel large pages (2MB only) on x86_64. * ZZZ - hugepage support is incomplete That makes me wonder how many systems using this hardware are actually configured with CONFIG_HUGETLB_PAGE. I ask as in the most common case, this is likely introducing a few extra instructions and possibly an additional branch to a routine that is called per-fault. So the nit-picky questions are: 1) Does the code really need to be cleaned up in this way? 2) If it does, does it make more sense (given the way pmd_large() is handled now in atomic_pte_lookup()) for this to be coded as: if (unlikely(is_vm_hugetlb_page(vma))) *pageshift = HPAGE_SHIFT; else *pageshift = PAGE_SHIFT; In all likelihood, these questions are no-ops, and the optimizer may even make my questions completely moot, but I thought I might as well ask anyway. > On Jul 21, 2019, at 9:58 AM, Bharath Vedartham <linux.bhar@gmail.com> wrote: > > is_vm_hugetlb_page has checks for whether CONFIG_HUGETLB_PAGE is defined > or not. If CONFIG_HUGETLB_PAGE is not defined is_vm_hugetlb_page will > always return false. There is no need to have an uneccessary > CONFIG_HUGETLB_PAGE check in the code. > > Cc: Ira Weiny <ira.weiny@intel.com> > Cc: John Hubbard <jhubbard@nvidia.com> > Cc: Jérôme Glisse <jglisse@redhat.com> > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > Cc: Dimitri Sivanich <sivanich@sgi.com> > Cc: Arnd Bergmann <arnd@arndb.de> > Cc: linux-kernel@vger.kernel.org > Cc: linux-mm@kvack.org > Signed-off-by: Bharath Vedartham <linux.bhar@gmail.com> > --- > drivers/misc/sgi-gru/grufault.c | 11 +++-------- > 1 file changed, 3 insertions(+), 8 deletions(-) > > diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c > index 61b3447..75108d2 100644 > --- a/drivers/misc/sgi-gru/grufault.c > +++ b/drivers/misc/sgi-gru/grufault.c > @@ -180,11 +180,8 @@ static int non_atomic_pte_lookup(struct vm_area_struct *vma, > { > struct page *page; > > -#ifdef CONFIG_HUGETLB_PAGE > *pageshift = is_vm_hugetlb_page(vma) ? HPAGE_SHIFT : PAGE_SHIFT; > -#else > - *pageshift = PAGE_SHIFT; > -#endif > + > if (get_user_pages(vaddr, 1, write ? FOLL_WRITE : 0, &page, NULL) <= 0) > return -EFAULT; > *paddr = page_to_phys(page); > @@ -238,11 +235,9 @@ static int atomic_pte_lookup(struct vm_area_struct *vma, unsigned long vaddr, > return 1; > > *paddr = pte_pfn(pte) << PAGE_SHIFT; > -#ifdef CONFIG_HUGETLB_PAGE > + > *pageshift = is_vm_hugetlb_page(vma) ? HPAGE_SHIFT : PAGE_SHIFT; > -#else > - *pageshift = PAGE_SHIFT; > -#endif > + > return 0; > > err: > -- > 2.7.4 >
On Sun, Jul 21, 2019 at 09:20:38PM -0600, William Kucharski wrote: > I suspect I'm being massively pedantic here, but the comments for atomic_pte_lookup() note: > > * Only supports Intel large pages (2MB only) on x86_64. > * ZZZ - hugepage support is incomplete > > That makes me wonder how many systems using this hardware are actually configured with CONFIG_HUGETLB_PAGE. > > I ask as in the most common case, this is likely introducing a few extra instructions and possibly an additional branch to a routine that is called per-fault. > > So the nit-picky questions are: > > 1) Does the code really need to be cleaned up in this way? > > 2) If it does, does it make more sense (given the way pmd_large() is handled now in atomic_pte_lookup()) for this to be coded as: > > if (unlikely(is_vm_hugetlb_page(vma))) > *pageshift = HPAGE_SHIFT; > else > *pageshift = PAGE_SHIFT; > > In all likelihood, these questions are no-ops, and the optimizer may even make my questions completely moot, but I thought I might as well ask anyway. > That sounds reasonable. I am not really sure as to how much of an improvement it would be, the condition will be evaluated eitherways AFAIK? Eitherways, the ternary operator does not look good. I ll make a version 2 of this. > > On Jul 21, 2019, at 9:58 AM, Bharath Vedartham <linux.bhar@gmail.com> wrote: > > > > is_vm_hugetlb_page has checks for whether CONFIG_HUGETLB_PAGE is defined > > or not. If CONFIG_HUGETLB_PAGE is not defined is_vm_hugetlb_page will > > always return false. There is no need to have an uneccessary > > CONFIG_HUGETLB_PAGE check in the code. > > > > Cc: Ira Weiny <ira.weiny@intel.com> > > Cc: John Hubbard <jhubbard@nvidia.com> > > Cc: Jérôme Glisse <jglisse@redhat.com> > > Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> > > Cc: Dimitri Sivanich <sivanich@sgi.com> > > Cc: Arnd Bergmann <arnd@arndb.de> > > Cc: linux-kernel@vger.kernel.org > > Cc: linux-mm@kvack.org > > Signed-off-by: Bharath Vedartham <linux.bhar@gmail.com> > > --- > > drivers/misc/sgi-gru/grufault.c | 11 +++-------- > > 1 file changed, 3 insertions(+), 8 deletions(-) > > > > diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c > > index 61b3447..75108d2 100644 > > --- a/drivers/misc/sgi-gru/grufault.c > > +++ b/drivers/misc/sgi-gru/grufault.c > > @@ -180,11 +180,8 @@ static int non_atomic_pte_lookup(struct vm_area_struct *vma, > > { > > struct page *page; > > > > -#ifdef CONFIG_HUGETLB_PAGE > > *pageshift = is_vm_hugetlb_page(vma) ? HPAGE_SHIFT : PAGE_SHIFT; > > -#else > > - *pageshift = PAGE_SHIFT; > > -#endif > > + > > if (get_user_pages(vaddr, 1, write ? FOLL_WRITE : 0, &page, NULL) <= 0) > > return -EFAULT; > > *paddr = page_to_phys(page); > > @@ -238,11 +235,9 @@ static int atomic_pte_lookup(struct vm_area_struct *vma, unsigned long vaddr, > > return 1; > > > > *paddr = pte_pfn(pte) << PAGE_SHIFT; > > -#ifdef CONFIG_HUGETLB_PAGE > > + > > *pageshift = is_vm_hugetlb_page(vma) ? HPAGE_SHIFT : PAGE_SHIFT; > > -#else > > - *pageshift = PAGE_SHIFT; > > -#endif > > + > > return 0; > > > > err: > > -- > > 2.7.4 > > >
> On Jul 22, 2019, at 11:50 AM, Bharath Vedartham <linux.bhar@gmail.com> wrote: > >> >> >> In all likelihood, these questions are no-ops, and the optimizer may even make my questions completely moot, but I thought I might as well ask anyway. >> > That sounds reasonable. I am not really sure as to how much of > an improvement it would be, the condition will be evaluated eitherways > AFAIK? Eitherways, the ternary operator does not look good. I ll make a > version 2 of this. In THEORY the "unlikely" hints to the compiler that that leg of the "if" can be made the branch and jump leg, though in reality optimization is much more complex than that. Still, the unlikely() call is also nicely self-documenting as to what the expected outcome is. Reviewed-by: William Kucharski <william.kucharski@oracle.com>
diff --git a/drivers/misc/sgi-gru/grufault.c b/drivers/misc/sgi-gru/grufault.c index 61b3447..75108d2 100644 --- a/drivers/misc/sgi-gru/grufault.c +++ b/drivers/misc/sgi-gru/grufault.c @@ -180,11 +180,8 @@ static int non_atomic_pte_lookup(struct vm_area_struct *vma, { struct page *page; -#ifdef CONFIG_HUGETLB_PAGE *pageshift = is_vm_hugetlb_page(vma) ? HPAGE_SHIFT : PAGE_SHIFT; -#else - *pageshift = PAGE_SHIFT; -#endif + if (get_user_pages(vaddr, 1, write ? FOLL_WRITE : 0, &page, NULL) <= 0) return -EFAULT; *paddr = page_to_phys(page); @@ -238,11 +235,9 @@ static int atomic_pte_lookup(struct vm_area_struct *vma, unsigned long vaddr, return 1; *paddr = pte_pfn(pte) << PAGE_SHIFT; -#ifdef CONFIG_HUGETLB_PAGE + *pageshift = is_vm_hugetlb_page(vma) ? HPAGE_SHIFT : PAGE_SHIFT; -#else - *pageshift = PAGE_SHIFT; -#endif + return 0; err:
is_vm_hugetlb_page has checks for whether CONFIG_HUGETLB_PAGE is defined or not. If CONFIG_HUGETLB_PAGE is not defined is_vm_hugetlb_page will always return false. There is no need to have an uneccessary CONFIG_HUGETLB_PAGE check in the code. Cc: Ira Weiny <ira.weiny@intel.com> Cc: John Hubbard <jhubbard@nvidia.com> Cc: Jérôme Glisse <jglisse@redhat.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Dimitri Sivanich <sivanich@sgi.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: linux-kernel@vger.kernel.org Cc: linux-mm@kvack.org Signed-off-by: Bharath Vedartham <linux.bhar@gmail.com> --- drivers/misc/sgi-gru/grufault.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-)