From: "David Hildenbrand (Arm)" <david@kernel.org>
To: Warren Xiong <warren.xiong@ugreen.com>,
akpm@linux-foundation.org, shuah@kernel.org
Cc: ljs@kernel.org, liam@infradead.org, vbabka@kernel.org,
rppt@kernel.org, surenb@google.com, mhocko@suse.com,
linux-mm@kvack.org, linux-kselftest@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] selftests/mm: read memory information without popen
Date: Tue, 4 Aug 2026 13:15:35 +0200 [thread overview]
Message-ID: <9dc3b457-65aa-40ba-99a1-7c703facbd32@kernel.org> (raw)
In-Reply-To: <1785720615-5826-1-git-send-email-warren.xiong@ugreen.com>
On 8/3/26 03:30, Warren Xiong wrote:
> read_memory_info() invokes two shell pipelines to obtain MemFree and
> Hugepagesize from /proc/meminfo. It does not check whether popen()
> returns NULL before passing the result to fgets(), and it does not call
> pclose() when fgets() fails.
>
> Open /proc/meminfo directly and obtain both values in a single pass.
> This removes the unchecked NULL path, closes the file on all paths, and
> avoids dependencies on external commands.
>
> The compaction test continues to pass after this change.
>
> Signed-off-by: Warren Xiong <warren.xiong@ugreen.com>
> ---
> tools/testing/selftests/mm/compaction_test.c | 43 +++++++++++++++++-----------
> 1 file changed, 27 insertions(+), 16 deletions(-)
>
> diff --git a/tools/testing/selftests/mm/compaction_test.c b/tools/testing/selftests/mm/compaction_test.c
> index 5b58258..0df2000 100644
> --- a/tools/testing/selftests/mm/compaction_test.c
> +++ b/tools/testing/selftests/mm/compaction_test.c
> @@ -7,6 +7,7 @@
> * allocated.
> */
>
> +#include <stdbool.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <sys/mman.h>
> @@ -29,30 +30,40 @@ struct map_list {
>
> int read_memory_info(unsigned long *memfree, unsigned long *hugepagesize)
> {
Looks much better indeed.
> - char buffer[256] = {0};
> - char *cmd = "cat /proc/meminfo | grep -i memfree | grep -o '[0-9]*'";
> - FILE *cmdfile = popen(cmd, "r");
> + char buffer[256];
> + bool memfree_found = false;
> + bool hugepagesize_found = false;
> + FILE *file;
> + int ret = -1;
>
> - if (!(fgets(buffer, sizeof(buffer), cmdfile))) {
> - ksft_print_msg("Failed to read meminfo: %s\n", strerror(errno));
> + file = fopen("/proc/meminfo", "r");
> + if (!file) {
> + ksft_print_msg("Failed to open /proc/meminfo: %s\n",
> + strerror(errno));
> return -1;
> }
>
> - pclose(cmdfile);
> + while (fgets(buffer, sizeof(buffer), file)) {
> + if (sscanf(buffer, "MemFree: %lu kB", memfree) == 1)
> + memfree_found = true;
> + else if (sscanf(buffer, "Hugepagesize: %lu kB",
> + hugepagesize) == 1)
> + hugepagesize_found = true;
Instead of these bools you could just have a hit-count.
Like the following on top:
diff --git a/tools/testing/selftests/mm/compaction_test.c b/tools/testing/selftests/mm/compaction_test.c
index 0df2000f4a2b1..30d4ace7155ae 100644
--- a/tools/testing/selftests/mm/compaction_test.c
+++ b/tools/testing/selftests/mm/compaction_test.c
@@ -7,7 +7,6 @@
* allocated.
*/
-#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
@@ -31,8 +30,7 @@ struct map_list {
int read_memory_info(unsigned long *memfree, unsigned long *hugepagesize)
{
char buffer[256];
- bool memfree_found = false;
- bool hugepagesize_found = false;
+ int found = 0;
FILE *file;
int ret = -1;
@@ -43,24 +41,19 @@ int read_memory_info(unsigned long *memfree, unsigned long *hugepagesize)
return -1;
}
- while (fgets(buffer, sizeof(buffer), file)) {
- if (sscanf(buffer, "MemFree: %lu kB", memfree) == 1)
- memfree_found = true;
- else if (sscanf(buffer, "Hugepagesize: %lu kB",
- hugepagesize) == 1)
- hugepagesize_found = true;
-
- if (memfree_found && hugepagesize_found) {
- ret = 0;
- break;
- }
+ while (fgets(buffer, sizeof(buffer), file) && found != 2) {
+ if (sscanf(buffer, "MemFree: %lu kB", memfree) == 1 ||
+ sscanf(buffer, "Hugepagesize: %lu kB", hugepagesize) == 1)
+ found++;
}
if (ferror(file))
ksft_print_msg("Failed to read /proc/meminfo: %s\n",
strerror(errno));
- else if (ret)
+ else if (found != 2)
ksft_print_msg("Failed to parse /proc/meminfo\n");
+ else
+ ret = 0;
fclose(file);
return ret;
--
Cheers,
David
next prev parent reply other threads:[~2026-08-04 11:15 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-03 1:30 [PATCH] selftests/mm: read memory information without popen Warren Xiong
2026-08-04 9:48 ` Mike Rapoport
2026-08-04 11:15 ` David Hildenbrand (Arm) [this message]
2026-08-04 12:07 ` warren.xiong
2026-08-04 12:16 ` [PATCH v2] " Warren Xiong
2026-08-04 12:21 ` David Hildenbrand (Arm)
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=9dc3b457-65aa-40ba-99a1-7c703facbd32@kernel.org \
--to=david@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=mhocko@suse.com \
--cc=rppt@kernel.org \
--cc=shuah@kernel.org \
--cc=surenb@google.com \
--cc=vbabka@kernel.org \
--cc=warren.xiong@ugreen.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.