public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
* [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework
@ 2022-10-04 18:20 Edward Liaw via ltp
  2022-10-04 18:20 ` [LTP] [PATCH v3 1/9] mmapstress01: refactor to tst_test framework Edward Liaw via ltp
                   ` (9 more replies)
  0 siblings, 10 replies; 13+ messages in thread
From: Edward Liaw via ltp @ 2022-10-04 18:20 UTC (permalink / raw)
  To: ltp; +Cc: kernel-team

Attempt to refactor mmapstress01 to use the ltp framework.

v2->v3:
* apply make check lint suggestions
* refactor cleanup
* use SAFE_FORK
* update license

v1->v2:
* clean up formatting
* remove accidental change to header comment
* use SAFE_MMAP

Edward Liaw (9):
  mmapstress01: refactor to tst_test framework
  mmapstress01: apply make check suggestions
  mmapstress01: refactor options
  mmapstress01: use FILE_OFFSET_BITS=64
  mmapstress01: use safe macros
  mmapstress01: refactor cleanup and drop leavefile option
  mmapstress01: use SAFE_FORK
  mmapstress01: update license
  mmapstress01: reorder vars and functions

 testcases/kernel/mem/mmapstress/Makefile      |   2 +
 .../kernel/mem/mmapstress/mmapstress01.c      | 845 ++++++------------
 2 files changed, 289 insertions(+), 558 deletions(-)

-- 
2.38.0.rc1.362.ged0d419d3c-goog


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [LTP] [PATCH v3 1/9] mmapstress01: refactor to tst_test framework
  2022-10-04 18:20 [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Edward Liaw via ltp
@ 2022-10-04 18:20 ` Edward Liaw via ltp
  2022-10-04 18:20 ` [LTP] [PATCH v3 2/9] mmapstress01: apply make check suggestions Edward Liaw via ltp
                   ` (8 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Edward Liaw via ltp @ 2022-10-04 18:20 UTC (permalink / raw)
  To: ltp; +Cc: kernel-team

Signed-off-by: Edward Liaw <edliaw@google.com>
---
 .../kernel/mem/mmapstress/mmapstress01.c      | 485 +++++++-----------
 1 file changed, 187 insertions(+), 298 deletions(-)

diff --git a/testcases/kernel/mem/mmapstress/mmapstress01.c b/testcases/kernel/mem/mmapstress/mmapstress01.c
index f425c223d..41f94a52a 100644
--- a/testcases/kernel/mem/mmapstress/mmapstress01.c
+++ b/testcases/kernel/mem/mmapstress/mmapstress01.c
@@ -20,32 +20,6 @@
  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#define _GNU_SOURCE 1
-#include <stdio.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <sys/mman.h>
-#include <sys/wait.h>
-#include <sys/stat.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <limits.h>
-/*****  LTP Port        *****/
-#include "test.h"
-#define FAILED 0
-#define PASSED 1
-
-int local_flag = PASSED;
-char *TCID = "mmapstress01";	//tmnoextend
-FILE *temp;
-int TST_TOTAL = 1;
-
-int anyfail();
-void ok_exit();
-/*****  **      **      *****/
-
 /*
  *  This test stresses mmaps, without dealing with fragments or anything!
  *  It forks a specified number of children,
@@ -88,8 +62,24 @@ void ok_exit();
  *  Compile with -DLARGE_FILE to enable file sizes > 2 GB.
  */
 
+#define _GNU_SOURCE 1
+#include <stdio.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <sys/mman.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <limits.h>
+#define TST_NO_DEFAULT_MAIN
+#include "tst_test.h"
+
 #define MAXLOOPS	500	/* max pages for map children to write */
 #define	FILESIZE	4096	/* initial filesize set up by parent */
+#define TEST_FILE	"mmapstress01.out"
 
 #ifdef roundup
 #undef roundup
@@ -100,36 +90,42 @@ extern time_t time(time_t *);
 extern char *ctime(const time_t *);
 extern void *malloc(size_t);
 extern long lrand48(void);
-extern void srand(unsigned);
+extern void srand(unsigned int);
 extern void srand48(long);
 extern int rand(void);
 extern int atoi(const char *);
 
-char *usage =
+static char *usage =
     "-p nprocs [-t minutes -f filesize -S sparseoffset -r -o -m -l -d]";
 
-typedef unsigned char uchar_t;
-#define SIZE_MAX UINT_MAX
+static unsigned int initrand(void);
+static void finish(int sig);
+static void child_mapper(char *file, unsigned int procno, unsigned int nprocs);
+static int fileokay(char *file, unsigned char *expbuf);
+static int finished = 0;
+static int leavefile = 0;
+
+static float alarmtime = 0;
+static unsigned int nprocs = 0;
+
+static pid_t *pidarray = NULL;
+static int wait_stat;
+static int check_for_sanity;
+static unsigned char *buf = NULL;
 
-unsigned int initrand(void);
-void finish(int sig);
-void child_mapper(char *file, unsigned procno, unsigned nprocs);
-int fileokay(char *file, uchar_t * expbuf);
-int finished = 0;
-int leavefile = 0;
 
-int debug = 0;
+static int debug = 0;
 #ifdef LARGE_FILE
-off64_t filesize = FILESIZE;
-off64_t sparseoffset = 0;
+static off64_t filesize = FILESIZE;
+static off64_t sparseoffset = 0;
 #else /* LARGE_FILE */
-off_t filesize = FILESIZE;
-off_t sparseoffset = 0;
+static off_t filesize = FILESIZE;
+static off_t sparseoffset = 0;
 #endif /* LARGE_FILE */
-unsigned randloops = 0;
-unsigned dosync = 0;
-unsigned do_offset = 0;
-unsigned pattern = 0;
+static unsigned int randloops = 0;
+static unsigned int dosync = 0;
+static unsigned int do_offset = 0;
+static unsigned int pattern = 0;
 
 int main(int argc, char *argv[])
 {
@@ -137,32 +133,23 @@ int main(int argc, char *argv[])
 	int fd;
 	int c;
 	extern char *optarg;
-	unsigned nprocs = 0;
-	unsigned procno;
-	pid_t *pidarray = NULL;
+	unsigned int procno;
 	pid_t pid;
-	uchar_t *buf = NULL;
 	unsigned int seed;
 	int pagesize = sysconf(_SC_PAGE_SIZE);
-	float alarmtime = 0;
 	struct sigaction sa;
-	unsigned i;
+	unsigned int i;
 	int write_cnt;
-	uchar_t data;
-	int no_prob = 0;
-	int wait_stat;
-	time_t t;
+	unsigned char data;
 #ifdef LARGE_FILE
 	off64_t bytes_left;
 #else /* LARGE_FILE */
 	off_t bytes_left;
 #endif /* LARGE_FILE */
-	const char *filename = "mmapstress01.out";
 
 	progname = *argv;
-	tst_tmpdir();
 	if (argc < 2) {
-		tst_brkm(TBROK, NULL, "usage: %s %s", progname, usage);
+		tst_brk(TBROK, "usage: %s %s", progname, usage);
 	}
 
 	while ((c = getopt(argc, argv, "S:omdlrf:p:t:")) != -1) {
@@ -185,11 +172,8 @@ int main(int argc, char *argv[])
 #else /* LARGE_FILE */
 			filesize = atoi(optarg);
 #endif /* LARGE_FILE */
-			if (filesize < 0) {
-				(void)fprintf(stderr, "error: negative "
-					      "filesize\n");
-				anyfail();
-			}
+			if (filesize < 0)
+				tst_brk(TBROK, "error: negative filesize");
 			break;
 		case 'r':
 			randloops = 1;
@@ -206,46 +190,39 @@ int main(int argc, char *argv[])
 #else /* LARGE_FILE */
 			sparseoffset = atoi(optarg);
 #endif /* LARGE_FILE */
-			if (sparseoffset % pagesize != 0) {
-				fprintf(stderr,
-					"sparseoffset must be pagesize multiple\n");
-				anyfail();
-			}
+			if (sparseoffset % pagesize != 0)
+				tst_brk(TBROK,
+				        "sparseoffset must be pagesize multiple");
 			break;
 		default:
-			(void)fprintf(stderr, "usage: %s %s\n", progname,
-				      usage);
-			tst_exit();
+			tst_brk(TBROK, "usage: %s %s", progname, usage);
 		}
 	}
 
 	/* nprocs is >= 0 since it's unsigned */
-	if (nprocs > 255) {
-		(void)fprintf(stderr, "invalid nprocs %d - (range 0-255)\n",
-			      nprocs);
-		anyfail();
-	}
-
-	(void)time(&t);
+	if (nprocs > 255)
+		tst_brk(TBROK, "invalid nprocs %d - (range 0-255)", nprocs);
 
 	seed = initrand();
 	pattern = seed & 0xff;
 
 	if (debug) {
 #ifdef LARGE_FILE
-		(void)printf("creating file <%s> with %Ld bytes, pattern %d\n",
-			     filename, filesize, pattern);
+		tst_res(TINFO, "creating file <%s> with %Ld bytes, pattern %d",
+		        TEST_FILE, filesize, pattern);
 #else /* LARGE_FILE */
-		(void)printf("creating file <%s> with %ld bytes, pattern %d\n",
-			     filename, filesize, pattern);
+		tst_res(TINFO, "creating file <%s> with %ld bytes, pattern %d",
+		        TEST_FILE, filesize, pattern);
 #endif /* LARGE_FILE */
 		if (alarmtime)
-			(void)printf("running for %f minutes\n",
-				     alarmtime / 60);
+			tst_res(TINFO, "running for %f minutes",
+			        alarmtime / 60);
 		else
-			(void)printf("running with no time limit\n");
+			tst_res(TINFO, "running with no time limit");
 	}
 
+	tst_reinit();
+
 	/*
 	 *  Plan for death by signal.  User may have specified
 	 *  a time limit, in which set an alarm and catch SIGALRM.
@@ -253,44 +230,32 @@ int main(int argc, char *argv[])
 	 */
 	sa.sa_handler = finish;
 	sa.sa_flags = 0;
-	if (sigemptyset(&sa.sa_mask)) {
-		perror("sigemptyset error");
-		goto cleanup;
-	}
+	if (sigemptyset(&sa.sa_mask))
+		tst_brk(TFAIL, "sigemptyset error");
 
-	if (sigaction(SIGINT, &sa, 0) == -1) {
-		perror("sigaction error SIGINT");
-		goto cleanup;
-	}
-	if (sigaction(SIGQUIT, &sa, 0) == -1) {
-		perror("sigaction error SIGQUIT");
-		goto cleanup;
-	}
-	if (sigaction(SIGTERM, &sa, 0) == -1) {
-		perror("sigaction error SIGTERM");
-		goto cleanup;
-	}
+	if (sigaction(SIGINT, &sa, 0) == -1)
+		tst_brk(TFAIL, "sigaction error SIGINT");
+	if (sigaction(SIGQUIT, &sa, 0) == -1)
+		tst_brk(TFAIL, "sigaction error SIGQUIT");
+	if (sigaction(SIGTERM, &sa, 0) == -1)
+		tst_brk(TFAIL, "sigaction error SIGTERM");
 
 	if (alarmtime) {
-		if (sigaction(SIGALRM, &sa, 0) == -1) {
-			perror("sigaction error");
-			goto cleanup;
-		}
+		if (sigaction(SIGALRM, &sa, 0) == -1)
+			tst_brk(TFAIL, "sigaction error");
 		(void)alarm(alarmtime);
 	}
 #ifdef LARGE_FILE
-	if ((fd = open64(filename, O_CREAT | O_TRUNC | O_RDWR, 0664)) == -1) {
+	if ((fd = open64(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, 0664)) == -1) {
 #else /* LARGE_FILE */
-	if ((fd = open(filename, O_CREAT | O_TRUNC | O_RDWR, 0664)) == -1) {
+	if ((fd = open(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, 0664)) == -1) {
 #endif /* LARGE_FILE */
-		perror("open error");
-		anyfail();
+		tst_brk(TFAIL, "open error");
 	}
 
 	if ((buf = malloc(pagesize)) == NULL
 	    || (pidarray = malloc(nprocs * sizeof(pid_t))) == NULL) {
-		perror("malloc error");
-		anyfail();
+		tst_brk(TFAIL, "malloc error");
 	}
 
 	for (i = 0; i < nprocs; i++)
@@ -302,25 +267,23 @@ int main(int argc, char *argv[])
 			data = 0;
 	}
 #ifdef LARGE_FILE
-	if (lseek64(fd, sparseoffset, SEEK_SET) < 0) {
+	if (lseek64(fd, (off64_t)sparseoffset, SEEK_SET) < 0) {
 #else /* LARGE_FILE */
-	if (lseek(fd, sparseoffset, SEEK_SET) < 0) {
+	if (lseek(fd, (off_t)sparseoffset, SEEK_SET) < 0) {
 #endif /* LARGE_FILE */
-		perror("lseek");
-		anyfail();
+		tst_brk(TFAIL, "lseek");
 	}
 	for (bytes_left = filesize; bytes_left; bytes_left -= c) {
 		write_cnt = MIN(pagesize, (int)bytes_left);
 		if ((c = write(fd, buf, write_cnt)) != write_cnt) {
-			if (c == -1) {
-				perror("write error");
-			} else {
-				(void)fprintf(stderr, "write: wrote %d of %d "
-					      "bytes\n", c, write_cnt);
-			}
+			if (c == -1)
+				tst_res(TINFO, "write error");
+			else
+				tst_res(TINFO, "write: wrote %d of %d bytes",
+				        c, write_cnt);
 			(void)close(fd);
-			(void)unlink(filename);
-			anyfail();
+			(void)unlink(TEST_FILE);
+			tst_brk(TFAIL, "write error");
 		}
 	}
 
@@ -333,11 +296,11 @@ int main(int argc, char *argv[])
 		switch (pid = fork()) {
 
 		case -1:
-			perror("fork error");
-			goto cleanup;
+			tst_brk(TFAIL, "fork error");
+			break;
 
 		case 0:
-			child_mapper(filename, procno, nprocs);
+			child_mapper(TEST_FILE, procno, nprocs);
 			exit(0);
 
 		default:
@@ -355,10 +318,8 @@ int main(int argc, char *argv[])
 		 *  Block signals while processing child exit.
 		 */
 
-		if (sighold(SIGALRM) || sighold(SIGINT)) {
-			perror("sighold error");
-			goto cleanup;
-		}
+		if (sighold(SIGALRM) || sighold(SIGINT))
+			tst_brk(TFAIL, "sighold error");
 
 		if (pid != -1) {
 			/*
@@ -366,44 +327,36 @@ int main(int argc, char *argv[])
 			 *  appropriate procno.
 			 */
 			if (!WIFEXITED(wait_stat)
-			    || WEXITSTATUS(wait_stat) != 0) {
-				(void)fprintf(stderr, "child exit with err "
-					      "<x%x>\n", wait_stat);
-				goto cleanup;
-			}
+			    || WEXITSTATUS(wait_stat) != 0)
+				tst_brk(TFAIL, "child exit with err <x%x>",
+				        wait_stat);
 			for (i = 0; i < nprocs; i++)
 				if (pid == pidarray[i])
 					break;
-			if (i == nprocs) {
-				(void)fprintf(stderr, "unknown child pid %d, "
-					      "<x%x>\n", pid, wait_stat);
-				goto cleanup;
-			}
+			if (i == nprocs)
+				tst_brk(TFAIL, "unknown child pid %d, <x%x>",
+				        pid, wait_stat);
 
 			if ((pid = fork()) == -1) {
-				perror("fork error");
 				pidarray[i] = 0;
-				goto cleanup;
+				tst_brk(TFAIL, "fork error");
 			} else if (pid == 0) {	/* child */
-				child_mapper(filename, i, nprocs);
+				child_mapper(TEST_FILE, i, nprocs);
 				exit(0);
-			} else
+			} else {
 				pidarray[i] = pid;
+			}
 		} else {
 			/*
 			 *  wait returned an error.  If EINTR, then
 			 *  normal finish, else it's an unexpected
 			 *  error...
 			 */
-			if (errno != EINTR || !finished) {
-				perror("unexpected wait error");
-				goto cleanup;
-			}
-		}
-		if (sigrelse(SIGALRM) || sigrelse(SIGINT)) {
-			perror("sigrelse error");
-			goto cleanup;
+			if (errno != EINTR || !finished)
+				tst_brk(TFAIL, "unexpected wait error");
 		}
+		if (sigrelse(SIGALRM) || sigrelse(SIGINT))
+			tst_brk(TFAIL, "sigrelse error");
 	}
 
 	/*
@@ -411,40 +364,34 @@ int main(int argc, char *argv[])
 	 *  the children and done!.
 	 */
 
-	if (sighold(SIGALRM)) {
-		perror("sighold error");
-		goto cleanup;
-	}
+	if (sighold(SIGALRM))
+		tst_brk(TFAIL, "sighold error");
 	(void)alarm(0);
-	no_prob = 1;
+	check_for_sanity = 1;
+	tst_res(TPASS, "finished, cleaning up");
+}
 
-cleanup:
-	for (i = 0; i < nprocs; i++)
+static void cleanup(void)
+{
+	for (int i = 0; i < nprocs; i++)
 		(void)kill(pidarray[i], SIGKILL);
 
 	while (wait(&wait_stat) != -1 || errno != ECHILD)
 		continue;
 
-	if (no_prob) {		/* only check file if no errors */
-		if (!fileokay(filename, buf)) {
-			(void)fprintf(stderr, "file data incorrect!\n");
-			(void)printf("  leaving file <%s>\n", filename);
-			/***** LTP Port *****/
-			local_flag = FAILED;
-			anyfail();
-			/*****	**	*****/
+	if (check_for_sanity) {		/* only check file if no errors */
+		if (!fileokay(TEST_FILE, buf)) {
+			tst_res(TINFO, "  leaving file <%s>", TEST_FILE);
+			tst_brk(TFAIL, "file data incorrect");
 		} else {
-			(void)printf("file data okay\n");
+			tst_res(TINFO, "file data okay");
 			if (!leavefile)
-				(void)unlink(filename);
+				(void)unlink(TEST_FILE);
+			tst_res(TPASS, "test passed");
 		}
-	} else
-		(void)printf("  leaving file <%s>\n", filename);
-
-	(void)time(&t);
-	//(void)printf("%s: Finished %s", argv[0], ctime(&t)); LTP Port
-	ok_exit();
-	tst_exit();
+	} else {
+		tst_res(TINFO, "  leaving file <%s>", TEST_FILE);
+	}
 }
 
 /*
@@ -454,7 +401,7 @@ cleanup:
  *  determined based on nprocs & procno).  After a specific number of
  *  iterations, it exits.
  */
-void child_mapper(char *file, unsigned procno, unsigned nprocs)
+void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 {
 #ifdef LARGE_FILE
 	struct stat64 statbuf;
@@ -470,38 +417,32 @@ void child_mapper(char *file, unsigned procno, unsigned nprocs)
 	char *maddr = NULL, *paddr;
 	int fd;
 	size_t pagesize = sysconf(_SC_PAGE_SIZE);
-	unsigned randpage;
+	unsigned int randpage;
 	unsigned int seed;
-	unsigned loopcnt;
-	unsigned nloops;
-	unsigned mappages;
-	unsigned i;
+	unsigned int loopcnt;
+	unsigned int nloops;
+	unsigned int mappages;
+	unsigned int i;
 
 	seed = initrand();	/* initialize random seed */
 
 #ifdef LARGE_FILE
-	if (stat64(file, &statbuf) == -1) {
+	if (stat64(file, &statbuf) == -1)
 #else /* LARGE_FILE */
-	if (stat(file, &statbuf) == -1) {
+	if (stat(file, &statbuf) == -1)
 #endif /* LARGE_FILE */
-		perror("stat error");
-		anyfail();
-	}
+		tst_brk(TFAIL, "stat error");
 	filesize = statbuf.st_size;
 
 #ifdef LARGE_FILE
-	if ((fd = open64(file, O_RDWR)) == -1) {
+	if ((fd = open64(file, O_RDWR)) == -1)
 #else /* LARGE_FILE */
-	if ((fd = open(file, O_RDWR)) == -1) {
+	if ((fd = open(file, O_RDWR)) == -1)
 #endif /* LARGE_FILE */
-		perror("open error");
-		anyfail();
-	}
+		tst_brk(TFAIL, "open error");
 
-	if (statbuf.st_size - sparseoffset > SIZE_MAX) {
-		fprintf(stderr, "size_t overflow when setting up map\n");
-		anyfail();
-	}
+	if (statbuf.st_size - sparseoffset > UINT_MAX)
+		tst_brk(TFAIL, "size_t overflow when setting up map");
 	mapsize = (size_t) (statbuf.st_size - sparseoffset);
 	mappages = roundup(mapsize, pagesize) / pagesize;
 	offset = sparseoffset;
@@ -514,29 +455,18 @@ void child_mapper(char *file, unsigned procno, unsigned nprocs)
 	}
 	nloops = (randloops) ? (lrand48() % MAXLOOPS) : MAXLOOPS;
 
-	if (debug) {
-#ifdef LARGE_FILE
-		(void)printf("child %d (pid %ld): seed %d, fsize %Ld, "
-			     "mapsize %d, off %Ld, loop %d\n",
-			     procno, getpid(), seed, filesize, mapsize,
-			     offset / pagesize, nloops);
-#else /* LARGE_FILE */
-		(void)printf("child %d (pid %d): seed %d, fsize %ld, "
-			     "mapsize %ld, off %ld, loop %d\n",
-			     procno, getpid(), seed, filesize, (long)mapsize,
-			     offset / pagesize, nloops);
-#endif /* LARGE_FILE */
-	}
+	if (debug)
+		tst_res(TINFO, "child %d (pid %d): seed %d, fsize %lld, mapsize %ld, off %lld, loop %d",
+		        procno, getpid(), seed, filesize, (long)mapsize,
+		        offset / pagesize, nloops);
 #ifdef LARGE_FILE
 	if ((maddr = mmap64(0, mapsize, PROT_READ | PROT_WRITE, MAP_SHARED,
-			    fd, offset)) == (caddr_t) - 1) {
+	                    fd, (off64_t)offset)) == (caddr_t) - 1)
 #else /* LARGE_FILE */
 	if ((maddr = mmap(0, mapsize, PROT_READ | PROT_WRITE, MAP_SHARED,
-			  fd, offset)) == (caddr_t) - 1) {
+	                  fd, (off_t)offset)) == (caddr_t) - 1)
 #endif /* LARGE_FILE */
-		perror("mmap error");
-		anyfail();
-	}
+		tst_brk(TFAIL, "mmap error");
 
 	(void)close(fd);
 
@@ -554,15 +484,11 @@ void child_mapper(char *file, unsigned procno, unsigned nprocs)
 
 		for (i = procno; i < validsize; i += nprocs) {
 			if (*((unsigned char *)(paddr + i))
-			    != ((procno + pattern) & 0xff)) {
-				(void)fprintf(stderr, "child %d: invalid data "
-					      "<x%x>", procno,
-					      *((unsigned char *)(paddr + i)));
-				(void)fprintf(stderr, " at pg %d off %d, exp "
-					      "<x%x>\n", randpage, i,
-					      (procno + pattern) & 0xff);
-				anyfail();
-			}
+			    != ((procno + pattern) & 0xff))
+				tst_brk(TFAIL, "child %d: invalid data <x%x>\n"
+				        " at pg %d off %d, exp <x%x>", procno,
+				        *((unsigned char *)(paddr + i)),
+				        randpage, i, (procno + pattern) & 0xff);
 
 			/*
 			 *  Now write it.
@@ -577,22 +503,18 @@ void child_mapper(char *file, unsigned procno, unsigned nprocs)
 		randpage = lrand48() % mappages;
 		paddr = maddr + (randpage * pagesize);	/* page address */
 		if (msync(paddr, (mappages - randpage) * pagesize,
-			  MS_SYNC) == -1) {
-			anyfail();
-		}
-	}
-	if (munmap(maddr, mapsize) == -1) {
-		perror("munmap failed");
-		local_flag = FAILED;
-		anyfail();
+		          MS_SYNC) == -1)
+			tst_brk(TFAIL, "msync failed");
 	}
+	if (munmap(maddr, mapsize) == -1)
+		tst_brk(TFAIL, "munmap failed");
 	exit(0);
 }
 
 /*
  *  Make sure file has all the correct data.
  */
-int fileokay(char *file, uchar_t * expbuf)
+int fileokay(char *file, unsigned char *expbuf)
 {
 #ifdef LARGE_FILE
 	struct stat64 statbuf;
@@ -600,50 +522,36 @@ int fileokay(char *file, uchar_t * expbuf)
 	struct stat statbuf;
 #endif /* LARGE_FILE */
 	size_t mapsize;
-	unsigned mappages;
-	unsigned pagesize = sysconf(_SC_PAGE_SIZE);
-	uchar_t readbuf[pagesize];
+	unsigned int mappages;
+	unsigned int pagesize = sysconf(_SC_PAGE_SIZE);
+	unsigned char readbuf[pagesize];
 	int fd;
 	int cnt;
-	unsigned i, j;
+	unsigned int i, j;
 
 #ifdef LARGE_FILE
-	if ((fd = open64(file, O_RDONLY)) == -1) {
+	if ((fd = open64(file, O_RDONLY)) == -1)
 #else /* LARGE_FILE */
-	if ((fd = open(file, O_RDONLY)) == -1) {
+	if ((fd = open(file, O_RDONLY)) == -1)
 #endif /* LARGE_FILE */
-		perror("open error");
-		/***** LTP Port *****/
-		local_flag = FAILED;
-		anyfail();
-		/*****	**	*****/
-		return 0;
-	}
+		tst_brk(TFAIL, "open error");
+
 #ifdef LARGE_FILE
-	if (fstat64(fd, &statbuf) == -1) {
+	if (fstat64(fd, &statbuf) == -1)
 #else /* LARGE_FILE */
-	if (fstat(fd, &statbuf) == -1) {
+	if (fstat(fd, &statbuf) == -1)
 #endif /* LARGE_FILE */
-		perror("stat error");
-		/***** LTP Port *****/
-		local_flag = FAILED;
-		anyfail();
-		/*****	**	*****/
-		return 0;
-	}
+		tst_brk(TFAIL, "stat error");
+
 #ifdef LARGE_FILE
-	if (lseek64(fd, sparseoffset, SEEK_SET) < 0) {
+	if (lseek64(fd, sparseoffset, SEEK_SET) < 0)
 #else /* LARGE_FILE */
-	if (lseek(fd, sparseoffset, SEEK_SET) < 0) {
+	if (lseek(fd, sparseoffset, SEEK_SET) < 0)
 #endif /* LARGE_FILE */
-		perror("lseek");
-		anyfail();
-	}
+		tst_brk(TFAIL, "lseek");
 
-	if (statbuf.st_size - sparseoffset > SIZE_MAX) {
-		fprintf(stderr, "size_t overflow when setting up map\n");
-		anyfail();
-	}
+	if (statbuf.st_size - sparseoffset > UINT_MAX)
+		tst_brk(TFAIL, "size_t overflow when setting up map");
 	mapsize = (size_t) (statbuf.st_size - sparseoffset);
 
 	mappages = roundup(mapsize, pagesize) / pagesize;
@@ -651,20 +559,14 @@ int fileokay(char *file, uchar_t * expbuf)
 	for (i = 0; i < mappages; i++) {
 		cnt = read(fd, readbuf, pagesize);
 		if (cnt == -1) {
-			perror("read error");
-			/***** LTP Port *****/
-			local_flag = FAILED;
-			anyfail();
-			/*****	**	*****/
-			return 0;
-		} else if (cnt != pagesize) {
+			tst_brk(TFAIL, "read error");
+		} else if ((unsigned int)cnt != pagesize) {
 			/*
 			 *  Okay if at last page in file...
 			 */
 			if ((i * pagesize) + cnt != mapsize) {
-				(void)fprintf(stderr, "read %d of %ld bytes\n",
-					      (i * pagesize) + cnt,
-					      (long)mapsize);
+				tst_res(TINFO, "read %d of %ld bytes",
+				        (i * pagesize) + cnt, (long)mapsize);
 				close(fd);
 				return 0;
 			}
@@ -672,19 +574,16 @@ int fileokay(char *file, uchar_t * expbuf)
 		/*
 		 *  Compare read bytes of data.
 		 */
-		for (j = 0; j < cnt; j++) {
+		for (j = 0; j < (unsigned int)cnt; j++) {
 			if (expbuf[j] != readbuf[j]) {
-				(void)fprintf(stderr,
-					      "read bad data: exp %c got %c)",
-					      expbuf[j], readbuf[j]);
+				tst_res(TINFO, "read bad data: exp %c got %c)",
+				        expbuf[j], readbuf[j]);
 #ifdef LARGE_FILE
-				(void)fprintf(stderr, ", pg %d off %d, "
-					      "(fsize %Ld)\n", i, j,
-					      statbuf.st_size);
+				tst_res(TINFO, ", pg %d off %d, "
+				        "(fsize %Ld)", i, j, statbuf.st_size);
 #else /* LARGE_FILE */
-				(void)fprintf(stderr, ", pg %d off %d, "
-					      "(fsize %ld)\n", i, j,
-					      statbuf.st_size);
+				tst_res(TINFO, ", pg %d off %d, "
+				        "(fsize %ld)", i, j, statbuf.st_size);
 #endif /* LARGE_FILE */
 				close(fd);
 				return 0;
@@ -696,7 +595,7 @@ int fileokay(char *file, uchar_t * expbuf)
 	return 1;
 }
 
- /*ARGSUSED*/ void finish(int sig)
+void finish(int sig LTP_ATTRIBUTE_UNUSED)
 {
 	finished++;
 	return;
@@ -722,17 +621,7 @@ unsigned int initrand(void)
 	return (seed);
 }
 
-/*****  LTP Port        *****/
-void ok_exit(void)
-{
-	tst_resm(TPASS, "Test passed");
-	tst_rmdir();
-	tst_exit();
-}
-
-int anyfail(void)
-{
-	tst_brkm(TFAIL, tst_rmdir, "Test failed");
-}
-
-/*****  **      **      *****/
+static struct tst_test test = {
+	.needs_tmpdir = 1,
+	.cleanup = cleanup,
+};
-- 
2.38.0.rc1.362.ged0d419d3c-goog


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [LTP] [PATCH v3 2/9] mmapstress01: apply make check suggestions
  2022-10-04 18:20 [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Edward Liaw via ltp
  2022-10-04 18:20 ` [LTP] [PATCH v3 1/9] mmapstress01: refactor to tst_test framework Edward Liaw via ltp
@ 2022-10-04 18:20 ` Edward Liaw via ltp
  2022-10-04 18:20 ` [LTP] [PATCH v3 3/9] mmapstress01: refactor options Edward Liaw via ltp
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Edward Liaw via ltp @ 2022-10-04 18:20 UTC (permalink / raw)
  To: ltp; +Cc: kernel-team

Signed-off-by: Edward Liaw <edliaw@google.com>
---
 .../kernel/mem/mmapstress/mmapstress01.c      | 87 ++++++++-----------
 1 file changed, 38 insertions(+), 49 deletions(-)

diff --git a/testcases/kernel/mem/mmapstress/mmapstress01.c b/testcases/kernel/mem/mmapstress/mmapstress01.c
index 41f94a52a..20574314b 100644
--- a/testcases/kernel/mem/mmapstress/mmapstress01.c
+++ b/testcases/kernel/mem/mmapstress/mmapstress01.c
@@ -86,46 +86,36 @@
 #endif
 #define roundup(x, y)	((((x)+((y)-1))/(y))*(y))
 
-extern time_t time(time_t *);
-extern char *ctime(const time_t *);
-extern void *malloc(size_t);
-extern long lrand48(void);
-extern void srand(unsigned int);
-extern void srand48(long);
-extern int rand(void);
-extern int atoi(const char *);
-
 static char *usage =
-    "-p nprocs [-t minutes -f filesize -S sparseoffset -r -o -m -l -d]";
+	"-p nprocs [-t minutes -f filesize -S sparseoffset -r -o -m -l -d]";
 
 static unsigned int initrand(void);
 static void finish(int sig);
 static void child_mapper(char *file, unsigned int procno, unsigned int nprocs);
 static int fileokay(char *file, unsigned char *expbuf);
-static int finished = 0;
-static int leavefile = 0;
+static int finished;
+static int leavefile;
 
-static float alarmtime = 0;
-static unsigned int nprocs = 0;
+static float alarmtime;
+static unsigned int nprocs;
 
-static pid_t *pidarray = NULL;
+static pid_t *pidarray;
 static int wait_stat;
 static int check_for_sanity;
-static unsigned char *buf = NULL;
-
+static unsigned char *buf;
 
-static int debug = 0;
+static int debug;
 #ifdef LARGE_FILE
 static off64_t filesize = FILESIZE;
-static off64_t sparseoffset = 0;
+static off64_t sparseoffset;
 #else /* LARGE_FILE */
 static off_t filesize = FILESIZE;
-static off_t sparseoffset = 0;
+static off_t sparseoffset;
 #endif /* LARGE_FILE */
-static unsigned int randloops = 0;
-static unsigned int dosync = 0;
-static unsigned int do_offset = 0;
-static unsigned int pattern = 0;
+static unsigned int randloops;
+static unsigned int dosync;
+static unsigned int do_offset;
+static unsigned int pattern;
 
 int main(int argc, char *argv[])
 {
@@ -148,9 +138,8 @@ int main(int argc, char *argv[])
 #endif /* LARGE_FILE */
 
 	progname = *argv;
-	if (argc < 2) {
+	if (argc < 2)
 		tst_brk(TBROK, "usage: %s %s", progname, usage);
-	}
 
 	while ((c = getopt(argc, argv, "S:omdlrf:p:t:")) != -1) {
 		switch (c) {
@@ -192,7 +181,7 @@ int main(int argc, char *argv[])
 #endif /* LARGE_FILE */
 			if (sparseoffset % pagesize != 0)
 				tst_brk(TBROK,
-				        "sparseoffset must be pagesize multiple");
+					"sparseoffset must be pagesize multiple");
 			break;
 		default:
 			tst_brk(TBROK, "usage: %s %s", progname, usage);
@@ -208,15 +197,15 @@ int main(int argc, char *argv[])
 
 	if (debug) {
 #ifdef LARGE_FILE
-		tst_res(TINFO, "creating file <%s> with %Ld bytes, pattern %d",
-		        TEST_FILE, filesize, pattern);
+		tst_res(TINFO, "creating file <%s> with %lld bytes, pattern %d",
+			TEST_FILE, filesize, pattern);
 #else /* LARGE_FILE */
 		tst_res(TINFO, "creating file <%s> with %ld bytes, pattern %d",
-		        TEST_FILE, filesize, pattern);
+			TEST_FILE, filesize, pattern);
 #endif /* LARGE_FILE */
 		if (alarmtime)
 			tst_res(TINFO, "running for %f minutes",
-			        alarmtime / 60);
+				alarmtime / 60);
 		else
 			tst_res(TINFO, "running with no time limit");
 	}
@@ -280,7 +269,7 @@ int main(int argc, char *argv[])
 				tst_res(TINFO, "write error");
 			else
 				tst_res(TINFO, "write: wrote %d of %d bytes",
-				        c, write_cnt);
+					c, write_cnt);
 			(void)close(fd);
 			(void)unlink(TEST_FILE);
 			tst_brk(TFAIL, "write error");
@@ -329,13 +318,13 @@ int main(int argc, char *argv[])
 			if (!WIFEXITED(wait_stat)
 			    || WEXITSTATUS(wait_stat) != 0)
 				tst_brk(TFAIL, "child exit with err <x%x>",
-				        wait_stat);
+					wait_stat);
 			for (i = 0; i < nprocs; i++)
 				if (pid == pidarray[i])
 					break;
 			if (i == nprocs)
 				tst_brk(TFAIL, "unknown child pid %d, <x%x>",
-				        pid, wait_stat);
+					pid, wait_stat);
 
 			if ((pid = fork()) == -1) {
 				pidarray[i] = 0;
@@ -449,6 +438,7 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 	if (do_offset) {
 		int pageoffset = lrand48() % mappages;
 		int byteoffset = pageoffset * pagesize;
+
 		offset += byteoffset;
 		mapsize -= byteoffset;
 		mappages -= pageoffset;
@@ -457,14 +447,14 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 
 	if (debug)
 		tst_res(TINFO, "child %d (pid %d): seed %d, fsize %lld, mapsize %ld, off %lld, loop %d",
-		        procno, getpid(), seed, filesize, (long)mapsize,
-		        offset / pagesize, nloops);
+			procno, getpid(), seed, filesize, (long)mapsize,
+			offset / pagesize, nloops);
 #ifdef LARGE_FILE
 	if ((maddr = mmap64(0, mapsize, PROT_READ | PROT_WRITE, MAP_SHARED,
-	                    fd, (off64_t)offset)) == (caddr_t) - 1)
+			    fd, (off64_t)offset)) == (caddr_t) - 1)
 #else /* LARGE_FILE */
 	if ((maddr = mmap(0, mapsize, PROT_READ | PROT_WRITE, MAP_SHARED,
-	                  fd, (off_t)offset)) == (caddr_t) - 1)
+			  fd, (off_t)offset)) == (caddr_t) - 1)
 #endif /* LARGE_FILE */
 		tst_brk(TFAIL, "mmap error");
 
@@ -486,9 +476,9 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 			if (*((unsigned char *)(paddr + i))
 			    != ((procno + pattern) & 0xff))
 				tst_brk(TFAIL, "child %d: invalid data <x%x>\n"
-				        " at pg %d off %d, exp <x%x>", procno,
-				        *((unsigned char *)(paddr + i)),
-				        randpage, i, (procno + pattern) & 0xff);
+					" at pg %d off %d, exp <x%x>", procno,
+					*((unsigned char *)(paddr + i)),
+					randpage, i, (procno + pattern) & 0xff);
 
 			/*
 			 *  Now write it.
@@ -503,7 +493,7 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 		randpage = lrand48() % mappages;
 		paddr = maddr + (randpage * pagesize);	/* page address */
 		if (msync(paddr, (mappages - randpage) * pagesize,
-		          MS_SYNC) == -1)
+			  MS_SYNC) == -1)
 			tst_brk(TFAIL, "msync failed");
 	}
 	if (munmap(maddr, mapsize) == -1)
@@ -566,7 +556,7 @@ int fileokay(char *file, unsigned char *expbuf)
 			 */
 			if ((i * pagesize) + cnt != mapsize) {
 				tst_res(TINFO, "read %d of %ld bytes",
-				        (i * pagesize) + cnt, (long)mapsize);
+					(i * pagesize) + cnt, (long)mapsize);
 				close(fd);
 				return 0;
 			}
@@ -577,13 +567,13 @@ int fileokay(char *file, unsigned char *expbuf)
 		for (j = 0; j < (unsigned int)cnt; j++) {
 			if (expbuf[j] != readbuf[j]) {
 				tst_res(TINFO, "read bad data: exp %c got %c)",
-				        expbuf[j], readbuf[j]);
+					expbuf[j], readbuf[j]);
 #ifdef LARGE_FILE
 				tst_res(TINFO, ", pg %d off %d, "
-				        "(fsize %Ld)", i, j, statbuf.st_size);
+					"(fsize %lld)", i, j, statbuf.st_size);
 #else /* LARGE_FILE */
 				tst_res(TINFO, ", pg %d off %d, "
-				        "(fsize %ld)", i, j, statbuf.st_size);
+					"(fsize %ld)", i, j, statbuf.st_size);
 #endif /* LARGE_FILE */
 				close(fd);
 				return 0;
@@ -598,7 +588,6 @@ int fileokay(char *file, unsigned char *expbuf)
 void finish(int sig LTP_ATTRIBUTE_UNUSED)
 {
 	finished++;
-	return;
 }
 
 unsigned int initrand(void)
@@ -617,8 +606,8 @@ unsigned int initrand(void)
 	seed = rand();
 	srand((unsigned int)time(NULL));
 	seed = (seed ^ rand()) % 100000;
-	srand48((long int)seed);
-	return (seed);
+	srand48((long)seed);
+	return seed;
 }
 
 static struct tst_test test = {
-- 
2.38.0.rc1.362.ged0d419d3c-goog


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [LTP] [PATCH v3 3/9] mmapstress01: refactor options
  2022-10-04 18:20 [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Edward Liaw via ltp
  2022-10-04 18:20 ` [LTP] [PATCH v3 1/9] mmapstress01: refactor to tst_test framework Edward Liaw via ltp
  2022-10-04 18:20 ` [LTP] [PATCH v3 2/9] mmapstress01: apply make check suggestions Edward Liaw via ltp
@ 2022-10-04 18:20 ` Edward Liaw via ltp
  2022-10-04 18:20 ` [LTP] [PATCH v3 4/9] mmapstress01: use FILE_OFFSET_BITS=64 Edward Liaw via ltp
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Edward Liaw via ltp @ 2022-10-04 18:20 UTC (permalink / raw)
  To: ltp; +Cc: kernel-team

Signed-off-by: Edward Liaw <edliaw@google.com>
---
 .../kernel/mem/mmapstress/mmapstress01.c      | 195 ++++++++----------
 1 file changed, 90 insertions(+), 105 deletions(-)

diff --git a/testcases/kernel/mem/mmapstress/mmapstress01.c b/testcases/kernel/mem/mmapstress/mmapstress01.c
index 20574314b..33213a0f0 100644
--- a/testcases/kernel/mem/mmapstress/mmapstress01.c
+++ b/testcases/kernel/mem/mmapstress/mmapstress01.c
@@ -74,7 +74,7 @@
 #include <errno.h>
 #include <sys/types.h>
 #include <limits.h>
-#define TST_NO_DEFAULT_MAIN
+#include <float.h>
 #include "tst_test.h"
 
 #define MAXLOOPS	500	/* max pages for map children to write */
@@ -86,49 +86,103 @@
 #endif
 #define roundup(x, y)	((((x)+((y)-1))/(y))*(y))
 
-static char *usage =
-	"-p nprocs [-t minutes -f filesize -S sparseoffset -r -o -m -l -d]";
-
 static unsigned int initrand(void);
 static void finish(int sig);
 static void child_mapper(char *file, unsigned int procno, unsigned int nprocs);
 static int fileokay(char *file, unsigned char *expbuf);
 static int finished;
-static int leavefile;
+
+static char *debug;
+static char *leavefile;
+static char *do_sync;
+static char *do_offset;
+static char *randloops;
+static char *opt_filesize;
+static char *opt_nprocs;
+static char *opt_sparseoffset;
+static char *opt_alarmtime;
 
 static float alarmtime;
-static unsigned int nprocs;
+static int nprocs;
+static long long filesize = FILESIZE;
+static long long sparseoffset;
+static unsigned int pattern;
 
 static pid_t *pidarray;
 static int wait_stat;
 static int check_for_sanity;
 static unsigned char *buf;
 
-static int debug;
+static struct tst_option options[] = {
+	{"d", &debug, "Enable debug output"},
+	{"f:", &opt_filesize, "Initial filesize (default 4096)"},
+	{"l", &leavefile, "Don't remove the output file on program exit"},
+	{"m", &do_sync, "Do random msync/fsyncs as well"},
+	{"o", &do_offset, "Randomize the offset of file to map"},
+	{"p:", &opt_nprocs, "Number of mapping children to create (required)"},
+	{"r", &randloops,
+	 "Randomize number of pages map children check (random % MAXLOOPS), "
+	 "otherwise each child checks MAXLOOPS pages"},
+	{"S:", &opt_sparseoffset,
+	 "When non-zero, causes the sparse area to be left before the data, "
+	 "so that the actual initial filesize is sparseoffset + filesize "
+	 "(default 0)"},
+	{"t:", &opt_alarmtime, "Number of minutes to run (default 0)"},
+	{},
+};
+
+static void setup(void)
+{
+	int pagesize = sysconf(_SC_PAGE_SIZE);
+
+	if (!opt_nprocs)
+		tst_brk(TBROK,
+			"missing number of mapping children, specify with -p nprocs");
+
 #ifdef LARGE_FILE
-static off64_t filesize = FILESIZE;
-static off64_t sparseoffset;
-#else /* LARGE_FILE */
-static off_t filesize = FILESIZE;
-static off_t sparseoffset;
-#endif /* LARGE_FILE */
-static unsigned int randloops;
-static unsigned int dosync;
-static unsigned int do_offset;
-static unsigned int pattern;
+	if (tst_parse_filesize(opt_filesize, &filesize, 0, LONG_MAX))
+#else
+	if (tst_parse_filesize(opt_filesize, &filesize, 0, INT_MAX))
+#endif
+		tst_brk(TBROK, "invalid initial filesize '%s'", opt_filesize);
+
+#ifdef LARGE_FILE
+	if (tst_parse_filesize(opt_sparseoffset, &sparseoffset, LONG_MIN, LONG_MAX))
+#else
+	if (tst_parse_filesize(opt_sparseoffset, &sparseoffset, INT_MIN, INT_MAX))
+#endif
+		tst_brk(TBROK, "invalid sparse offset '%s'", opt_sparseoffset);
+	if (sparseoffset % pagesize != 0)
+		tst_brk(TBROK, "sparseoffset must be pagesize multiple");
 
-int main(int argc, char *argv[])
+	if (tst_parse_int(opt_nprocs, &nprocs, 0, 255))
+		tst_brk(TBROK, "invalid number of mapping children '%s'",
+			opt_nprocs);
+
+	if (tst_parse_float(opt_alarmtime, &alarmtime, 0, FLT_MAX / 60))
+		tst_brk(TBROK, "invalid minutes to run '%s'", opt_alarmtime);
+
+	if (debug) {
+		tst_res(TINFO, "creating file <%s> with %lld bytes, pattern %d",
+			TEST_FILE, filesize, pattern);
+		if (alarmtime)
+			tst_res(TINFO, "running for %f minutes", alarmtime);
+		else
+			tst_res(TINFO, "running with no time limit");
+	}
+	alarmtime *= 60;
+}
+
+static void run(void)
 {
-	char *progname;
 	int fd;
 	int c;
-	extern char *optarg;
-	unsigned int procno;
+	int procno;
 	pid_t pid;
 	unsigned int seed;
 	int pagesize = sysconf(_SC_PAGE_SIZE);
 	struct sigaction sa;
-	unsigned int i;
+	int i;
 	int write_cnt;
 	unsigned char data;
 #ifdef LARGE_FILE
@@ -137,81 +191,9 @@ int main(int argc, char *argv[])
 	off_t bytes_left;
 #endif /* LARGE_FILE */
 
-	progname = *argv;
-	if (argc < 2)
-		tst_brk(TBROK, "usage: %s %s", progname, usage);
-
-	while ((c = getopt(argc, argv, "S:omdlrf:p:t:")) != -1) {
-		switch (c) {
-		case 'd':
-			debug = 1;
-			break;
-		case 't':
-			alarmtime = atof(optarg) * 60;
-			break;
-		case 'p':
-			nprocs = atoi(optarg);
-			break;
-		case 'l':
-			leavefile = 1;
-			break;
-		case 'f':
-#ifdef LARGE_FILE
-			filesize = atoll(optarg);
-#else /* LARGE_FILE */
-			filesize = atoi(optarg);
-#endif /* LARGE_FILE */
-			if (filesize < 0)
-				tst_brk(TBROK, "error: negative filesize");
-			break;
-		case 'r':
-			randloops = 1;
-			break;
-		case 'm':
-			dosync = 1;
-			break;
-		case 'o':
-			do_offset = 1;
-			break;
-		case 'S':
-#ifdef LARGE_FILE
-			sparseoffset = atoll(optarg);
-#else /* LARGE_FILE */
-			sparseoffset = atoi(optarg);
-#endif /* LARGE_FILE */
-			if (sparseoffset % pagesize != 0)
-				tst_brk(TBROK,
-					"sparseoffset must be pagesize multiple");
-			break;
-		default:
-			tst_brk(TBROK, "usage: %s %s", progname, usage);
-		}
-	}
-
-	/* nprocs is >= 0 since it's unsigned */
-	if (nprocs > 255)
-		tst_brk(TBROK, "invalid nprocs %d - (range 0-255)", nprocs);
-
 	seed = initrand();
 	pattern = seed & 0xff;
 
-	if (debug) {
-#ifdef LARGE_FILE
-		tst_res(TINFO, "creating file <%s> with %lld bytes, pattern %d",
-			TEST_FILE, filesize, pattern);
-#else /* LARGE_FILE */
-		tst_res(TINFO, "creating file <%s> with %ld bytes, pattern %d",
-			TEST_FILE, filesize, pattern);
-#endif /* LARGE_FILE */
-		if (alarmtime)
-			tst_res(TINFO, "running for %f minutes",
-				alarmtime / 60);
-		else
-			tst_res(TINFO, "running with no time limit");
-	}
-
-	tst_reinit();
-
 	/*
 	 *  Plan for death by signal.  User may have specified
 	 *  a time limit, in which set an alarm and catch SIGALRM.
@@ -289,7 +271,7 @@ int main(int argc, char *argv[])
 			break;
 
 		case 0:
-			child_mapper(TEST_FILE, procno, nprocs);
+			child_mapper(TEST_FILE, (unsigned int)procno, (unsigned int)nprocs);
 			exit(0);
 
 		default:
@@ -330,7 +312,7 @@ int main(int argc, char *argv[])
 				pidarray[i] = 0;
 				tst_brk(TFAIL, "fork error");
 			} else if (pid == 0) {	/* child */
-				child_mapper(TEST_FILE, i, nprocs);
+				child_mapper(TEST_FILE, (unsigned int)i, (unsigned int)nprocs);
 				exit(0);
 			} else {
 				pidarray[i] = pid;
@@ -447,14 +429,14 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 
 	if (debug)
 		tst_res(TINFO, "child %d (pid %d): seed %d, fsize %lld, mapsize %ld, off %lld, loop %d",
-			procno, getpid(), seed, filesize, (long)mapsize,
-			offset / pagesize, nloops);
+			procno, getpid(), seed, (long long)filesize,
+			(long)mapsize, (long long)offset / pagesize, nloops);
 #ifdef LARGE_FILE
 	if ((maddr = mmap64(0, mapsize, PROT_READ | PROT_WRITE, MAP_SHARED,
-			    fd, (off64_t)offset)) == (caddr_t) - 1)
+			    fd, offset)) == (caddr_t) - 1)
 #else /* LARGE_FILE */
 	if ((maddr = mmap(0, mapsize, PROT_READ | PROT_WRITE, MAP_SHARED,
-			  fd, (off_t)offset)) == (caddr_t) - 1)
+			  fd, offset)) == (caddr_t) - 1)
 #endif /* LARGE_FILE */
 		tst_brk(TFAIL, "mmap error");
 
@@ -486,7 +468,7 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 			*(paddr + i) = (procno + pattern) & 0xff;
 		}
 	}
-	if (dosync) {
+	if (do_sync) {
 		/*
 		 * Exercise msync() as well!
 		 */
@@ -569,11 +551,11 @@ int fileokay(char *file, unsigned char *expbuf)
 				tst_res(TINFO, "read bad data: exp %c got %c)",
 					expbuf[j], readbuf[j]);
 #ifdef LARGE_FILE
-				tst_res(TINFO, ", pg %d off %d, "
-					"(fsize %lld)", i, j, statbuf.st_size);
+				tst_res(TINFO, ", pg %d off %d, (fsize %lld)",
+					i, j, statbuf.st_size);
 #else /* LARGE_FILE */
-				tst_res(TINFO, ", pg %d off %d, "
-					"(fsize %ld)", i, j, statbuf.st_size);
+				tst_res(TINFO, ", pg %d off %d, (fsize %ld)",
+					i, j, statbuf.st_size);
 #endif /* LARGE_FILE */
 				close(fd);
 				return 0;
@@ -612,5 +594,8 @@ unsigned int initrand(void)
 
 static struct tst_test test = {
 	.needs_tmpdir = 1,
+	.test_all = run,
+	.setup = setup,
+	.options = options,
 	.cleanup = cleanup,
 };
-- 
2.38.0.rc1.362.ged0d419d3c-goog


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [LTP] [PATCH v3 4/9] mmapstress01: use FILE_OFFSET_BITS=64
  2022-10-04 18:20 [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Edward Liaw via ltp
                   ` (2 preceding siblings ...)
  2022-10-04 18:20 ` [LTP] [PATCH v3 3/9] mmapstress01: refactor options Edward Liaw via ltp
@ 2022-10-04 18:20 ` Edward Liaw via ltp
  2022-10-04 18:20 ` [LTP] [PATCH v3 5/9] mmapstress01: use safe macros Edward Liaw via ltp
                   ` (5 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Edward Liaw via ltp @ 2022-10-04 18:20 UTC (permalink / raw)
  To: ltp; +Cc: kernel-team

Build tests with FILE_OFFSET_BITS=64 instead of doing LARGE_FILE checks
to switch between 32 and 64 bit types and syscalls.

Signed-off-by: Edward Liaw <edliaw@google.com>
---
 testcases/kernel/mem/mmapstress/Makefile      |  2 +
 .../kernel/mem/mmapstress/mmapstress01.c      | 70 +++----------------
 2 files changed, 10 insertions(+), 62 deletions(-)

diff --git a/testcases/kernel/mem/mmapstress/Makefile b/testcases/kernel/mem/mmapstress/Makefile
index 744f099d8..b30bd34b8 100644
--- a/testcases/kernel/mem/mmapstress/Makefile
+++ b/testcases/kernel/mem/mmapstress/Makefile
@@ -5,3 +5,5 @@ top_srcdir              ?= ../../../..
 
 include $(top_srcdir)/include/mk/testcases.mk
 include $(top_srcdir)/include/mk/generic_leaf_target.mk
+
+mmapstress01: CFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
diff --git a/testcases/kernel/mem/mmapstress/mmapstress01.c b/testcases/kernel/mem/mmapstress/mmapstress01.c
index 33213a0f0..3f7f617c6 100644
--- a/testcases/kernel/mem/mmapstress/mmapstress01.c
+++ b/testcases/kernel/mem/mmapstress/mmapstress01.c
@@ -139,14 +139,14 @@ static void setup(void)
 		tst_brk(TBROK,
 			"missing number of mapping children, specify with -p nprocs");
 
-#ifdef LARGE_FILE
+#if _FILE_OFFSET_BITS == 64
 	if (tst_parse_filesize(opt_filesize, &filesize, 0, LONG_MAX))
 #else
 	if (tst_parse_filesize(opt_filesize, &filesize, 0, INT_MAX))
 #endif
 		tst_brk(TBROK, "invalid initial filesize '%s'", opt_filesize);
 
-#ifdef LARGE_FILE
+#if _FILE_OFFSET_BITS == 64
 	if (tst_parse_filesize(opt_sparseoffset, &sparseoffset, LONG_MIN, LONG_MAX))
 #else
 	if (tst_parse_filesize(opt_sparseoffset, &sparseoffset, INT_MIN, INT_MAX))
@@ -185,11 +185,7 @@ static void run(void)
 	int i;
 	int write_cnt;
 	unsigned char data;
-#ifdef LARGE_FILE
-	off64_t bytes_left;
-#else /* LARGE_FILE */
 	off_t bytes_left;
-#endif /* LARGE_FILE */
 
 	seed = initrand();
 	pattern = seed & 0xff;
@@ -216,13 +212,8 @@ static void run(void)
 			tst_brk(TFAIL, "sigaction error");
 		(void)alarm(alarmtime);
 	}
-#ifdef LARGE_FILE
-	if ((fd = open64(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, 0664)) == -1) {
-#else /* LARGE_FILE */
-	if ((fd = open(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, 0664)) == -1) {
-#endif /* LARGE_FILE */
+	if ((fd = open(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, 0664)) == -1)
 		tst_brk(TFAIL, "open error");
-	}
 
 	if ((buf = malloc(pagesize)) == NULL
 	    || (pidarray = malloc(nprocs * sizeof(pid_t))) == NULL) {
@@ -237,13 +228,8 @@ static void run(void)
 		if (++data == nprocs)
 			data = 0;
 	}
-#ifdef LARGE_FILE
-	if (lseek64(fd, (off64_t)sparseoffset, SEEK_SET) < 0) {
-#else /* LARGE_FILE */
-	if (lseek(fd, (off_t)sparseoffset, SEEK_SET) < 0) {
-#endif /* LARGE_FILE */
+	if (lseek(fd, (off_t)sparseoffset, SEEK_SET) < 0)
 		tst_brk(TFAIL, "lseek");
-	}
 	for (bytes_left = filesize; bytes_left; bytes_left -= c) {
 		write_cnt = MIN(pagesize, (int)bytes_left);
 		if ((c = write(fd, buf, write_cnt)) != write_cnt) {
@@ -374,15 +360,9 @@ static void cleanup(void)
  */
 void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 {
-#ifdef LARGE_FILE
-	struct stat64 statbuf;
-	off64_t filesize;
-	off64_t offset;
-#else /* LARGE_FILE */
 	struct stat statbuf;
 	off_t filesize;
 	off_t offset;
-#endif /* LARGE_FILE */
 	size_t validsize;
 	size_t mapsize;
 	char *maddr = NULL, *paddr;
@@ -397,19 +377,11 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 
 	seed = initrand();	/* initialize random seed */
 
-#ifdef LARGE_FILE
-	if (stat64(file, &statbuf) == -1)
-#else /* LARGE_FILE */
 	if (stat(file, &statbuf) == -1)
-#endif /* LARGE_FILE */
 		tst_brk(TFAIL, "stat error");
 	filesize = statbuf.st_size;
 
-#ifdef LARGE_FILE
-	if ((fd = open64(file, O_RDWR)) == -1)
-#else /* LARGE_FILE */
 	if ((fd = open(file, O_RDWR)) == -1)
-#endif /* LARGE_FILE */
 		tst_brk(TFAIL, "open error");
 
 	if (statbuf.st_size - sparseoffset > UINT_MAX)
@@ -431,13 +403,8 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 		tst_res(TINFO, "child %d (pid %d): seed %d, fsize %lld, mapsize %ld, off %lld, loop %d",
 			procno, getpid(), seed, (long long)filesize,
 			(long)mapsize, (long long)offset / pagesize, nloops);
-#ifdef LARGE_FILE
-	if ((maddr = mmap64(0, mapsize, PROT_READ | PROT_WRITE, MAP_SHARED,
-			    fd, offset)) == (caddr_t) - 1)
-#else /* LARGE_FILE */
 	if ((maddr = mmap(0, mapsize, PROT_READ | PROT_WRITE, MAP_SHARED,
 			  fd, offset)) == (caddr_t) - 1)
-#endif /* LARGE_FILE */
 		tst_brk(TFAIL, "mmap error");
 
 	(void)close(fd);
@@ -488,11 +455,7 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
  */
 int fileokay(char *file, unsigned char *expbuf)
 {
-#ifdef LARGE_FILE
-	struct stat64 statbuf;
-#else /* LARGE_FILE */
 	struct stat statbuf;
-#endif /* LARGE_FILE */
 	size_t mapsize;
 	unsigned int mappages;
 	unsigned int pagesize = sysconf(_SC_PAGE_SIZE);
@@ -501,25 +464,13 @@ int fileokay(char *file, unsigned char *expbuf)
 	int cnt;
 	unsigned int i, j;
 
-#ifdef LARGE_FILE
-	if ((fd = open64(file, O_RDONLY)) == -1)
-#else /* LARGE_FILE */
 	if ((fd = open(file, O_RDONLY)) == -1)
-#endif /* LARGE_FILE */
 		tst_brk(TFAIL, "open error");
 
-#ifdef LARGE_FILE
-	if (fstat64(fd, &statbuf) == -1)
-#else /* LARGE_FILE */
 	if (fstat(fd, &statbuf) == -1)
-#endif /* LARGE_FILE */
 		tst_brk(TFAIL, "stat error");
 
-#ifdef LARGE_FILE
-	if (lseek64(fd, sparseoffset, SEEK_SET) < 0)
-#else /* LARGE_FILE */
 	if (lseek(fd, sparseoffset, SEEK_SET) < 0)
-#endif /* LARGE_FILE */
 		tst_brk(TFAIL, "lseek");
 
 	if (statbuf.st_size - sparseoffset > UINT_MAX)
@@ -548,15 +499,10 @@ int fileokay(char *file, unsigned char *expbuf)
 		 */
 		for (j = 0; j < (unsigned int)cnt; j++) {
 			if (expbuf[j] != readbuf[j]) {
-				tst_res(TINFO, "read bad data: exp %c got %c)",
-					expbuf[j], readbuf[j]);
-#ifdef LARGE_FILE
-				tst_res(TINFO, ", pg %d off %d, (fsize %lld)",
-					i, j, statbuf.st_size);
-#else /* LARGE_FILE */
-				tst_res(TINFO, ", pg %d off %d, (fsize %ld)",
-					i, j, statbuf.st_size);
-#endif /* LARGE_FILE */
+				tst_res(TINFO,
+					"read bad data: exp %c got %c, pg %d off %d, (fsize %lld)",
+					expbuf[j], readbuf[j], i, j,
+					(long long)statbuf.st_size);
 				close(fd);
 				return 0;
 			}
-- 
2.38.0.rc1.362.ged0d419d3c-goog


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [LTP] [PATCH v3 5/9] mmapstress01: use safe macros
  2022-10-04 18:20 [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Edward Liaw via ltp
                   ` (3 preceding siblings ...)
  2022-10-04 18:20 ` [LTP] [PATCH v3 4/9] mmapstress01: use FILE_OFFSET_BITS=64 Edward Liaw via ltp
@ 2022-10-04 18:20 ` Edward Liaw via ltp
  2022-10-04 18:20 ` [LTP] [PATCH v3 6/9] mmapstress01: refactor cleanup and drop leavefile option Edward Liaw via ltp
                   ` (4 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Edward Liaw via ltp @ 2022-10-04 18:20 UTC (permalink / raw)
  To: ltp; +Cc: kernel-team

Signed-off-by: Edward Liaw <edliaw@google.com>
---
 .../kernel/mem/mmapstress/mmapstress01.c      | 91 +++++++------------
 1 file changed, 33 insertions(+), 58 deletions(-)

diff --git a/testcases/kernel/mem/mmapstress/mmapstress01.c b/testcases/kernel/mem/mmapstress/mmapstress01.c
index 3f7f617c6..165db2b81 100644
--- a/testcases/kernel/mem/mmapstress/mmapstress01.c
+++ b/testcases/kernel/mem/mmapstress/mmapstress01.c
@@ -186,6 +186,7 @@ static void run(void)
 	int write_cnt;
 	unsigned char data;
 	off_t bytes_left;
+	sigset_t set_mask;
 
 	seed = initrand();
 	pattern = seed & 0xff;
@@ -197,28 +198,19 @@ static void run(void)
 	 */
 	sa.sa_handler = finish;
 	sa.sa_flags = 0;
-	if (sigemptyset(&sa.sa_mask))
-		tst_brk(TFAIL, "sigemptyset error");
-
-	if (sigaction(SIGINT, &sa, 0) == -1)
-		tst_brk(TFAIL, "sigaction error SIGINT");
-	if (sigaction(SIGQUIT, &sa, 0) == -1)
-		tst_brk(TFAIL, "sigaction error SIGQUIT");
-	if (sigaction(SIGTERM, &sa, 0) == -1)
-		tst_brk(TFAIL, "sigaction error SIGTERM");
+	SAFE_SIGEMPTYSET(&sa.sa_mask);
+	SAFE_SIGACTION(SIGINT, &sa, 0);
+	SAFE_SIGACTION(SIGQUIT, &sa, 0);
+	SAFE_SIGACTION(SIGTERM, &sa, 0);
 
 	if (alarmtime) {
-		if (sigaction(SIGALRM, &sa, 0) == -1)
-			tst_brk(TFAIL, "sigaction error");
+		SAFE_SIGACTION(SIGALRM, &sa, 0);
 		(void)alarm(alarmtime);
 	}
-	if ((fd = open(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, 0664)) == -1)
-		tst_brk(TFAIL, "open error");
+	fd = SAFE_OPEN(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, 0664);
 
-	if ((buf = malloc(pagesize)) == NULL
-	    || (pidarray = malloc(nprocs * sizeof(pid_t))) == NULL) {
-		tst_brk(TFAIL, "malloc error");
-	}
+	buf = SAFE_MALLOC(pagesize);
+	pidarray = SAFE_MALLOC(nprocs * sizeof(pid_t));
 
 	for (i = 0; i < nprocs; i++)
 		*(pidarray + i) = 0;
@@ -228,23 +220,12 @@ static void run(void)
 		if (++data == nprocs)
 			data = 0;
 	}
-	if (lseek(fd, (off_t)sparseoffset, SEEK_SET) < 0)
-		tst_brk(TFAIL, "lseek");
+	SAFE_LSEEK(fd, (off_t)sparseoffset, SEEK_SET);
 	for (bytes_left = filesize; bytes_left; bytes_left -= c) {
 		write_cnt = MIN(pagesize, (int)bytes_left);
-		if ((c = write(fd, buf, write_cnt)) != write_cnt) {
-			if (c == -1)
-				tst_res(TINFO, "write error");
-			else
-				tst_res(TINFO, "write: wrote %d of %d bytes",
-					c, write_cnt);
-			(void)close(fd);
-			(void)unlink(TEST_FILE);
-			tst_brk(TFAIL, "write error");
-		}
+		c = SAFE_WRITE(1, fd, buf, write_cnt);
 	}
-
-	(void)close(fd);
+	SAFE_CLOSE(fd);
 
 	/*
 	 *  Fork off mmap children.
@@ -269,14 +250,16 @@ static void run(void)
 	 *  Now wait for children and refork them as needed.
 	 */
 
+	SAFE_SIGEMPTYSET(&set_mask);
+	SAFE_SIGADDSET(&set_mask, SIGALRM);
+	SAFE_SIGADDSET(&set_mask, SIGINT);
 	while (!finished) {
 		pid = wait(&wait_stat);
 		/*
 		 *  Block signals while processing child exit.
 		 */
 
-		if (sighold(SIGALRM) || sighold(SIGINT))
-			tst_brk(TFAIL, "sighold error");
+		SAFE_SIGPROCMASK(SIG_BLOCK, &set_mask, NULL);
 
 		if (pid != -1) {
 			/*
@@ -312,8 +295,7 @@ static void run(void)
 			if (errno != EINTR || !finished)
 				tst_brk(TFAIL, "unexpected wait error");
 		}
-		if (sigrelse(SIGALRM) || sigrelse(SIGINT))
-			tst_brk(TFAIL, "sigrelse error");
+		SAFE_SIGPROCMASK(SIG_UNBLOCK, &set_mask, NULL);
 	}
 
 	/*
@@ -321,8 +303,9 @@ static void run(void)
 	 *  the children and done!.
 	 */
 
-	if (sighold(SIGALRM))
-		tst_brk(TFAIL, "sighold error");
+	SAFE_SIGEMPTYSET(&set_mask);
+	SAFE_SIGADDSET(&set_mask, SIGALRM);
+	SAFE_SIGPROCMASK(SIG_BLOCK, &set_mask, NULL);
 	(void)alarm(0);
 	check_for_sanity = 1;
 	tst_res(TPASS, "finished, cleaning up");
@@ -343,7 +326,7 @@ static void cleanup(void)
 		} else {
 			tst_res(TINFO, "file data okay");
 			if (!leavefile)
-				(void)unlink(TEST_FILE);
+				SAFE_UNLINK(TEST_FILE);
 			tst_res(TPASS, "test passed");
 		}
 	} else {
@@ -377,12 +360,10 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 
 	seed = initrand();	/* initialize random seed */
 
-	if (stat(file, &statbuf) == -1)
-		tst_brk(TFAIL, "stat error");
+	SAFE_STAT(file, &statbuf);
 	filesize = statbuf.st_size;
 
-	if ((fd = open(file, O_RDWR)) == -1)
-		tst_brk(TFAIL, "open error");
+	fd = SAFE_OPEN(file, O_RDWR);
 
 	if (statbuf.st_size - sparseoffset > UINT_MAX)
 		tst_brk(TFAIL, "size_t overflow when setting up map");
@@ -403,11 +384,10 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 		tst_res(TINFO, "child %d (pid %d): seed %d, fsize %lld, mapsize %ld, off %lld, loop %d",
 			procno, getpid(), seed, (long long)filesize,
 			(long)mapsize, (long long)offset / pagesize, nloops);
-	if ((maddr = mmap(0, mapsize, PROT_READ | PROT_WRITE, MAP_SHARED,
-			  fd, offset)) == (caddr_t) - 1)
-		tst_brk(TFAIL, "mmap error");
 
-	(void)close(fd);
+	maddr = SAFE_MMAP(0, mapsize, PROT_READ | PROT_WRITE, MAP_SHARED, fd,
+			  offset);
+	SAFE_CLOSE(fd);
 
 	/*
 	 *  Now loop read/writing random pages.
@@ -445,8 +425,7 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 			  MS_SYNC) == -1)
 			tst_brk(TFAIL, "msync failed");
 	}
-	if (munmap(maddr, mapsize) == -1)
-		tst_brk(TFAIL, "munmap failed");
+	SAFE_MUNMAP(maddr, mapsize);
 	exit(0);
 }
 
@@ -464,14 +443,10 @@ int fileokay(char *file, unsigned char *expbuf)
 	int cnt;
 	unsigned int i, j;
 
-	if ((fd = open(file, O_RDONLY)) == -1)
-		tst_brk(TFAIL, "open error");
-
-	if (fstat(fd, &statbuf) == -1)
-		tst_brk(TFAIL, "stat error");
+	fd = SAFE_OPEN(file, O_RDONLY);
 
-	if (lseek(fd, sparseoffset, SEEK_SET) < 0)
-		tst_brk(TFAIL, "lseek");
+	SAFE_FSTAT(fd, &statbuf);
+	SAFE_LSEEK(fd, sparseoffset, SEEK_SET);
 
 	if (statbuf.st_size - sparseoffset > UINT_MAX)
 		tst_brk(TFAIL, "size_t overflow when setting up map");
@@ -490,7 +465,7 @@ int fileokay(char *file, unsigned char *expbuf)
 			if ((i * pagesize) + cnt != mapsize) {
 				tst_res(TINFO, "read %d of %ld bytes",
 					(i * pagesize) + cnt, (long)mapsize);
-				close(fd);
+				SAFE_CLOSE(fd);
 				return 0;
 			}
 		}
@@ -503,12 +478,12 @@ int fileokay(char *file, unsigned char *expbuf)
 					"read bad data: exp %c got %c, pg %d off %d, (fsize %lld)",
 					expbuf[j], readbuf[j], i, j,
 					(long long)statbuf.st_size);
-				close(fd);
+				SAFE_CLOSE(fd);
 				return 0;
 			}
 		}
 	}
-	close(fd);
+	SAFE_CLOSE(fd);
 
 	return 1;
 }
-- 
2.38.0.rc1.362.ged0d419d3c-goog


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [LTP] [PATCH v3 6/9] mmapstress01: refactor cleanup and drop leavefile option
  2022-10-04 18:20 [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Edward Liaw via ltp
                   ` (4 preceding siblings ...)
  2022-10-04 18:20 ` [LTP] [PATCH v3 5/9] mmapstress01: use safe macros Edward Liaw via ltp
@ 2022-10-04 18:20 ` Edward Liaw via ltp
  2022-10-04 18:20 ` [LTP] [PATCH v3 7/9] mmapstress01: use SAFE_FORK Edward Liaw via ltp
                   ` (3 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Edward Liaw via ltp @ 2022-10-04 18:20 UTC (permalink / raw)
  To: ltp; +Cc: kernel-team

Signed-off-by: Edward Liaw <edliaw@google.com>
---
 .../kernel/mem/mmapstress/mmapstress01.c      | 84 ++++++-------------
 1 file changed, 25 insertions(+), 59 deletions(-)

diff --git a/testcases/kernel/mem/mmapstress/mmapstress01.c b/testcases/kernel/mem/mmapstress/mmapstress01.c
index 165db2b81..7e8226700 100644
--- a/testcases/kernel/mem/mmapstress/mmapstress01.c
+++ b/testcases/kernel/mem/mmapstress/mmapstress01.c
@@ -89,11 +89,9 @@
 static unsigned int initrand(void);
 static void finish(int sig);
 static void child_mapper(char *file, unsigned int procno, unsigned int nprocs);
-static int fileokay(char *file, unsigned char *expbuf);
-static int finished;
+static void fileokay(char *file, unsigned char *expbuf);
 
 static char *debug;
-static char *leavefile;
 static char *do_sync;
 static char *do_offset;
 static char *randloops;
@@ -102,21 +100,17 @@ static char *opt_nprocs;
 static char *opt_sparseoffset;
 static char *opt_alarmtime;
 
+static int fd;
 static float alarmtime;
 static int nprocs;
 static long long filesize = FILESIZE;
 static long long sparseoffset;
 static unsigned int pattern;
-
-static pid_t *pidarray;
-static int wait_stat;
-static int check_for_sanity;
-static unsigned char *buf;
+static int finished;
 
 static struct tst_option options[] = {
 	{"d", &debug, "Enable debug output"},
 	{"f:", &opt_filesize, "Initial filesize (default 4096)"},
-	{"l", &leavefile, "Don't remove the output file on program exit"},
 	{"m", &do_sync, "Do random msync/fsyncs as well"},
 	{"o", &do_offset, "Randomize the offset of file to map"},
 	{"p:", &opt_nprocs, "Number of mapping children to create (required)"},
@@ -175,7 +169,6 @@ static void setup(void)
 
 static void run(void)
 {
-	int fd;
 	int c;
 	int procno;
 	pid_t pid;
@@ -187,6 +180,9 @@ static void run(void)
 	unsigned char data;
 	off_t bytes_left;
 	sigset_t set_mask;
+	pid_t *pidarray = NULL;
+	int wait_stat;
+	unsigned char *buf;
 
 	seed = initrand();
 	pattern = seed & 0xff;
@@ -298,40 +294,22 @@ static void run(void)
 		SAFE_SIGPROCMASK(SIG_UNBLOCK, &set_mask, NULL);
 	}
 
-	/*
-	 *  Finished!  Check the file for sanity, then kill all
-	 *  the children and done!.
-	 */
-
 	SAFE_SIGEMPTYSET(&set_mask);
 	SAFE_SIGADDSET(&set_mask, SIGALRM);
 	SAFE_SIGPROCMASK(SIG_BLOCK, &set_mask, NULL);
 	(void)alarm(0);
-	check_for_sanity = 1;
-	tst_res(TPASS, "finished, cleaning up");
+
+	/*
+	 *  Finished!  Check the file for sanity.
+	 */
+	fileokay(TEST_FILE, buf);
+	tst_res(TPASS, "file has expected data");
 }
 
 static void cleanup(void)
 {
-	for (int i = 0; i < nprocs; i++)
-		(void)kill(pidarray[i], SIGKILL);
-
-	while (wait(&wait_stat) != -1 || errno != ECHILD)
-		continue;
-
-	if (check_for_sanity) {		/* only check file if no errors */
-		if (!fileokay(TEST_FILE, buf)) {
-			tst_res(TINFO, "  leaving file <%s>", TEST_FILE);
-			tst_brk(TFAIL, "file data incorrect");
-		} else {
-			tst_res(TINFO, "file data okay");
-			if (!leavefile)
-				SAFE_UNLINK(TEST_FILE);
-			tst_res(TPASS, "test passed");
-		}
-	} else {
-		tst_res(TINFO, "  leaving file <%s>", TEST_FILE);
-	}
+	if (fd > 0)
+		SAFE_CLOSE(fd);
 }
 
 /*
@@ -341,7 +319,7 @@ static void cleanup(void)
  *  determined based on nprocs & procno).  After a specific number of
  *  iterations, it exits.
  */
-void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
+static void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 {
 	struct stat statbuf;
 	off_t filesize;
@@ -349,7 +327,6 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 	size_t validsize;
 	size_t mapsize;
 	char *maddr = NULL, *paddr;
-	int fd;
 	size_t pagesize = sysconf(_SC_PAGE_SIZE);
 	unsigned int randpage;
 	unsigned int seed;
@@ -432,14 +409,13 @@ void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 /*
  *  Make sure file has all the correct data.
  */
-int fileokay(char *file, unsigned char *expbuf)
+static void fileokay(char *file, unsigned char *expbuf)
 {
 	struct stat statbuf;
 	size_t mapsize;
 	unsigned int mappages;
 	unsigned int pagesize = sysconf(_SC_PAGE_SIZE);
 	unsigned char readbuf[pagesize];
-	int fd;
 	int cnt;
 	unsigned int i, j;
 
@@ -455,45 +431,35 @@ int fileokay(char *file, unsigned char *expbuf)
 	mappages = roundup(mapsize, pagesize) / pagesize;
 
 	for (i = 0; i < mappages; i++) {
-		cnt = read(fd, readbuf, pagesize);
-		if (cnt == -1) {
-			tst_brk(TFAIL, "read error");
-		} else if ((unsigned int)cnt != pagesize) {
+		cnt = SAFE_READ(0, fd, readbuf, pagesize);
+		if ((unsigned int)cnt != pagesize) {
 			/*
 			 *  Okay if at last page in file...
 			 */
-			if ((i * pagesize) + cnt != mapsize) {
-				tst_res(TINFO, "read %d of %ld bytes",
+			if ((i * pagesize) + cnt != mapsize)
+				tst_brk(TFAIL, "missing data: read %d of %ld bytes",
 					(i * pagesize) + cnt, (long)mapsize);
-				SAFE_CLOSE(fd);
-				return 0;
-			}
 		}
 		/*
 		 *  Compare read bytes of data.
 		 */
 		for (j = 0; j < (unsigned int)cnt; j++) {
-			if (expbuf[j] != readbuf[j]) {
-				tst_res(TINFO,
+			if (expbuf[j] != readbuf[j])
+				tst_brk(TFAIL,
 					"read bad data: exp %c got %c, pg %d off %d, (fsize %lld)",
 					expbuf[j], readbuf[j], i, j,
 					(long long)statbuf.st_size);
-				SAFE_CLOSE(fd);
-				return 0;
-			}
 		}
 	}
 	SAFE_CLOSE(fd);
-
-	return 1;
 }
 
-void finish(int sig LTP_ATTRIBUTE_UNUSED)
+static void finish(int sig LTP_ATTRIBUTE_UNUSED)
 {
 	finished++;
 }
 
-unsigned int initrand(void)
+static unsigned int initrand(void)
 {
 	unsigned int seed;
 
@@ -514,9 +480,9 @@ unsigned int initrand(void)
 }
 
 static struct tst_test test = {
-	.needs_tmpdir = 1,
 	.test_all = run,
 	.setup = setup,
 	.options = options,
 	.cleanup = cleanup,
+	.needs_tmpdir = 1,
 };
-- 
2.38.0.rc1.362.ged0d419d3c-goog


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [LTP] [PATCH v3 7/9] mmapstress01: use SAFE_FORK
  2022-10-04 18:20 [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Edward Liaw via ltp
                   ` (5 preceding siblings ...)
  2022-10-04 18:20 ` [LTP] [PATCH v3 6/9] mmapstress01: refactor cleanup and drop leavefile option Edward Liaw via ltp
@ 2022-10-04 18:20 ` Edward Liaw via ltp
  2022-10-04 18:20 ` [LTP] [PATCH v3 8/9] mmapstress01: update license Edward Liaw via ltp
                   ` (2 subsequent siblings)
  9 siblings, 0 replies; 13+ messages in thread
From: Edward Liaw via ltp @ 2022-10-04 18:20 UTC (permalink / raw)
  To: ltp; +Cc: kernel-team

Signed-off-by: Edward Liaw <edliaw@google.com>
---
 testcases/kernel/mem/mmapstress/mmapstress01.c | 14 ++++----------
 1 file changed, 4 insertions(+), 10 deletions(-)

diff --git a/testcases/kernel/mem/mmapstress/mmapstress01.c b/testcases/kernel/mem/mmapstress/mmapstress01.c
index 7e8226700..99ab0d64e 100644
--- a/testcases/kernel/mem/mmapstress/mmapstress01.c
+++ b/testcases/kernel/mem/mmapstress/mmapstress01.c
@@ -227,12 +227,7 @@ static void run(void)
 	 *  Fork off mmap children.
 	 */
 	for (procno = 0; procno < nprocs; procno++) {
-		switch (pid = fork()) {
-
-		case -1:
-			tst_brk(TFAIL, "fork error");
-			break;
-
+		switch (pid = SAFE_FORK()) {
 		case 0:
 			child_mapper(TEST_FILE, (unsigned int)procno, (unsigned int)nprocs);
 			exit(0);
@@ -273,10 +268,8 @@ static void run(void)
 				tst_brk(TFAIL, "unknown child pid %d, <x%x>",
 					pid, wait_stat);
 
-			if ((pid = fork()) == -1) {
-				pidarray[i] = 0;
-				tst_brk(TFAIL, "fork error");
-			} else if (pid == 0) {	/* child */
+			pid = SAFE_FORK();
+			if (pid == 0) {	/* child */
 				child_mapper(TEST_FILE, (unsigned int)i, (unsigned int)nprocs);
 				exit(0);
 			} else {
@@ -485,4 +478,5 @@ static struct tst_test test = {
 	.options = options,
 	.cleanup = cleanup,
 	.needs_tmpdir = 1,
+	.forks_child = 1,
 };
-- 
2.38.0.rc1.362.ged0d419d3c-goog


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [LTP] [PATCH v3 8/9] mmapstress01: update license
  2022-10-04 18:20 [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Edward Liaw via ltp
                   ` (6 preceding siblings ...)
  2022-10-04 18:20 ` [LTP] [PATCH v3 7/9] mmapstress01: use SAFE_FORK Edward Liaw via ltp
@ 2022-10-04 18:20 ` Edward Liaw via ltp
  2022-10-04 18:20 ` [LTP] [PATCH v3 9/9] mmapstress01: reorder vars and functions Edward Liaw via ltp
  2022-10-05 10:31 ` [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Cyril Hrubis
  9 siblings, 0 replies; 13+ messages in thread
From: Edward Liaw via ltp @ 2022-10-04 18:20 UTC (permalink / raw)
  To: ltp; +Cc: kernel-team

Signed-off-by: Edward Liaw <edliaw@google.com>
---
 .../kernel/mem/mmapstress/mmapstress01.c      | 25 ++++---------------
 1 file changed, 5 insertions(+), 20 deletions(-)

diff --git a/testcases/kernel/mem/mmapstress/mmapstress01.c b/testcases/kernel/mem/mmapstress/mmapstress01.c
index 99ab0d64e..9eced3526 100644
--- a/testcases/kernel/mem/mmapstress/mmapstress01.c
+++ b/testcases/kernel/mem/mmapstress/mmapstress01.c
@@ -1,25 +1,10 @@
-/* IBM Corporation */
-/* 01/02/2003	Port to LTP avenkat@us.ibm.com */
-/* 06/30/2001	Port to Linux	nsharoff@us.ibm.com */
+// SPDX-License-Identifier: GPL-2.0-or-later
 /*
- *   Copyright (c) International Business Machines  Corp., 2003
- *
- *
- *   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
+ * Copyright (c) International Business Machines  Corp., 2003
+ * 01/02/2003	Port to LTP avenkat@us.ibm.com
+ * 06/30/2001	Port to Linux	nsharoff@us.ibm.com
+ * 10/03/2022	Refactor to LTP framework	edliaw@google.com
  */
-
 /*
  *  This test stresses mmaps, without dealing with fragments or anything!
  *  It forks a specified number of children,
-- 
2.38.0.rc1.362.ged0d419d3c-goog


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* [LTP] [PATCH v3 9/9] mmapstress01: reorder vars and functions
  2022-10-04 18:20 [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Edward Liaw via ltp
                   ` (7 preceding siblings ...)
  2022-10-04 18:20 ` [LTP] [PATCH v3 8/9] mmapstress01: update license Edward Liaw via ltp
@ 2022-10-04 18:20 ` Edward Liaw via ltp
  2022-10-05 10:21   ` Cyril Hrubis
  2022-10-05 10:31 ` [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Cyril Hrubis
  9 siblings, 1 reply; 13+ messages in thread
From: Edward Liaw via ltp @ 2022-10-04 18:20 UTC (permalink / raw)
  To: ltp; +Cc: kernel-team

Signed-off-by: Edward Liaw <edliaw@google.com>
---
 .../kernel/mem/mmapstress/mmapstress01.c      | 286 +++++++++---------
 1 file changed, 143 insertions(+), 143 deletions(-)

diff --git a/testcases/kernel/mem/mmapstress/mmapstress01.c b/testcases/kernel/mem/mmapstress/mmapstress01.c
index 9eced3526..f68193706 100644
--- a/testcases/kernel/mem/mmapstress/mmapstress01.c
+++ b/testcases/kernel/mem/mmapstress/mmapstress01.c
@@ -72,26 +72,27 @@
 #define roundup(x, y)	((((x)+((y)-1))/(y))*(y))
 
 static unsigned int initrand(void);
-static void finish(int sig);
 static void child_mapper(char *file, unsigned int procno, unsigned int nprocs);
 static void fileokay(char *file, unsigned char *expbuf);
+static void sighandler(int sig);
 
 static char *debug;
 static char *do_sync;
 static char *do_offset;
-static char *randloops;
+static char *opt_alarmtime;
 static char *opt_filesize;
 static char *opt_nprocs;
 static char *opt_sparseoffset;
-static char *opt_alarmtime;
+static char *randloops;
 
 static int fd;
-static float alarmtime;
+static int finished;
 static int nprocs;
+static float alarmtime;
 static long long filesize = FILESIZE;
 static long long sparseoffset;
+static size_t pagesize;
 static unsigned int pattern;
-static int finished;
 
 static struct tst_option options[] = {
 	{"d", &debug, "Enable debug output"},
@@ -152,138 +153,6 @@ static void setup(void)
 	alarmtime *= 60;
 }
 
-static void run(void)
-{
-	int c;
-	int procno;
-	pid_t pid;
-	unsigned int seed;
-	int pagesize = sysconf(_SC_PAGE_SIZE);
-	struct sigaction sa;
-	int i;
-	int write_cnt;
-	unsigned char data;
-	off_t bytes_left;
-	sigset_t set_mask;
-	pid_t *pidarray = NULL;
-	int wait_stat;
-	unsigned char *buf;
-
-	seed = initrand();
-	pattern = seed & 0xff;
-
-	/*
-	 *  Plan for death by signal.  User may have specified
-	 *  a time limit, in which set an alarm and catch SIGALRM.
-	 *  Also catch and cleanup with SIGINT.
-	 */
-	sa.sa_handler = finish;
-	sa.sa_flags = 0;
-	SAFE_SIGEMPTYSET(&sa.sa_mask);
-	SAFE_SIGACTION(SIGINT, &sa, 0);
-	SAFE_SIGACTION(SIGQUIT, &sa, 0);
-	SAFE_SIGACTION(SIGTERM, &sa, 0);
-
-	if (alarmtime) {
-		SAFE_SIGACTION(SIGALRM, &sa, 0);
-		(void)alarm(alarmtime);
-	}
-	fd = SAFE_OPEN(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, 0664);
-
-	buf = SAFE_MALLOC(pagesize);
-	pidarray = SAFE_MALLOC(nprocs * sizeof(pid_t));
-
-	for (i = 0; i < nprocs; i++)
-		*(pidarray + i) = 0;
-
-	for (i = 0, data = 0; i < pagesize; i++) {
-		*(buf + i) = (data + pattern) & 0xff;
-		if (++data == nprocs)
-			data = 0;
-	}
-	SAFE_LSEEK(fd, (off_t)sparseoffset, SEEK_SET);
-	for (bytes_left = filesize; bytes_left; bytes_left -= c) {
-		write_cnt = MIN(pagesize, (int)bytes_left);
-		c = SAFE_WRITE(1, fd, buf, write_cnt);
-	}
-	SAFE_CLOSE(fd);
-
-	/*
-	 *  Fork off mmap children.
-	 */
-	for (procno = 0; procno < nprocs; procno++) {
-		switch (pid = SAFE_FORK()) {
-		case 0:
-			child_mapper(TEST_FILE, (unsigned int)procno, (unsigned int)nprocs);
-			exit(0);
-
-		default:
-			pidarray[procno] = pid;
-		}
-	}
-
-	/*
-	 *  Now wait for children and refork them as needed.
-	 */
-
-	SAFE_SIGEMPTYSET(&set_mask);
-	SAFE_SIGADDSET(&set_mask, SIGALRM);
-	SAFE_SIGADDSET(&set_mask, SIGINT);
-	while (!finished) {
-		pid = wait(&wait_stat);
-		/*
-		 *  Block signals while processing child exit.
-		 */
-
-		SAFE_SIGPROCMASK(SIG_BLOCK, &set_mask, NULL);
-
-		if (pid != -1) {
-			/*
-			 *  Check exit status, then refork with the
-			 *  appropriate procno.
-			 */
-			if (!WIFEXITED(wait_stat)
-			    || WEXITSTATUS(wait_stat) != 0)
-				tst_brk(TFAIL, "child exit with err <x%x>",
-					wait_stat);
-			for (i = 0; i < nprocs; i++)
-				if (pid == pidarray[i])
-					break;
-			if (i == nprocs)
-				tst_brk(TFAIL, "unknown child pid %d, <x%x>",
-					pid, wait_stat);
-
-			pid = SAFE_FORK();
-			if (pid == 0) {	/* child */
-				child_mapper(TEST_FILE, (unsigned int)i, (unsigned int)nprocs);
-				exit(0);
-			} else {
-				pidarray[i] = pid;
-			}
-		} else {
-			/*
-			 *  wait returned an error.  If EINTR, then
-			 *  normal finish, else it's an unexpected
-			 *  error...
-			 */
-			if (errno != EINTR || !finished)
-				tst_brk(TFAIL, "unexpected wait error");
-		}
-		SAFE_SIGPROCMASK(SIG_UNBLOCK, &set_mask, NULL);
-	}
-
-	SAFE_SIGEMPTYSET(&set_mask);
-	SAFE_SIGADDSET(&set_mask, SIGALRM);
-	SAFE_SIGPROCMASK(SIG_BLOCK, &set_mask, NULL);
-	(void)alarm(0);
-
-	/*
-	 *  Finished!  Check the file for sanity.
-	 */
-	fileokay(TEST_FILE, buf);
-	tst_res(TPASS, "file has expected data");
-}
-
 static void cleanup(void)
 {
 	if (fd > 0)
@@ -305,7 +174,6 @@ static void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
 	size_t validsize;
 	size_t mapsize;
 	char *maddr = NULL, *paddr;
-	size_t pagesize = sysconf(_SC_PAGE_SIZE);
 	unsigned int randpage;
 	unsigned int seed;
 	unsigned int loopcnt;
@@ -389,13 +257,13 @@ static void child_mapper(char *file, unsigned int procno, unsigned int nprocs)
  */
 static void fileokay(char *file, unsigned char *expbuf)
 {
-	struct stat statbuf;
+	int cnt;
 	size_t mapsize;
-	unsigned int mappages;
-	unsigned int pagesize = sysconf(_SC_PAGE_SIZE);
+	struct stat statbuf;
 	unsigned char readbuf[pagesize];
-	int cnt;
 	unsigned int i, j;
+	unsigned int mappages;
+	unsigned int pagesize = sysconf(_SC_PAGE_SIZE);
 
 	fd = SAFE_OPEN(file, O_RDONLY);
 
@@ -432,7 +300,7 @@ static void fileokay(char *file, unsigned char *expbuf)
 	SAFE_CLOSE(fd);
 }
 
-static void finish(int sig LTP_ATTRIBUTE_UNUSED)
+static void sighandler(int sig LTP_ATTRIBUTE_UNUSED)
 {
 	finished++;
 }
@@ -457,6 +325,138 @@ static unsigned int initrand(void)
 	return seed;
 }
 
+static void run(void)
+{
+	int c;
+	int i;
+	int procno;
+	int wait_stat;
+	off_t bytes_left;
+	pid_t pid;
+	pid_t *pidarray = NULL;
+	sigset_t set_mask;
+	size_t write_cnt;
+	struct sigaction sa;
+	unsigned char data;
+	unsigned char *buf;
+	unsigned int seed;
+
+	pagesize = sysconf(_SC_PAGE_SIZE);
+	seed = initrand();
+	pattern = seed & 0xff;
+
+	/*
+	 *  Plan for death by signal.  User may have specified
+	 *  a time limit, in which set an alarm and catch SIGALRM.
+	 *  Also catch and cleanup with SIGINT.
+	 */
+	sa.sa_handler = sighandler;
+	sa.sa_flags = 0;
+	SAFE_SIGEMPTYSET(&sa.sa_mask);
+	SAFE_SIGACTION(SIGINT, &sa, 0);
+	SAFE_SIGACTION(SIGQUIT, &sa, 0);
+	SAFE_SIGACTION(SIGTERM, &sa, 0);
+
+	if (alarmtime) {
+		SAFE_SIGACTION(SIGALRM, &sa, 0);
+		(void)alarm(alarmtime);
+	}
+	fd = SAFE_OPEN(TEST_FILE, O_CREAT | O_TRUNC | O_RDWR, 0664);
+
+	buf = SAFE_MALLOC(pagesize);
+	pidarray = SAFE_MALLOC(nprocs * sizeof(pid_t));
+
+	for (i = 0; i < nprocs; i++)
+		*(pidarray + i) = 0;
+
+	for (i = 0, data = 0; i < (int)pagesize; i++) {
+		*(buf + i) = (data + pattern) & 0xff;
+		if (++data == nprocs)
+			data = 0;
+	}
+	SAFE_LSEEK(fd, (off_t)sparseoffset, SEEK_SET);
+	for (bytes_left = filesize; bytes_left; bytes_left -= c) {
+		write_cnt = MIN((long long)pagesize, (long long)bytes_left);
+		c = SAFE_WRITE(1, fd, buf, write_cnt);
+	}
+	SAFE_CLOSE(fd);
+
+	/*
+	 *  Fork off mmap children.
+	 */
+	for (procno = 0; procno < nprocs; procno++) {
+		switch (pid = SAFE_FORK()) {
+		case 0:
+			child_mapper(TEST_FILE, (unsigned int)procno, (unsigned int)nprocs);
+			exit(0);
+
+		default:
+			pidarray[procno] = pid;
+		}
+	}
+
+	/*
+	 *  Now wait for children and refork them as needed.
+	 */
+
+	SAFE_SIGEMPTYSET(&set_mask);
+	SAFE_SIGADDSET(&set_mask, SIGALRM);
+	SAFE_SIGADDSET(&set_mask, SIGINT);
+	while (!finished) {
+		pid = wait(&wait_stat);
+		/*
+		 *  Block signals while processing child exit.
+		 */
+
+		SAFE_SIGPROCMASK(SIG_BLOCK, &set_mask, NULL);
+
+		if (pid != -1) {
+			/*
+			 *  Check exit status, then refork with the
+			 *  appropriate procno.
+			 */
+			if (!WIFEXITED(wait_stat)
+			    || WEXITSTATUS(wait_stat) != 0)
+				tst_brk(TFAIL, "child exit with err <x%x>",
+					wait_stat);
+			for (i = 0; i < nprocs; i++)
+				if (pid == pidarray[i])
+					break;
+			if (i == nprocs)
+				tst_brk(TFAIL, "unknown child pid %d, <x%x>",
+					pid, wait_stat);
+
+			pid = SAFE_FORK();
+			if (pid == 0) {	/* child */
+				child_mapper(TEST_FILE, (unsigned int)i, (unsigned int)nprocs);
+				exit(0);
+			} else {
+				pidarray[i] = pid;
+			}
+		} else {
+			/*
+			 *  wait returned an error.  If EINTR, then
+			 *  normal finish, else it's an unexpected
+			 *  error...
+			 */
+			if (errno != EINTR || !finished)
+				tst_brk(TFAIL, "unexpected wait error");
+		}
+		SAFE_SIGPROCMASK(SIG_UNBLOCK, &set_mask, NULL);
+	}
+
+	SAFE_SIGEMPTYSET(&set_mask);
+	SAFE_SIGADDSET(&set_mask, SIGALRM);
+	SAFE_SIGPROCMASK(SIG_BLOCK, &set_mask, NULL);
+	(void)alarm(0);
+
+	/*
+	 *  Finished!  Check the file for sanity.
+	 */
+	fileokay(TEST_FILE, buf);
+	tst_res(TPASS, "file has expected data");
+}
+
 static struct tst_test test = {
 	.test_all = run,
 	.setup = setup,
-- 
2.38.0.rc1.362.ged0d419d3c-goog


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply related	[flat|nested] 13+ messages in thread

* Re: [LTP] [PATCH v3 9/9] mmapstress01: reorder vars and functions
  2022-10-04 18:20 ` [LTP] [PATCH v3 9/9] mmapstress01: reorder vars and functions Edward Liaw via ltp
@ 2022-10-05 10:21   ` Cyril Hrubis
  0 siblings, 0 replies; 13+ messages in thread
From: Cyril Hrubis @ 2022-10-05 10:21 UTC (permalink / raw)
  To: Edward Liaw; +Cc: kernel-team, ltp

Hi!
> diff --git a/testcases/kernel/mem/mmapstress/mmapstress01.c b/testcases/kernel/mem/mmapstress/mmapstress01.c
> index 9eced3526..f68193706 100644
> --- a/testcases/kernel/mem/mmapstress/mmapstress01.c
> +++ b/testcases/kernel/mem/mmapstress/mmapstress01.c
> @@ -72,26 +72,27 @@
>  #define roundup(x, y)	((((x)+((y)-1))/(y))*(y))
>  
>  static unsigned int initrand(void);
> -static void finish(int sig);
>  static void child_mapper(char *file, unsigned int procno, unsigned int nprocs);
>  static void fileokay(char *file, unsigned char *expbuf);
> +static void sighandler(int sig);

Most of these can be dropped now. The only that needs to stay is
initrand().

-- 
Cyril Hrubis
chrubis@suse.cz

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework
  2022-10-04 18:20 [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Edward Liaw via ltp
                   ` (8 preceding siblings ...)
  2022-10-04 18:20 ` [LTP] [PATCH v3 9/9] mmapstress01: reorder vars and functions Edward Liaw via ltp
@ 2022-10-05 10:31 ` Cyril Hrubis
  2022-10-05 11:22   ` Petr Vorel
  9 siblings, 1 reply; 13+ messages in thread
From: Cyril Hrubis @ 2022-10-05 10:31 UTC (permalink / raw)
  To: Edward Liaw; +Cc: kernel-team, ltp

Hi!
The code is heading into the right direction but there are couple of
things to do (can be done in an incremental manner too):

* Most of the remaning tst_brk(TFAIL, "..") should actually be
  tst_brk(TBROK, "..") at least all the cases where we call
  a syscall and it fails. And we should include the TERRNO flag
  as well to get the actual error printed.

* The test should make use of runtime instead of the alarm()
  for test duration. That would mean getting rid of the -t option and
  using the -I option instead. Also the test should set up some
  .test_runtime for a default run duration in the tst_test structure.

* The top level comment has to be updated for the changes in the test
  since the options structure describes the command line parameters
  quite well I would just remove that part from the comment

-- 
Cyril Hrubis
chrubis@suse.cz

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework
  2022-10-05 10:31 ` [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Cyril Hrubis
@ 2022-10-05 11:22   ` Petr Vorel
  0 siblings, 0 replies; 13+ messages in thread
From: Petr Vorel @ 2022-10-05 11:22 UTC (permalink / raw)
  To: Cyril Hrubis; +Cc: kernel-team, ltp

Hi all,

> Hi!
> The code is heading into the right direction but there are couple of
> things to do (can be done in an incremental manner too):

> * Most of the remaning tst_brk(TFAIL, "..") should actually be
>   tst_brk(TBROK, "..") at least all the cases where we call
>   a syscall and it fails. And we should include the TERRNO flag
>   as well to get the actual error printed.

> * The test should make use of runtime instead of the alarm()
>   for test duration. That would mean getting rid of the -t option and
>   using the -I option instead. Also the test should set up some
>   .test_runtime for a default run duration in the tst_test structure.

> * The top level comment has to be updated for the changes in the test
>   since the options structure describes the command line parameters
>   quite well I would just remove that part from the comment

I'd also squash at least same changes if not all (update licence, reorder vars,
make check fixes, ...  IMHO does not need to be in a separate commit).

While in it, it'd be worth the test had default parameters. i.e. -p X not having
to pass, and use the default 20. The same applies for -I (which should replaced -t).

Kind regards,
Petr

-- 
Mailing list info: https://lists.linux.it/listinfo/ltp

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2022-10-05 11:22 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-10-04 18:20 [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Edward Liaw via ltp
2022-10-04 18:20 ` [LTP] [PATCH v3 1/9] mmapstress01: refactor to tst_test framework Edward Liaw via ltp
2022-10-04 18:20 ` [LTP] [PATCH v3 2/9] mmapstress01: apply make check suggestions Edward Liaw via ltp
2022-10-04 18:20 ` [LTP] [PATCH v3 3/9] mmapstress01: refactor options Edward Liaw via ltp
2022-10-04 18:20 ` [LTP] [PATCH v3 4/9] mmapstress01: use FILE_OFFSET_BITS=64 Edward Liaw via ltp
2022-10-04 18:20 ` [LTP] [PATCH v3 5/9] mmapstress01: use safe macros Edward Liaw via ltp
2022-10-04 18:20 ` [LTP] [PATCH v3 6/9] mmapstress01: refactor cleanup and drop leavefile option Edward Liaw via ltp
2022-10-04 18:20 ` [LTP] [PATCH v3 7/9] mmapstress01: use SAFE_FORK Edward Liaw via ltp
2022-10-04 18:20 ` [LTP] [PATCH v3 8/9] mmapstress01: update license Edward Liaw via ltp
2022-10-04 18:20 ` [LTP] [PATCH v3 9/9] mmapstress01: reorder vars and functions Edward Liaw via ltp
2022-10-05 10:21   ` Cyril Hrubis
2022-10-05 10:31 ` [LTP] [PATCH v3 0/9] mmapstress01: refactor to ltp framework Cyril Hrubis
2022-10-05 11:22   ` Petr Vorel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox