From: Andrea Cervesato <andrea.cervesato@suse.de>
To: ltp@lists.linux.it
Subject: [LTP] [PATCH v2 1/3] Rewrite process_vm_readv02.c test with new LTP API
Date: Thu, 10 Feb 2022 12:07:09 +0100 [thread overview]
Message-ID: <20220210110712.23596-2-andrea.cervesato@suse.de> (raw)
In-Reply-To: <20220210110712.23596-1-andrea.cervesato@suse.de>
Removed pipe and replaced with shared memory.
Replaced TST_CHECKPOINT_INIT usage with .needs_checkpoints from the new
LTP API.
Signed-off-by: Andrea Cervesato <andrea.cervesato@suse.de>
---
.../kernel/syscalls/cma/process_vm_readv02.c | 215 +++++++-----------
1 file changed, 84 insertions(+), 131 deletions(-)
diff --git a/testcases/kernel/syscalls/cma/process_vm_readv02.c b/testcases/kernel/syscalls/cma/process_vm_readv02.c
index b705b946b..b11cffca1 100644
--- a/testcases/kernel/syscalls/cma/process_vm_readv02.c
+++ b/testcases/kernel/syscalls/cma/process_vm_readv02.c
@@ -1,164 +1,117 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (c) International Business Machines Corp., 2012
* Copyright (c) Linux Test Project, 2012
+ * Copyright (C) 2021 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com>
+ */
+
+/*\
+ * [Description]
*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
- * the GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ * Fork two children, one child allocates memory and initializes it;
+ * then the other one calls process_vm_readv and reads from the same
+ * memory location, it then verifies if process_vm_readv returns
+ * correct data.
*/
-#define _GNU_SOURCE
+#include <stdio.h>
#include <sys/types.h>
-#include <sys/uio.h>
#include <sys/wait.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "test.h"
-#include "safe_macros.h"
+#include "tst_test.h"
#include "lapi/syscalls.h"
-char *TCID = "process_vm_readv02";
-int TST_TOTAL = 1;
-
-static char *tst_string = "THIS IS A TEST";
-static int len;
-static int pipe_fd[2];
-static pid_t pids[2];
-
-static void child_alloc(void);
-static void child_invoke(void);
-static void setup(void);
-static void cleanup(void);
+static uintptr_t *data_ptr;
-int main(int argc, char **argv)
-{
- int lc, status;
-
- tst_parse_opts(argc, argv, NULL, NULL);
-
- setup();
- for (lc = 0; TEST_LOOPING(lc); lc++) {
- tst_count = 0;
- len = strlen(tst_string);
-
- SAFE_PIPE(cleanup, pipe_fd);
-
- /* the start of child_alloc and child_invoke is already
- * synchronized via pipe */
- pids[0] = fork();
- switch (pids[0]) {
- case -1:
- tst_brkm(TBROK | TERRNO, cleanup, "fork #0");
- case 0:
- child_alloc();
- exit(0);
- }
-
- pids[1] = fork();
- switch (pids[1]) {
- case -1:
- tst_brkm(TBROK | TERRNO, cleanup, "fork #1");
- case 0:
- child_invoke();
- exit(0);
- }
-
- /* wait until child_invoke reads from child_alloc's VM */
- SAFE_WAITPID(cleanup, pids[1], &status, 0);
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
- tst_resm(TFAIL, "child 1 returns %d", status);
-
- /* child_alloc is free to exit now */
- TST_SAFE_CHECKPOINT_WAKE(cleanup, 0);
-
- SAFE_WAITPID(cleanup, pids[0], &status, 0);
- if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
- tst_resm(TFAIL, "child 0 returns %d", status);
- }
-
- cleanup();
- tst_exit();
-}
-
-static void child_alloc(void)
+static void child_alloc(const char *data)
{
char *foo;
- char buf[BUFSIZ];
- foo = SAFE_MALLOC(tst_exit, len + 1);
- strncpy(foo, tst_string, len);
- foo[len] = '\0';
- tst_resm(TINFO, "child 0: memory allocated and initialized.");
+ foo = strdup(data);
+ *data_ptr = (uintptr_t)foo;
- /* passing addr of string "foo" via pipe */
- SAFE_CLOSE(tst_exit, pipe_fd[0]);
- snprintf(buf, BUFSIZ, "%p", foo);
- SAFE_WRITE(tst_exit, 1, pipe_fd[1], buf, strlen(buf) + 1);
- SAFE_CLOSE(tst_exit, pipe_fd[1]);
+ tst_res(TINFO, "child 0: memory allocated and initialized");
- /* wait until child_invoke is done reading from our VM */
- TST_SAFE_CHECKPOINT_WAIT(cleanup, 0);
+ TST_CHECKPOINT_WAKE_AND_WAIT(0);
}
-static void child_invoke(void)
+static void child_invoke(const char *data, int length, pid_t pid_alloc)
{
- char *lp, *rp;
- char buf[BUFSIZ];
+ char *lp;
struct iovec local, remote;
- /* get addr from pipe */
- SAFE_CLOSE(tst_exit, pipe_fd[1]);
- SAFE_READ(tst_exit, 0, pipe_fd[0], buf, BUFSIZ);
- SAFE_CLOSE(tst_exit, pipe_fd[0]);
- if (sscanf(buf, "%p", &rp) != 1)
- tst_brkm(TBROK | TERRNO, tst_exit, "sscanf");
-
- lp = SAFE_MALLOC(tst_exit, len + 1);
+ lp = SAFE_MALLOC(length);
local.iov_base = lp;
- local.iov_len = len;
- remote.iov_base = rp;
- remote.iov_len = len;
-
- tst_resm(TINFO, "child 1: reading string from same memory location.");
- TEST(tst_syscall(__NR_process_vm_readv, pids[0],
- &local, 1UL, &remote, 1UL, 0UL));
- if (TEST_RETURN != len)
- tst_brkm(TFAIL | TTERRNO, tst_exit, "process_vm_readv");
- if (strncmp(lp, tst_string, len) != 0)
- tst_brkm(TFAIL, tst_exit, "child 1: expected string: %s, "
- "received string: %256s", tst_string, lp);
- else
- tst_resm(TPASS, "expected string received.");
+ local.iov_len = length;
+ remote.iov_base = (void *)*data_ptr;
+ remote.iov_len = length;
+
+ tst_res(TINFO, "child 1: reading string from same memory location");
+
+ TST_EXP_POSITIVE(tst_syscall(__NR_process_vm_readv, pid_alloc, &local,
+ 1UL, &remote, 1UL, 0UL));
+
+ if (TST_RET != length)
+ tst_brk(TBROK, "process_vm_readv: %s", tst_strerrno(TST_ERR));
+
+ if (strncmp(lp, data, length) != 0) {
+ tst_res(TFAIL, "child 1: expected string: %s, received string: %256s",
+ data, lp);
+ } else {
+ tst_res(TPASS, "expected string received");
+ }
}
static void setup(void)
{
- tst_require_root();
-
- /* Just a sanity check of the existence of syscall */
tst_syscall(__NR_process_vm_readv, getpid(), NULL, 0UL, NULL, 0UL, 0UL);
- tst_tmpdir();
- TST_CHECKPOINT_INIT(cleanup);
-
- TEST_PAUSE;
+ data_ptr = SAFE_MMAP(NULL, sizeof(uintptr_t), PROT_READ | PROT_WRITE,
+ MAP_SHARED | MAP_ANONYMOUS, -1, 0);
}
static void cleanup(void)
{
- tst_rmdir();
+ if (data_ptr)
+ SAFE_MUNMAP(data_ptr, sizeof(uintptr_t));
+}
+
+static void run(void)
+{
+ const char *data = "test";
+ pid_t pid_alloc;
+ pid_t pid_invoke;
+ int length;
+ int status;
+
+ length = strlen(data);
+
+ pid_alloc = SAFE_FORK();
+ if (!pid_alloc) {
+ child_alloc(data);
+ return;
+ }
+
+ TST_CHECKPOINT_WAIT(0);
+
+ pid_invoke = SAFE_FORK();
+ if (!pid_invoke) {
+ child_invoke(data, length, pid_alloc);
+ return;
+ }
+
+ SAFE_WAITPID(pid_invoke, &status, 0);
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ tst_res(TFAIL, "child 1: %s", tst_strstatus(status));
+
+ TST_CHECKPOINT_WAKE(0);
+
+ SAFE_WAITPID(pid_alloc, &status, 0);
}
+
+static struct tst_test test = {
+ .test_all = run,
+ .setup = setup,
+ .cleanup = cleanup,
+ .forks_child = 1,
+ .needs_checkpoints = 1,
+};
--
2.35.1
--
Mailing list info: https://lists.linux.it/listinfo/ltp
next prev parent reply other threads:[~2022-02-10 11:07 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-10 11:07 [LTP] [PATCH v2 0/3] Rewrite cma testing suite using new LTP API Andrea Cervesato
2022-02-10 11:07 ` Andrea Cervesato [this message]
2022-02-11 13:22 ` [LTP] [PATCH v2 1/3] Rewrite process_vm_readv02.c test with " Cyril Hrubis
2022-02-10 11:07 ` [LTP] [PATCH v2 2/3] Rewrite process_vm_readv03.c " Andrea Cervesato
2022-02-11 13:36 ` Cyril Hrubis
2022-02-11 13:57 ` Cyril Hrubis
2022-02-10 11:07 ` [LTP] [PATCH v2 3/3] Rewrite process_vm_writev02.c using " Andrea Cervesato
2022-02-14 14:43 ` Cyril Hrubis
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=20220210110712.23596-2-andrea.cervesato@suse.de \
--to=andrea.cervesato@suse.de \
--cc=ltp@lists.linux.it \
/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.