From: Stefan Roesch <shr@devkernel.io>
To: linux-mm@kvack.org
Cc: shr@devkernel.io, linux-doc@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-kselftest@vger.kernel.org,
linux-trace-kernel@vger.kernel.org
Subject: [RESEND RFC PATCH v1 19/20] selftests/vm: add KSM fork test
Date: Mon, 23 Jan 2023 09:37:47 -0800 [thread overview]
Message-ID: <20230123173748.1734238-20-shr@devkernel.io> (raw)
In-Reply-To: <20230123173748.1734238-1-shr@devkernel.io>
Add fork test to verify that the MMF_VM_MERGE_ANY flag is inherited by
the child process.
Signed-off-by: Stefan Roesch <shr@devkernel.io>
---
tools/testing/selftests/vm/ksm_tests.c | 53 +++++++++++++++++++++++++-
1 file changed, 51 insertions(+), 2 deletions(-)
diff --git a/tools/testing/selftests/vm/ksm_tests.c b/tools/testing/selftests/vm/ksm_tests.c
index 9667cb3b8c6a..a0a48ac43b29 100644
--- a/tools/testing/selftests/vm/ksm_tests.c
+++ b/tools/testing/selftests/vm/ksm_tests.c
@@ -44,6 +44,7 @@ enum ksm_merge_type {
enum ksm_test_name {
CHECK_KSM_MERGE,
+ CHECK_KSM_MERGE_FORK,
CHECK_KSM_UNMERGE,
CHECK_KSM_GET_MERGE_TYPE,
CHECK_KSM_ZERO_PAGE_MERGE,
@@ -126,7 +127,8 @@ static void print_help(void)
" For this test, the size of duplicated memory area (in MiB)\n"
" must be provided using -s option\n"
" -C evaluate the time required to break COW of merged pages.\n"
- " -G query merge mode\n\n");
+ " -G query merge mode\n"
+ " -F evaluate that the KSM process flag is inherited\n\n");
printf(" -a: specify the access protections of pages.\n"
" <prot> must be of the form [rwx].\n"
@@ -325,6 +327,47 @@ static int check_ksm_merge(int merge_type, int mapping, int prot,
return KSFT_FAIL;
}
+/* Verify that prctl ksm flag is inherited. */
+static int check_ksm_fork(void)
+{
+ int rc = KSFT_FAIL;
+ pid_t child_pid;
+
+ if (prctl(PR_SET_MEMORY_MERGE, 1)) {
+ perror("prctl");
+ return KSFT_FAIL;
+ }
+
+ child_pid = fork();
+ if (child_pid == 0) {
+ int is_on = prctl(PR_GET_MEMORY_MERGE, 0);
+
+ if (!is_on)
+ exit(KSFT_FAIL);
+
+ exit(KSFT_PASS);
+ }
+
+ if (child_pid < 0)
+ goto out;
+
+ if (waitpid(child_pid, &rc, 0) < 0)
+ rc = KSFT_FAIL;
+
+ if (prctl(PR_SET_MEMORY_MERGE, 0)) {
+ perror("prctl");
+ rc = KSFT_FAIL;
+ }
+
+out:
+ if (rc == KSFT_PASS)
+ printf("OK\n");
+ else
+ printf("Not OK\n");
+
+ return rc;
+}
+
static int check_ksm_get_merge_type(void)
{
if (prctl(PR_SET_MEMORY_MERGE, 1)) {
@@ -760,7 +803,7 @@ int main(int argc, char *argv[])
bool merge_across_nodes = KSM_MERGE_ACROSS_NODES_DEFAULT;
long size_MB = 0;
- while ((opt = getopt(argc, argv, "ha:p:l:z:m:s:t:GMUZNPCHD")) != -1) {
+ while ((opt = getopt(argc, argv, "ha:p:l:z:m:s:t:FGMUZNPCHD")) != -1) {
switch (opt) {
case 'a':
prot = str_to_prot(optarg);
@@ -811,6 +854,9 @@ int main(int argc, char *argv[])
merge_type = atoi(optarg);
}
break;
+ case 'F':
+ test_name = CHECK_KSM_MERGE_FORK;
+ break;
case 'M':
break;
case 'U':
@@ -867,6 +913,9 @@ int main(int argc, char *argv[])
ret = check_ksm_merge(merge_type, MAP_PRIVATE | MAP_ANONYMOUS, prot, page_count,
ksm_scan_limit_sec, page_size);
break;
+ case CHECK_KSM_MERGE_FORK:
+ ret = check_ksm_fork();
+ break;
case CHECK_KSM_UNMERGE:
ret = check_ksm_unmerge(merge_type, MAP_PRIVATE | MAP_ANONYMOUS, prot,
ksm_scan_limit_sec, page_size);
--
2.30.2
next prev parent reply other threads:[~2023-01-23 18:00 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-23 17:37 [RESEND RFC PATCH v1 00/20] mm: process/cgroup ksm support Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 01/20] mm: add new flag to enable ksm per process Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 02/20] mm: add flag to __ksm_enter Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 03/20] mm: add flag to __ksm_exit call Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 04/20] mm: invoke madvise for all vmas in scan_get_next_rmap_item Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 05/20] mm: support disabling of ksm for a process Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 06/20] mm: add new prctl option to get and set " Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 07/20] mm: add tracepoints to ksm Stefan Roesch
2023-01-30 17:03 ` Steven Rostedt
2023-01-23 17:37 ` [RESEND RFC PATCH v1 08/20] mm: split off pages_volatile function Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 09/20] mm: expose general_profit metric Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 10/20] docs: document general_profit sysfs knob Stefan Roesch
2023-01-24 4:07 ` Bagas Sanjaya
2023-01-24 16:21 ` Jonathan Corbet
2023-01-26 2:31 ` Bagas Sanjaya
2023-01-23 17:37 ` [RESEND RFC PATCH v1 11/20] mm: calculate ksm process profit metric Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 12/20] mm: add ksm_merge_type() function Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 13/20] mm: expose ksm process profit metric in ksm_stat Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 14/20] mm: expose ksm merge type " Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 15/20] docs: document new procfs ksm knobs Stefan Roesch
2023-01-24 4:09 ` Bagas Sanjaya
2023-01-23 17:37 ` [RESEND RFC PATCH v1 16/20] tools: add new prctl flags to prctl in tools dir Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 17/20] selftests/vm: add KSM prctl merge test Stefan Roesch
2023-01-23 17:37 ` [RESEND RFC PATCH v1 18/20] selftests/vm: add KSM get merge type test Stefan Roesch
2023-01-23 17:37 ` Stefan Roesch [this message]
2023-01-23 17:37 ` [RESEND RFC PATCH v1 20/20] selftests/vm: add two functions for debugging merge outcome Stefan Roesch
2023-01-24 16:38 ` [RESEND RFC PATCH v1 00/20] mm: process/cgroup ksm support David Hildenbrand
2023-01-24 17:37 ` Stefan Roesch
2023-01-24 18:01 ` David Hildenbrand
2023-01-25 13:01 ` Michal Hocko
2023-01-25 18:43 ` Rik van Riel
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=20230123173748.1734238-20-shr@devkernel.io \
--to=shr@devkernel.io \
--cc=linux-doc@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-trace-kernel@vger.kernel.org \
/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.