Introduce size_to_shift() for future users that need to
obtain shift of a huge-page which is other than pmd_psize().

Suggested-by: David Hildenbrand (Arm) <[email protected]>
Signed-off-by: Yeoreum Yun <[email protected]>
---
 tools/testing/selftests/mm/vm_util.c | 10 +++++++++-
 tools/testing/selftests/mm/vm_util.h |  1 +
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/mm/vm_util.c 
b/tools/testing/selftests/mm/vm_util.c
index fd1432dc6152..1fef1266429f 100644
--- a/tools/testing/selftests/mm/vm_util.c
+++ b/tools/testing/selftests/mm/vm_util.c
@@ -157,6 +157,14 @@ bool check_for_pattern(FILE *fp, const char *pattern, char 
*buf, size_t len)
        return false;
 }
 
+uint64_t size_to_shift(uint64_t size)
+{
+       if (__builtin_popcountll(size) != 1)
+               return 0;
+
+       return ffsl(size) - 1;
+}
+
 uint64_t pmd_psize(void)
 {
        int fd;
@@ -194,7 +202,7 @@ uint64_t pmd_pshift(void)
        if (!__pmd_psize)
                return 0;
 
-       __pmd_pshift = ffsl(__pmd_psize) - 1;
+       __pmd_pshift = size_to_shift(__pmd_psize);
 
        return __pmd_pshift;
 }
diff --git a/tools/testing/selftests/mm/vm_util.h 
b/tools/testing/selftests/mm/vm_util.h
index 71af4804f8f2..0048e0e82770 100644
--- a/tools/testing/selftests/mm/vm_util.h
+++ b/tools/testing/selftests/mm/vm_util.h
@@ -90,6 +90,7 @@ bool pagemap_is_populated(int fd, char *start);
 unsigned long pagemap_get_pfn(int fd, char *start);
 void clear_softdirty(void);
 bool check_for_pattern(FILE *fp, const char *pattern, char *buf, size_t len);
+uint64_t size_to_shift(uint64_t size);
 uint64_t pmd_psize(void);
 uint64_t pmd_pshift(void);
 unsigned long rss_anon(void);

-- 
2.43.0


Reply via email to