Re: [PATCH v4 03/11] mm/gup: Applies counting method to monitor gup_pgd_range
From: Leonardo Bras <hidden>
Date: 2019-10-01 17:57:06
Also in:
linux-arch, linux-mm, lkml
On Mon, 2019-09-30 at 14:51 -0700, John Hubbard wrote:
On 9/27/19 4:40 PM, Leonardo Bras wrote:quoted
As decribed, gup_pgd_range is a lockless pagetable walk. So, in order to monitor against THP split/collapse with the couting method, it's necessarys/couting/counting/
Thanks, fixed for v5.
quoted
to bound it with {start,end}_lockless_pgtbl_walk. There are dummy functions, so it is not going to add any overhead on archs that don't use this method. Signed-off-by: Leonardo Bras <redacted> --- mm/gup.c | 8 ++++++++ 1 file changed, 8 insertions(+)diff --git a/mm/gup.c b/mm/gup.c index 98f13ab37bac..7105c829cf44 100644 --- a/mm/gup.c +++ b/mm/gup.c@@ -2325,6 +2325,7 @@ static bool gup_fast_permitted(unsigned long start, unsigned long end) int __get_user_pages_fast(unsigned long start, int nr_pages, int write, struct page **pages) { + struct mm_struct *mm;I don't think that this local variable adds any value, so let's not use it. Similar point in a few other patches too.
It avoids 1 deference of current->mm, it's a little performance gain.
quoted
unsigned long len, end; unsigned long flags; int nr = 0;@@ -2352,9 +2353,12 @@ int __get_user_pages_fast(unsigned long start, int nr_pages, int write, if (IS_ENABLED(CONFIG_HAVE_FAST_GUP) && gup_fast_permitted(start, end)) { + mm = current->mm; + start_lockless_pgtbl_walk(mm); local_irq_save(flags); gup_pgd_range(start, end, write ? FOLL_WRITE : 0, pages, &nr); local_irq_restore(flags); + end_lockless_pgtbl_walk(mm); } return nr;@@ -2404,6 +2408,7 @@ int get_user_pages_fast(unsigned long start, int nr_pages, unsigned int gup_flags, struct page **pages) { unsigned long addr, len, end; + struct mm_struct *mm;Same here.quoted
int nr = 0, ret = 0; if (WARN_ON_ONCE(gup_flags & ~(FOLL_WRITE | FOLL_LONGTERM)))@@ -2421,9 +2426,12 @@ int get_user_pages_fast(unsigned long start, int nr_pages, if (IS_ENABLED(CONFIG_HAVE_FAST_GUP) && gup_fast_permitted(start, end)) { + mm = current->mm; + start_lockless_pgtbl_walk(mm);Minor: I'd like to rename this register_lockless_pgtable_walker().quoted
local_irq_disable(); gup_pgd_range(addr, end, gup_flags, pages, &nr); local_irq_enable(); + end_lockless_pgtbl_walk(mm);...and deregister_lockless_pgtable_walker().
I have no problem changing the name, but I don't register/deregister are good terms for this. I would rather use start/finish, begin/end, and so on. Register sounds like something more complicated than what we are trying to achieve here.
thanks,
Thank you!
Attachments
- signature.asc [application/pgp-signature] 833 bytes