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

Martin Doucha mdoucha@suse.cz
Thu May 23 16:37:46 CEST 2024


Hi,
for both patches:
Reviewed-by: Martin Doucha <mdoucha@suse.cz>

On 23. 05. 24 15:31, Cyril Hrubis wrote:
> 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) ")"},
>   		{},
>   	},
>   };

-- 
Martin Doucha   mdoucha@suse.cz
SW Quality Engineer
SUSE LINUX, s.r.o.
CORSO IIa
Krizikova 148/34
186 00 Prague 8
Czech Republic



More information about the ltp mailing list