From: "Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>
To: linux-mm@kvack.org
Cc: akpm@linux-foundation.org, kirill.shutemov@linux.intel.com,
"Aneesh Kumar K.V" <aneesh.kumar@linux.ibm.com>
Subject: [PATCH] khugeepaged: Replace the usage of system(3) in the test.
Date: Wed, 29 Apr 2020 16:37:27 +0530 [thread overview]
Message-ID: <20200429110727.89388-1-aneesh.kumar@linux.ibm.com> (raw)
Some glibc version doesn't use CLONE_VM | CLONE_VFORK for system(3) implementation
and on such system, we find the test case fails. This is due to fork() marking
all the parent page table pages read-only to do a COW.
Avoid the usage of system(3) in the test.
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
---
tools/testing/selftests/vm/khugepaged.c | 105 +++++++++++++++++-------
1 file changed, 77 insertions(+), 28 deletions(-)
diff --git a/tools/testing/selftests/vm/khugepaged.c b/tools/testing/selftests/vm/khugepaged.c
index 490055290d7f..9b2d675c0fd3 100644
--- a/tools/testing/selftests/vm/khugepaged.c
+++ b/tools/testing/selftests/vm/khugepaged.c
@@ -21,6 +21,7 @@ static unsigned long page_size;
static int hpage_pmd_nr;
#define THP_SYSFS "/sys/kernel/mm/transparent_hugepage/"
+#define PID_SMAPS "/proc/self/smaps"
enum thp_enabled {
THP_ALWAYS,
@@ -333,56 +334,104 @@ static void adjust_settings(void)
success("OK");
}
-#define CHECK_HUGE_FMT "sed -ne " \
- "'/^%lx/,/^AnonHugePages/{/^AnonHugePages:\\s*%ld kB/ q1}' " \
- "/proc/%d/smaps"
+#define MAX_LINE_LENGTH 500
-static bool check_huge(void *p)
+static bool check_for_pattern(FILE *fp, char *pattern, char *buf)
{
- char *cmd;
+ while (fgets(buf, MAX_LINE_LENGTH, fp) != NULL) {
+ if (!strncmp(buf, pattern, strlen(pattern)))
+ return true;
+ }
+ return false;
+}
+
+static bool check_huge(char *addr)
+{
+ bool thp = false;
int ret;
+ FILE *fp;
+ char buffer[MAX_LINE_LENGTH];
+ char addr_pattern[MAX_LINE_LENGTH];
- ret = asprintf(&cmd, CHECK_HUGE_FMT,
- (unsigned long)p, hpage_pmd_size >> 10, getpid());
- if (ret < 0) {
- perror("asprintf(CHECK_FMT)");
+ ret = snprintf(addr_pattern, MAX_LINE_LENGTH, "%08llx-", addr);
+ if (ret >= MAX_LINE_LENGTH) {
+ printf("%s: Pattern is too long\n", __func__);
exit(EXIT_FAILURE);
}
- ret = system(cmd);
- free(cmd);
- if (ret < 0 || !WIFEXITED(ret)) {
- perror("system(check_huge)");
+
+ fp = fopen(PID_SMAPS, "r");
+ if (!fp) {
+ printf("%s: Failed to open file %s\n", __func__, PID_SMAPS);
exit(EXIT_FAILURE);
}
+ if (!check_for_pattern(fp, addr_pattern, buffer))
+ goto err_out;
- return WEXITSTATUS(ret);
+ ret = snprintf(addr_pattern, MAX_LINE_LENGTH, "AnonHugePages:%10lld kB", hpage_pmd_size >> 10);
+ if (ret >= MAX_LINE_LENGTH) {
+ printf("%s: Pattern is too long\n", __func__);
+ exit(EXIT_FAILURE);
+ }
+ /*
+ * Fetch the AnonHugePages: in the same block and check whether it got
+ * the expected number of hugeepages next.
+ */
+ if (!check_for_pattern(fp, "AnonHugePages:", buffer))
+ goto err_out;
+
+ if (strncmp(buffer, addr_pattern, strlen(addr_pattern)))
+ goto err_out;
+
+ thp = true;
+err_out:
+ fclose(fp);
+ return thp;
}
-#define CHECK_SWAP_FMT "sed -ne " \
- "'/^%lx/,/^Swap:/{/^Swap:\\s*%ld kB/ q1}' " \
- "/proc/%d/smaps"
-static bool check_swap(void *p, unsigned long size)
+static bool check_swap(void *addr, unsigned long size)
{
- char *cmd;
+ bool swap = false;
int ret;
+ FILE *fp;
+ char buffer[MAX_LINE_LENGTH];
+ char addr_pattern[MAX_LINE_LENGTH];
- ret = asprintf(&cmd, CHECK_SWAP_FMT,
- (unsigned long)p, size >> 10, getpid());
- if (ret < 0) {
- perror("asprintf(CHECK_SWAP)");
+ ret = snprintf(addr_pattern, MAX_LINE_LENGTH, "%08llx-", addr);
+ if (ret >= MAX_LINE_LENGTH) {
+ printf("%s: Pattern is too long\n", __func__);
exit(EXIT_FAILURE);
}
- ret = system(cmd);
- free(cmd);
- if (ret < 0 || !WIFEXITED(ret)) {
- perror("system(check_swap)");
+
+ fp = fopen(PID_SMAPS, "r");
+ if (!fp) {
+ printf("%s: Failed to open file %s\n", __func__, PID_SMAPS);
exit(EXIT_FAILURE);
}
+ if (!check_for_pattern(fp, addr_pattern, buffer))
+ goto err_out;
- return WEXITSTATUS(ret);
+ ret = snprintf(addr_pattern, MAX_LINE_LENGTH, "Swap:%19lld kB", size >> 10);
+ if (ret >= MAX_LINE_LENGTH) {
+ printf("%s: Pattern is too long\n", __func__);
+ exit(EXIT_FAILURE);
+ }
+ /*
+ * Fetch the Swap: in the same block and check whether it got
+ * the expected number of hugeepages next.
+ */
+ if (!check_for_pattern(fp, "Swap:", buffer))
+ goto err_out;
+
+ if (strncmp(buffer, addr_pattern, strlen(addr_pattern)))
+ goto err_out;
+
+ swap = true;
+err_out:
+ fclose(fp);
+ return swap;
}
static void *alloc_mapping(void)
--
2.26.2
next reply other threads:[~2020-04-29 11:07 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-29 11:07 Aneesh Kumar K.V [this message]
2020-04-29 12:48 ` [PATCH] khugeepaged: Replace the usage of system(3) in the test Kirill A. Shutemov
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=20200429110727.89388-1-aneesh.kumar@linux.ibm.com \
--to=aneesh.kumar@linux.ibm.com \
--cc=akpm@linux-foundation.org \
--cc=kirill.shutemov@linux.intel.com \
--cc=linux-mm@kvack.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.