[LTP] [PATCH 2/2] syscalls/msgstress01: Fix timeouts

Cyril Hrubis chrubis@suse.cz
Thu May 23 15:31:32 CEST 2024


Make the test exit if runtime has been exhausted before we finished the
requested amount of iterations.

For that to happen we let the main test process to loop while checking
the runtime and set the stop flag if runtime was exhausted. We also need
to separte the stop and fail flag and add counter for finished children.

Also if we exhaust our runtime during the initial fork phase we print a
warning, since we hardly did a meaningful testing in that case.

The changes can be tested with -I parameter, e.g. -I 5 should trigger
the TWARN message and you should be able to get the test to stop in the
message sending phase with larger -I value.

Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
---
 .../syscalls/ipc/msgstress/msgstress01.c      | 53 ++++++++++++++++---
 1 file changed, 47 insertions(+), 6 deletions(-)

diff --git a/testcases/kernel/syscalls/ipc/msgstress/msgstress01.c b/testcases/kernel/syscalls/ipc/msgstress/msgstress01.c
index 62ffcf63b..fb1d4263d 100644
--- a/testcases/kernel/syscalls/ipc/msgstress/msgstress01.c
+++ b/testcases/kernel/syscalls/ipc/msgstress/msgstress01.c
@@ -50,6 +50,9 @@ static char *str_num_iterations;
 static int num_messages = 1000;
 static int num_iterations = MAXNREPS;
 static volatile int *stop;
+static volatile int *fail;
+static int *finished;
+static int *flags;
 
 static int get_used_sysvipc(void)
 {
@@ -77,6 +80,10 @@ static void reset_messages(void)
 
 	for (int i = 0; i < num_messages; i++)
 		ipc_data[i].id = -1;
+
+	*stop = 0;
+	*fail = 0;
+	*finished = 0;
 }
 
 static int create_message(const int id)
@@ -112,6 +119,8 @@ static void writer(const int id, const int pos)
 			tst_brk(TBROK | TERRNO, "msgsnd() failed");
 		}
 	}
+
+	tst_atomic_inc(finished);
 }
 
 static void reader(const int id, const int pos)
@@ -138,6 +147,7 @@ static void reader(const int id, const int pos)
 			tst_res(TFAIL, "Received the wrong message type");
 
 			*stop = 1;
+			*fail = 1;
 			return;
 		}
 
@@ -145,6 +155,7 @@ static void reader(const int id, const int pos)
 			tst_res(TFAIL, "Received the wrong message data length");
 
 			*stop = 1;
+			*fail = 1;
 			return;
 		}
 
@@ -155,6 +166,7 @@ static void reader(const int id, const int pos)
 					buff->msg.data.pbytes[i]);
 
 				*stop = 1;
+				*fail = 1;
 				return;
 			}
 		}
@@ -163,6 +175,8 @@ static void reader(const int id, const int pos)
 		tst_res(TDEBUG, "msg_recv.type = %ld", msg_recv.type);
 		tst_res(TDEBUG, "msg_recv.data.len = %d", msg_recv.data.len);
 	}
+
+	tst_atomic_inc(finished);
 }
 
 static void remove_queues(void)
@@ -196,12 +210,37 @@ static void run(void)
 
 		if (*stop)
 			break;
+
+		if (!tst_remaining_runtime()) {
+			tst_res(TWARN, "Out of runtime during forking...");
+			*stop = 1;
+			break;
+		}
+	}
+
+	if (!(*stop))
+		tst_res(TINFO, "All processes running.");
+
+	for (;;) {
+		if (tst_atomic_load(finished) == 2 * num_messages)
+			break;
+
+		if (*stop)
+			break;
+
+		if (!tst_remaining_runtime()) {
+			tst_res(TINFO, "Out of runtime, stopping processes...");
+			*stop = 1;
+			break;
+		}
+
+		sleep(1);
 	}
 
 	tst_reap_children();
 	remove_queues();
 
-	if (!(*stop))
+	if (!(*fail))
 		tst_res(TPASS, "Test passed. All messages have been received");
 }
 
@@ -242,14 +281,16 @@ static void setup(void)
 		MAP_SHARED | MAP_ANONYMOUS,
 		-1, 0);
 
-	stop = SAFE_MMAP(
+	flags = SAFE_MMAP(
 		NULL,
-		sizeof(int),
+		sizeof(int) * 3,
 		PROT_READ | PROT_WRITE,
 		MAP_SHARED | MAP_ANONYMOUS,
 		-1, 0);
 
-	reset_messages();
+	stop = &flags[0];
+	fail = &flags[1];
+	finished = &flags[2];
 }
 
 static void cleanup(void)
@@ -260,7 +301,7 @@ static void cleanup(void)
 	remove_queues();
 
 	SAFE_MUNMAP(ipc_data, sizeof(struct sysv_data) * num_messages);
-	SAFE_MUNMAP((void *)stop, sizeof(int));
+	SAFE_MUNMAP(flags, sizeof(int) * 3);
 }
 
 static struct tst_test test = {
@@ -271,7 +312,7 @@ static struct tst_test test = {
 	.max_runtime = 180,
 	.options = (struct tst_option[]) {
 		{"n:", &str_num_messages, "Number of messages to send (default: 1000)"},
-		{"l:", &str_num_iterations, "Number iterations per message (default: 10000)"},
+		{"l:", &str_num_iterations, "Number iterations per message (default: " TST_TO_STR(MAXNREPS) ")"},
 		{},
 	},
 };
-- 
2.43.2



More information about the ltp mailing list