aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorJoao Martins <joao.m.martins@oracle.com>2021-02-24 12:07:16 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2021-02-24 13:38:32 -0800
commit82e5d378b0e4736899e7f8f9f0f03138228f9a45 (patch)
tree98f1d6a3af5f5e76c0dab3ff5eee81e67eb03028 /include/linux
parentmm/hugetlb: grab head page refcount once for group of subpages (diff)
downloadlinux-dev-82e5d378b0e4736899e7f8f9f0f03138228f9a45.tar.xz
linux-dev-82e5d378b0e4736899e7f8f9f0f03138228f9a45.zip
mm/hugetlb: refactor subpage recording
For a given hugepage backing a VA, there's a rather ineficient loop which is solely responsible for storing subpages in GUP @pages/@vmas array. For each subpage we check whether it's within range or size of @pages and keep increment @pfn_offset and a couple other variables per subpage iteration. Simplify this logic and minimize the cost of each iteration to just store the output page/vma. Instead of incrementing number of @refs iteratively, we do it through pre-calculation of @refs and only with a tight loop for storing pinned subpages/vmas. Additionally, retain existing behaviour with using mem_map_offset() when recording the subpages for configurations that don't have a contiguous mem_map. pinning consequently improves bringing us close to {pin,get}_user_pages_fast: - 16G with 1G huge page size gup_test -f /mnt/huge/file -m 16384 -r 30 -L -S -n 512 -w PIN_LONGTERM_BENCHMARK: ~12.8k us -> ~5.8k us PIN_FAST_BENCHMARK: ~3.7k us Link: https://lkml.kernel.org/r/20210128182632.24562-3-joao.m.martins@oracle.com Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Reviewed-by: Mike Kravetz <mike.kravetz@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/linux')
0 files changed, 0 insertions, 0 deletions