On Thu, Aug 03, 2023 at 04:32:07PM +0200, David Hildenbrand wrote:
Let's extend mmap_and_merge_range() to test if anything in the current process was merged. range_maps_duplicates() is too unreliable for that use case, so instead look at KSM stats.
Trigger a complete unmerge first, to cleanup the stable tree and stabilize accounting of merged pages.
Note that we're using /proc/self/ksm_merging_pages instead of /proc/self/ksm_stat, because that one is available in more existing kernels.
If /proc/self/ksm_merging_pages can't be opened, we can't perform any checks and simply skip them.
We have to special-case the shared zeropage for now. But the only user -- test_unmerge_zero_pages() -- performs its own merge checks.
Signed-off-by: David Hildenbrand david@redhat.com
Acked-by: Peter Xu peterx@redhat.com
One nitpick:
.../selftests/mm/ksm_functional_tests.c | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+)
diff --git a/tools/testing/selftests/mm/ksm_functional_tests.c b/tools/testing/selftests/mm/ksm_functional_tests.c index 0de9d33cd565..cb63b600cb4f 100644 --- a/tools/testing/selftests/mm/ksm_functional_tests.c +++ b/tools/testing/selftests/mm/ksm_functional_tests.c @@ -30,6 +30,7 @@ static int ksm_fd; static int ksm_full_scans_fd; static int proc_self_ksm_stat_fd; +static int proc_self_ksm_merging_pages_fd; static int ksm_use_zero_pages_fd; static int pagemap_fd; static size_t pagesize; @@ -88,6 +89,22 @@ static long get_my_ksm_zero_pages(void) return my_ksm_zero_pages; } +static long get_my_merging_pages(void) +{
- char buf[10];
- ssize_t ret;
- if (proc_self_ksm_merging_pages_fd < 0)
return proc_self_ksm_merging_pages_fd;
Better do the fds check all in main(), e.g. not all callers below considers negative values, so -1 can pass "if (get_my_merging_pages())" etc.
- ret = pread(proc_self_ksm_merging_pages_fd, buf, sizeof(buf) - 1, 0);
- if (ret <= 0)
return -errno;
- buf[ret] = 0;
- return strtol(buf, NULL, 10);
+}