[LTP] [PATCH v2 3/3] move_pages04: convert to new test API

David Hildenbrand david@redhat.com
Tue Oct 8 15:59:34 CEST 2024


Let's convert the test to the new test API and cleanup the file header
a bit.

It's worth nothing that the "-c", "-P" and "-t" options are were not
working although documented.

Suggested-by: Cc: Cyril Hrubis <chrubis@suse.cz>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 .../kernel/syscalls/move_pages/move_pages04.c | 287 +++++++-----------
 1 file changed, 108 insertions(+), 179 deletions(-)

diff --git a/testcases/kernel/syscalls/move_pages/move_pages04.c b/testcases/kernel/syscalls/move_pages/move_pages04.c
index 7ad4ba78c..16db3f918 100644
--- a/testcases/kernel/syscalls/move_pages/move_pages04.c
+++ b/testcases/kernel/syscalls/move_pages/move_pages04.c
@@ -1,33 +1,14 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /*
  *   Copyright (c) 2008 Vijay Kumar B. <vijaykumar@bravegnu.org>
- *
- *   Based on testcases/kernel/syscalls/waitpid/waitpid01.c
- *   Original copyright message:
- *
  *   Copyright (c) International Business Machines  Corp., 2001
- *
- *   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
  */
 
-/*
- * NAME
- *	move_pages04.c
+/*\
+ * [Description]
  *
- * DESCRIPTION
- *      Failure when the memory area is not valid, no page is mapped yet or
- *      the shared zero page is mapped.
+ * Verify that move_pages() properly reports failures when the memory area is
+ * not valid, no page is mapped yet or the shared zero page is mapped.
  *
  * ALGORITHM
  *
@@ -48,21 +29,6 @@
  * d899844e9c98 "mm: fix status code which move_pages() returns for zero page"
  * [2]
  * 7dff875c9436 "mm/migrate: convert add_page_for_migration() from follow_page() to folio_walk"
- *
- * USAGE:  <for command-line>
- *      move_pages04 [-c n] [-i n] [-I x] [-P x] [-t]
- *      where,  -c n : Run n copies concurrently.
- *              -i n : Execute test n times.
- *              -I x : Execute test for x seconds.
- *              -P x : Pause for x seconds between iterations.
- *              -t   : Turn on syscall timing.
- *
- * History
- *	05/2008 Vijay Kumar
- *		Initial Version.
- *
- * Restrictions
- *	None
  */
 
 #include <sys/mman.h>
@@ -71,7 +37,7 @@
 #include <unistd.h>
 #include <signal.h>
 #include <errno.h>
-#include "test.h"
+#include "tst_test.h"
 #include "move_pages_support.h"
 
 #define TEST_PAGES 4
@@ -81,162 +47,125 @@
 #define ZERO_PAGE (NO_PAGE + 1)
 #define INVALID_PAGE (ZERO_PAGE + 1)
 
-void setup(void);
-void cleanup(void);
-
-char *TCID = "move_pages04";
-int TST_TOTAL = 1;
-
-typedef void (*sighandler_t) (int);
-
-int main(int argc, char **argv)
+static void run(void)
 {
-
-	tst_parse_opts(argc, argv, NULL, NULL);
-
-	setup();
-
 #ifdef HAVE_NUMA_V2
 	unsigned int i;
-	int lc;
 	unsigned int from_node;
 	unsigned int to_node;
 	int ret;
+	void *pages[TEST_PAGES] = { 0 };
+	int nodes[TEST_PAGES];
+	int status[TEST_PAGES];
+	unsigned long onepage = get_page_size();
+	char tmp;
 
 	ret = get_allowed_nodes(NH_MEMS, 2, &from_node, &to_node);
 	if (ret < 0)
-		tst_brkm(TBROK | TERRNO, cleanup, "get_allowed_nodes: %d", ret);
-
-	/* check for looping state if -i option is given */
-	for (lc = 0; TEST_LOOPING(lc); lc++) {
-		void *pages[TEST_PAGES] = { 0 };
-		int nodes[TEST_PAGES];
-		int status[TEST_PAGES];
-		unsigned long onepage = get_page_size();
-		char tmp;
-
-		/* reset tst_count in case we are looping */
-		tst_count = 0;
-
-		ret = alloc_pages_on_node(pages, TOUCHED_PAGES, from_node);
-		if (ret == -1)
-			continue;
-
-		/*
-		 * Allocate memory and do not touch it. Consequently, no
-		 * page will be faulted in / mapped into the page tables.
-		 */
-		pages[NO_PAGE] = numa_alloc_onnode(onepage, from_node);
-		if (pages[NO_PAGE] == NULL) {
-			tst_resm(TBROK, "failed allocating memory on node %d",
-				 from_node);
-			goto err_free_pages;
-		}
-
-		/*
-		 * Allocate memory, read from it, but do not write to it. This
-		 * will populate the shared zeropage.
-		 */
-		pages[ZERO_PAGE] = numa_alloc_onnode(onepage, from_node);
-		if (pages[ZERO_PAGE] == NULL) {
-			tst_resm(TBROK, "failed allocating memory on node %d",
-				 from_node);
-			goto err_free_pages;
-		}
-		/* Make the compiler not optimize-out the read. */
-		tmp = *((char *)pages[ZERO_PAGE]);
-		asm volatile("" : "+r" (tmp));
-
-		/*
-		 * Temporarily allocate memory and free it immediately. Do this
-		 * as the last step so the area won't get reused before we're
-		 * done.
-		 */
-		pages[INVALID_PAGE] = numa_alloc_onnode(onepage, from_node);
-		if (pages[INVALID_PAGE] == NULL) {
-			tst_resm(TBROK, "failed allocating memory on node %d",
-				 from_node);
-			goto err_free_pages;
-		}
-		numa_free(pages[INVALID_PAGE], onepage);
-
-		for (i = 0; i < TEST_PAGES; i++)
-			nodes[i] = to_node;
-
-		ret = numa_move_pages(0, TEST_PAGES, pages, nodes,
-				      status, MPOL_MF_MOVE);
-		if (ret == -1) {
-			tst_resm(TFAIL | TERRNO,
-				 "move_pages unexpectedly failed");
-			goto err_free_pages;
-		} else if (ret > 0) {
-			tst_resm(TINFO, "move_pages() returned %d", ret);
-		}
-
-		if (status[NO_PAGE] == -ENOENT) {
-			tst_resm(TPASS, "status[%d] has expected value",
-				 NO_PAGE);
-		} else {
-			tst_resm(TFAIL, "status[%d] is %s, expected %s",
-				NO_PAGE,
-				tst_strerrno(-status[NO_PAGE]),
-				tst_strerrno(ENOENT));
-		}
-
-		if (status[ZERO_PAGE] == -EFAULT) {
-			tst_resm(TPASS, "status[%d] has expected value",
-				 ZERO_PAGE);
-		} else {
-			tst_resm(TFAIL, "status[%d] is %s, expected %s",
-				ZERO_PAGE,
-				tst_strerrno(-status[ZERO_PAGE]),
-				tst_strerrno(EFAULT));
-		}
-
-		if (status[INVALID_PAGE] == -EFAULT) {
-			tst_resm(TPASS, "status[%d] has expected value",
-				 INVALID_PAGE);
-		} else {
-			tst_resm(TFAIL, "status[%d] is %s, expected %s",
-				INVALID_PAGE,
-				tst_strerrno(-status[INVALID_PAGE]),
-				tst_strerrno(EFAULT));
-		}
+		tst_brk(TBROK | TERRNO, "get_allowed_nodes: %d", ret);
 
-err_free_pages:
-		/* Memory for the invalid page was already freed. */
-		pages[INVALID_PAGE] = NULL;
-		/* This is capable of freeing all memory we allocated. */
-		free_pages(pages, TEST_PAGES);
+	ret = alloc_pages_on_node(pages, TOUCHED_PAGES, from_node);
+	if (ret == -1)
+		tst_brk(TBROK, "failed allocating memory on node %d",
+			from_node);
+
+	/*
+	 * Allocate memory and do not touch it. Consequently, no
+	 * page will be faulted in / mapped into the page tables.
+	 */
+	pages[NO_PAGE] = numa_alloc_onnode(onepage, from_node);
+	if (pages[NO_PAGE] == NULL)
+		tst_brk(TBROK, "failed allocating memory on node %d",
+			from_node);
+
+	/*
+	 * Allocate memory, read from it, but do not write to it. This
+	 * will populate the shared zeropage.
+	 */
+	pages[ZERO_PAGE] = numa_alloc_onnode(onepage, from_node);
+	if (pages[ZERO_PAGE] == NULL)
+		tst_brk(TBROK, "failed allocating memory on node %d",
+			from_node);
+	/* Make the compiler not optimize-out the read. */
+	tmp = *((char *)pages[ZERO_PAGE]);
+	asm volatile("" : "+r" (tmp));
+
+	/*
+	 * Temporarily allocate memory and free it immediately. Do this
+	 * as the last step so the area won't get reused before we're
+	 * done.
+	 */
+	pages[INVALID_PAGE] = numa_alloc_onnode(onepage, from_node);
+	if (pages[INVALID_PAGE] == NULL)
+		tst_brk(TBROK, "failed allocating memory on node %d",
+			from_node);
+	numa_free(pages[INVALID_PAGE], onepage);
+
+	for (i = 0; i < TEST_PAGES; i++)
+		nodes[i] = to_node;
+
+	ret = numa_move_pages(0, TEST_PAGES, pages, nodes,
+			      status, MPOL_MF_MOVE);
+	if (ret == -1) {
+		tst_res(TFAIL | TERRNO,
+			"move_pages unexpectedly failed");
+		goto err_free_pages;
+	} else if (ret > 0) {
+		tst_res(TINFO, "move_pages() returned %d", ret);
 	}
+
+	if (status[NO_PAGE] == -ENOENT) {
+		tst_res(TPASS, "status[%d] has expected value",
+			NO_PAGE);
+	} else {
+		tst_res(TFAIL, "status[%d] is %s, expected %s",
+			NO_PAGE,
+			tst_strerrno(-status[NO_PAGE]),
+			tst_strerrno(ENOENT));
+	}
+
+	if (status[ZERO_PAGE] == -EFAULT) {
+		tst_res(TPASS, "status[%d] has expected value",
+			ZERO_PAGE);
+	} else {
+		tst_res(TFAIL, "status[%d] is %s, expected %s",
+			ZERO_PAGE,
+			tst_strerrno(-status[ZERO_PAGE]),
+			tst_strerrno(EFAULT));
+	}
+
+	if (status[INVALID_PAGE] == -EFAULT) {
+		tst_res(TPASS, "status[%d] has expected value",
+			INVALID_PAGE);
+	} else {
+		tst_res(TFAIL, "status[%d] is %s, expected %s",
+			INVALID_PAGE,
+			tst_strerrno(-status[INVALID_PAGE]),
+			tst_strerrno(EFAULT));
+	}
+
+err_free_pages:
+	/* Memory for the invalid page was already freed. */
+	pages[INVALID_PAGE] = NULL;
+	/* This is capable of freeing all memory we allocated. */
+	free_pages(pages, TEST_PAGES);
 #else
-	tst_resm(TCONF, NUMA_ERROR_MSG);
+	tst_res(TCONF, NUMA_ERROR_MSG);
 #endif
-
-	cleanup();
-	tst_exit();
 }
 
-/*
- * setup() - performs all ONE TIME setup for this test
- */
 void setup(void)
 {
-
-	tst_sig(FORK, DEF_HANDLER, cleanup);
-
 	check_config(TEST_NODES);
-
-	/* Pause if that option was specified
-	 * TEST_PAUSE contains the code to fork the test with the -c option.
-	 */
-	TEST_PAUSE;
 }
 
-/*
- * cleanup() - performs all ONE TIME cleanup for this test at completion
- */
-void cleanup(void)
-{
-
-}
+static struct tst_test test = {
+	.test_all = run,
+	.setup = setup,
+	.max_runtime = 120,
+	.tags = (const struct tst_tag[]) {
+		{"linux-git", "d899844e9c98"},
+		{"linux-git", "7dff875c9436"},
+		{}
+	}
+};
-- 
2.46.1



More information about the ltp mailing list