| From: Swarup Laxman Kotiaklapudi <swarupkotikalapudi@gmail.com> |
| Subject: selftests:proc add /proc/$(pid)/statm output validation |
| Date: Tue, 10 Oct 2023 00:50:10 +0530 |
| |
| Add /proc/${pid}/statm validation |
| |
| /proc/$(pid)/statm output is expected to be: |
| "0 0 0 * 0 0 0\n" |
| Here * can be any value |
| |
| Read output of /proc/$(pid)/statm |
| and check except for 4th position, |
| all other positions have value zero. |
| |
| Link: https://lkml.kernel.org/r/20231009192010.10456-1-swarupkotikalapudi@gmail.com |
| Fixes: 5bc73bb3451b (proc: test how it holds up with mapping'less process) |
| Signed-off-by: Swarup Laxman Kotiaklapudi <swarupkotikalapudi@gmail.com> |
| Cc: Alexey Dobriyan <adobriyan@gmail.com> |
| Cc: Hugh Dickins <hughd@google.com> |
| Cc: Shuah Khan <shuah@kernel.org> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| --- |
| |
| tools/testing/selftests/proc/proc-empty-vm.c | 60 +++++++++++++++-- |
| 1 file changed, 55 insertions(+), 5 deletions(-) |
| |
| --- a/tools/testing/selftests/proc/proc-empty-vm.c~selftests-proc-add-proc-pid-statm-output-validation |
| +++ a/tools/testing/selftests/proc/proc-empty-vm.c |
| @@ -38,6 +38,8 @@ |
| #include <sys/wait.h> |
| #include <unistd.h> |
| |
| +#include "../kselftest.h" |
| + |
| #ifdef __amd64__ |
| #define TEST_VSYSCALL |
| #endif |
| @@ -303,6 +305,57 @@ static int test_proc_pid_smaps_rollup(pi |
| } |
| } |
| |
| +static int test_proc_pid_statm(pid_t pid) |
| +{ |
| + char buf[4096]; |
| + char *tok; |
| + char *string, *p; |
| + int non_zero_value_indx = 4; |
| + int i = 1, len; |
| + size_t left; |
| + |
| + snprintf(buf, sizeof(buf), "/proc/%u/statm", pid); |
| + |
| + /* |
| + * Output can be "0 0 0 2 0 0 0\n" where "2" can be anything. |
| + */ |
| + int fd = open(buf, O_RDONLY); |
| + |
| + if (fd == -1) { |
| + if (errno == ENOENT) { |
| + return EXIT_SUCCESS; |
| + } |
| + perror("open /proc/${pid}/statm"); |
| + return EXIT_FAILURE; |
| + } else { |
| + memset(buf, 0, sizeof(buf)); |
| + left = ARRAY_SIZE(buf); |
| + p = buf; |
| + while ((len = read(fd, p, left)) > 0) { |
| + p += len; |
| + left -= len; |
| + } |
| + close(fd); |
| + string = buf; |
| + |
| + while ((tok = strsep(&string, " ")) != NULL) { |
| + if (i == non_zero_value_indx) { |
| + if (!strncmp(tok, "0", 1)) |
| + goto err_statm; |
| + } else { |
| + if (strncmp(tok, "0", 1)) |
| + goto err_statm; |
| + } |
| + i++; |
| + } |
| + } |
| + |
| + return EXIT_SUCCESS; |
| + |
| +err_statm: |
| + assert(0); |
| +} |
| + |
| int main(void) |
| { |
| int rv = EXIT_SUCCESS; |
| @@ -389,11 +442,8 @@ int main(void) |
| if (rv == EXIT_SUCCESS) { |
| rv = test_proc_pid_smaps_rollup(pid); |
| } |
| - /* |
| - * TODO test /proc/${pid}/statm, task_statm() |
| - * ->start_code, ->end_code aren't updated by munmap(). |
| - * Output can be "0 0 0 2 0 0 0\n" where "2" can be anything. |
| - */ |
| + if (rv == EXIT_SUCCESS) |
| + rv = test_proc_pid_statm(pid); |
| |
| /* Cut the rope. */ |
| int wstatus; |
| _ |