From: Usama Arif <usamaarif642@gmail.com>
To: akpm@linux-foundation.org, linux-mm@kvack.org
Cc: hannes@cmpxchg.org, riel@surriel.com, shakeel.butt@linux.dev,
roman.gushchin@linux.dev, yuzhao@google.com, david@redhat.com,
baohua@kernel.org, ryan.roberts@arm.com, rppt@kernel.org,
willy@infradead.org, cerasuolodomenico@gmail.com,
ryncsn@gmail.com, corbet@lwn.net, linux-kernel@vger.kernel.org,
linux-doc@vger.kernel.org, kernel-team@meta.com,
Alexander Zhu <alexlzhu@fb.com>
Subject: Re: [PATCH v4 3/6] mm: selftest to verify zero-filled pages are mapped to zeropage
Date: Wed, 21 Aug 2024 15:09:02 -0400 [thread overview]
Message-ID: <340d86df-94ce-4db8-8628-f75e4352bea2@gmail.com> (raw)
In-Reply-To: <20240819023145.2415299-4-usamaarif642@gmail.com>
On 18/08/2024 22:30, Usama Arif wrote:
> From: Alexander Zhu <alexlzhu@fb.com>
>
> When a THP is split, any subpage that is zero-filled will be mapped
> to the shared zeropage, hence saving memory. Add selftest to verify
> this by allocating zero-filled THP and comparing RssAnon before and
> after split.
>
> Signed-off-by: Alexander Zhu <alexlzhu@fb.com>
> Acked-by: Rik van Riel <riel@surriel.com>
> Signed-off-by: Usama Arif <usamaarif642@gmail.com>
> ---
> .../selftests/mm/split_huge_page_test.c | 71 +++++++++++++++++++
> tools/testing/selftests/mm/vm_util.c | 22 ++++++
> tools/testing/selftests/mm/vm_util.h | 1 +
> 3 files changed, 94 insertions(+)
>
> diff --git a/tools/testing/selftests/mm/split_huge_page_test.c b/tools/testing/selftests/mm/split_huge_page_test.c
> index e5e8dafc9d94..eb6d1b9fc362 100644
> --- a/tools/testing/selftests/mm/split_huge_page_test.c
> +++ b/tools/testing/selftests/mm/split_huge_page_test.c
> @@ -84,6 +84,76 @@ static void write_debugfs(const char *fmt, ...)
> write_file(SPLIT_DEBUGFS, input, ret + 1);
> }
>
> +static char *allocate_zero_filled_hugepage(size_t len)
> +{
> + char *result;
> + size_t i;
> +
> + result = memalign(pmd_pagesize, len);
> + if (!result) {
> + printf("Fail to allocate memory\n");
> + exit(EXIT_FAILURE);
> + }
> +
> + madvise(result, len, MADV_HUGEPAGE);
> +
> + for (i = 0; i < len; i++)
> + result[i] = (char)0;
> +
> + return result;
> +}
> +
> +static void verify_rss_anon_split_huge_page_all_zeroes(char *one_page, int nr_hpages, size_t len)
> +{
> + unsigned long rss_anon_before, rss_anon_after;
> + size_t i;
> +
> + if (!check_huge_anon(one_page, 4, pmd_pagesize)) {
> + printf("No THP is allocated\n");
> + exit(EXIT_FAILURE);
> + }
> +
> + rss_anon_before = rss_anon();
> + if (!rss_anon_before) {
> + printf("No RssAnon is allocated before split\n");
> + exit(EXIT_FAILURE);
> + }
> +
> + /* split all THPs */
> + write_debugfs(PID_FMT, getpid(), (uint64_t)one_page,
> + (uint64_t)one_page + len, 0);
> +
> + for (i = 0; i < len; i++)
> + if (one_page[i] != (char)0) {
> + printf("%ld byte corrupted\n", i);
> + exit(EXIT_FAILURE);
> + }
> +
> + if (!check_huge_anon(one_page, 0, pmd_pagesize)) {
> + printf("Still AnonHugePages not split\n");
> + exit(EXIT_FAILURE);
> + }
> +
> + rss_anon_after = rss_anon();
> + if (rss_anon_after >= rss_anon_before) {
> + printf("Incorrect RssAnon value. Before: %ld After: %ld\n",
> + rss_anon_before, rss_anon_after);
> + exit(EXIT_FAILURE);
> + }
> +}
> +
> +void split_pmd_zero_pages(void)
> +{
> + char *one_page;
> + int nr_hpages = 4;
> + size_t len = nr_hpages * pmd_pagesize;
> +
> + one_page = allocate_zero_filled_hugepage(len);
> + verify_rss_anon_split_huge_page_all_zeroes(one_page, nr_hpages, len);
> + printf("Split zero filled huge pages successful\n");
> + free(one_page);
> +}
> +
> void split_pmd_thp(void)
> {
> char *one_page;
> @@ -431,6 +501,7 @@ int main(int argc, char **argv)
>
> fd_size = 2 * pmd_pagesize;
>
> + split_pmd_zero_pages();
> split_pmd_thp();
> split_pte_mapped_thp();
> split_file_backed_thp();
> diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c
> index 5a62530da3b5..d8d0cf04bb57 100644
> --- a/tools/testing/selftests/mm/vm_util.c
> +++ b/tools/testing/selftests/mm/vm_util.c
> @@ -12,6 +12,7 @@
>
> #define PMD_SIZE_FILE_PATH "/sys/kernel/mm/transparent_hugepage/hpage_pmd_size"
> #define SMAP_FILE_PATH "/proc/self/smaps"
> +#define STATUS_FILE_PATH "/proc/self/status"
> #define MAX_LINE_LENGTH 500
>
> unsigned int __page_size;
> @@ -171,6 +172,27 @@ uint64_t read_pmd_pagesize(void)
> return strtoul(buf, NULL, 10);
> }
>
> +unsigned long rss_anon(void)
> +{
> + unsigned long rss_anon = 0;
> + FILE *fp;
> + char buffer[MAX_LINE_LENGTH];
> +
> + fp = fopen(STATUS_FILE_PATH, "r");
> + if (!fp)
> + ksft_exit_fail_msg("%s: Failed to open file %s\n", __func__, STATUS_FILE_PATH);
> +
> + if (!check_for_pattern(fp, "RssAnon:", buffer, sizeof(buffer)))
> + goto err_out;
> +
> + if (sscanf(buffer, "RssAnon:%10lu kB", &rss_anon) != 1)
> + ksft_exit_fail_msg("Reading status error\n");
> +
> +err_out:
> + fclose(fp);
> + return rss_anon;
> +}
> +
> bool __check_huge(void *addr, char *pattern, int nr_hpages,
> uint64_t hpage_size)
> {
> diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h
> index 9007c420d52c..71b75429f4a5 100644
> --- a/tools/testing/selftests/mm/vm_util.h
> +++ b/tools/testing/selftests/mm/vm_util.h
> @@ -39,6 +39,7 @@ 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 read_pmd_pagesize(void);
> +uint64_t rss_anon(void);
> bool check_huge_anon(void *addr, int nr_hpages, uint64_t hpage_size);
> bool check_huge_file(void *addr, int nr_hpages, uint64_t hpage_size);
> bool check_huge_shmem(void *addr, int nr_hpages, uint64_t hpage_size);
Need below fixlet as well
From 2476b7a46908c801ab446f41566f4af52b939ac7 Mon Sep 17 00:00:00 2001
From: Usama Arif <usamaarif642@gmail.com>
Date: Wed, 21 Aug 2024 20:06:53 +0100
Subject: [PATCH] mm: selftest to verify zero-filled pages are mapped to
zeropage fix
change uint64_t to unsigned long for rss_anon
Signed-off-by: Usama Arif <usamaarif642@gmail.com>
---
tools/testing/selftests/mm/vm_util.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/testing/selftests/mm/vm_util.h b/tools/testing/selftests/mm/vm_util.h
index 71b75429f4a5..2eaed8209925 100644
--- a/tools/testing/selftests/mm/vm_util.h
+++ b/tools/testing/selftests/mm/vm_util.h
@@ -39,7 +39,7 @@ 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 read_pmd_pagesize(void);
-uint64_t rss_anon(void);
+unsigned long rss_anon(void);
bool check_huge_anon(void *addr, int nr_hpages, uint64_t hpage_size);
bool check_huge_file(void *addr, int nr_hpages, uint64_t hpage_size);
bool check_huge_shmem(void *addr, int nr_hpages, uint64_t hpage_size);
--
2.43.5
next prev parent reply other threads:[~2024-08-21 19:09 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-08-19 2:30 [PATCH v4 0/6] mm: split underused THPs Usama Arif
2024-08-19 2:30 ` [PATCH v4 1/6] mm: free zapped tail pages when splitting isolated thp Usama Arif
2024-08-19 2:30 ` [PATCH v4 2/6] mm: remap unused subpages to shared zeropage " Usama Arif
2024-08-19 2:30 ` [PATCH v4 3/6] mm: selftest to verify zero-filled pages are mapped to zeropage Usama Arif
2024-08-21 19:09 ` Usama Arif [this message]
2024-08-23 4:01 ` kernel test robot
2024-08-19 2:30 ` [PATCH v4 4/6] mm: Introduce a pageflag for partially mapped folios Usama Arif
2024-08-19 8:29 ` Barry Song
2024-08-19 8:30 ` Barry Song
2024-08-19 14:17 ` Usama Arif
2024-08-19 19:00 ` Barry Song
2024-08-19 20:16 ` Usama Arif
2024-08-19 21:34 ` Barry Song
2024-08-19 21:55 ` Barry Song
2024-08-20 19:35 ` Usama Arif
2024-08-20 21:30 ` Barry Song
2024-08-21 19:04 ` Usama Arif
2024-08-21 21:25 ` Barry Song
2024-09-01 12:48 ` Bang Li
2024-09-02 10:09 ` Usama Arif
2024-08-19 2:30 ` [PATCH v4 5/6] mm: split underused THPs Usama Arif
2024-08-19 2:30 ` [PATCH v4 6/6] mm: add sysfs entry to disable splitting " Usama Arif
-- strict thread matches above, loose matches on Subject: below --
2024-08-21 7:09 [PATCH v4 3/6] mm: selftest to verify zero-filled pages are mapped to zeropage kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=340d86df-94ce-4db8-8628-f75e4352bea2@gmail.com \
--to=usamaarif642@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=alexlzhu@fb.com \
--cc=baohua@kernel.org \
--cc=cerasuolodomenico@gmail.com \
--cc=corbet@lwn.net \
--cc=david@redhat.com \
--cc=hannes@cmpxchg.org \
--cc=kernel-team@meta.com \
--cc=linux-doc@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=riel@surriel.com \
--cc=roman.gushchin@linux.dev \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=ryncsn@gmail.com \
--cc=shakeel.butt@linux.dev \
--cc=willy@infradead.org \
--cc=yuzhao@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.