[LTP] [PATCH v2 1/2] setitimer01: add interval timer test

Richard Palethorpe rpalethorpe@suse.de
Thu Nov 17 10:57:02 CET 2022


Hello,

Li Wang <liwang@redhat.com> writes:

> Split checking the return ovalue from testing the signal is
> delivered, so that we could use two time value for verifying.
>
> Also, adding interval timer test by handling the signal at
> least 10 times. After that recover the signal behavior to
> default and do deliver-signal checking.
>
> Signed-off-by: Li Wang <liwang@redhat.com>
> ---
>
> Notes:
>     v1 --> v2
>     	* use prime number in set_setitimer_value
>     	* print the time at the begining and end of test
>     	* sperately compare result for tv_sec elapse or not
>     	* print more info when TFAIL

Merged, thanks!

>
>  .../kernel/syscalls/setitimer/setitimer01.c   | 85 ++++++++++++++-----
>  1 file changed, 62 insertions(+), 23 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/setitimer/setitimer01.c b/testcases/kernel/syscalls/setitimer/setitimer01.c
> index 1f631d457..d12abe904 100644
> --- a/testcases/kernel/syscalls/setitimer/setitimer01.c
> +++ b/testcases/kernel/syscalls/setitimer/setitimer01.c
> @@ -21,9 +21,12 @@
>  #include "lapi/syscalls.h"
>  #include "tst_safe_clocks.h"
>  
> +static struct timeval tv;
>  static struct itimerval *value, *ovalue;
> +static volatile unsigned long sigcnt;
>  static long time_step;
> -static long time_count;
> +static long time_sec;
> +static long time_usec;
>  
>  static struct tcase {
>  	int which;
> @@ -40,17 +43,17 @@ static int sys_setitimer(int which, void *new_value, void *old_value)
>  	return tst_syscall(__NR_setitimer, which, new_value, old_value);
>  }
>  
> -static void set_setitimer_value(int usec, int o_usec)
> +static void sig_routine(int signo LTP_ATTRIBUTE_UNUSED)
>  {
> -	value->it_value.tv_sec = 0;
> -	value->it_value.tv_usec = usec;
> -	value->it_interval.tv_sec = 0;
> -	value->it_interval.tv_usec = 0;
> +	sigcnt++;
> +}
>  
> -	ovalue->it_value.tv_sec = o_usec;
> -	ovalue->it_value.tv_usec = o_usec;
> -	ovalue->it_interval.tv_sec = 0;
> -	ovalue->it_interval.tv_usec = 0;
> +static void set_setitimer_value(int sec, int usec)
> +{
> +	value->it_value.tv_sec = sec;
> +	value->it_value.tv_usec = usec;
> +	value->it_interval.tv_sec = sec;
> +	value->it_interval.tv_usec = usec;
>  }
>  
>  static void verify_setitimer(unsigned int i)
> @@ -60,22 +63,31 @@ static void verify_setitimer(unsigned int i)
>  	long margin;
>  	struct tcase *tc = &tcases[i];
>  
> +	tst_res(TINFO, "tc->which = %s", tc->des);
> +
> +	if (tc->which == ITIMER_REAL) {
> +		if (gettimeofday(&tv, NULL) == -1)
> +			tst_brk(TBROK | TERRNO, "gettimeofday(&tv1, NULL) failed");
> +		else
> +			tst_res(TINFO, "Test begin time: %ld.%lds", tv.tv_sec, tv.tv_usec);
> +	}
> +
>  	pid = SAFE_FORK();
>  
>  	if (pid == 0) {
> -		tst_res(TINFO, "tc->which = %s", tc->des);
> -
>  		tst_no_corefile(0);
>  
> -		set_setitimer_value(time_count, 0);
> +		set_setitimer_value(time_sec, time_usec);
>  		TST_EXP_PASS(sys_setitimer(tc->which, value, NULL));
>  
> -		set_setitimer_value(5 * time_step, 7 * time_step);
> +		set_setitimer_value(5 * time_sec, 7 * time_usec);
>  		TST_EXP_PASS(sys_setitimer(tc->which, value, ovalue));
>  
> -		tst_res(TINFO, "tv_sec=%ld, tv_usec=%ld",
> -			ovalue->it_value.tv_sec,
> -			ovalue->it_value.tv_usec);
> +		TST_EXP_EQ_LI(ovalue->it_interval.tv_sec, time_sec);
> +		TST_EXP_EQ_LI(ovalue->it_interval.tv_usec, time_usec);
> +
> +		tst_res(TINFO, "ovalue->it_value.tv_sec=%ld, ovalue->it_value.tv_usec=%ld",
> +			ovalue->it_value.tv_sec, ovalue->it_value.tv_usec);
>  
>  		/*
>  		 * ITIMER_VIRTUAL and ITIMER_PROF timers always expire a
> @@ -84,10 +96,29 @@ static void verify_setitimer(unsigned int i)
>  		 */
>  		margin = tc->which == ITIMER_REAL ? 0 : time_step;
>  
> -		if (ovalue->it_value.tv_sec != 0 || ovalue->it_value.tv_usec > time_count + margin)
> -			tst_res(TFAIL, "Ending counters are out of range");
> +		if (ovalue->it_value.tv_sec == time_sec) {
> +			if (ovalue->it_value.tv_usec < 0 ||
> +					ovalue->it_value.tv_usec > time_usec + margin)
> +				tst_res(TFAIL, "ovalue->it_value.tv_usec is out of range: %ld",
> +					ovalue->it_value.tv_usec);
> +		} else {
> +			if (ovalue->it_value.tv_sec < 0 ||
> +					ovalue->it_value.tv_sec > time_sec)
> +				tst_res(TFAIL, "ovalue->it_value.tv_sec is out of range: %ld",
> +					ovalue->it_value.tv_sec);
> +		}
> +
> +		SAFE_SIGNAL(tc->signo, sig_routine);
> +
> +		set_setitimer_value(0, time_usec);
> +		TST_EXP_PASS(sys_setitimer(tc->which, value, NULL));
>  
> -		for (;;)
> +		while (sigcnt <= 10UL)
> +			;
> +
> +		SAFE_SIGNAL(tc->signo, SIG_DFL);
> +
> +		while (1)
>  			;
>  	}
>  
> @@ -97,6 +128,13 @@ static void verify_setitimer(unsigned int i)
>  		tst_res(TPASS, "Child received signal: %s", tst_strsig(tc->signo));
>  	else
>  		tst_res(TFAIL, "Child: %s", tst_strstatus(status));
> +
> +	if (tc->which == ITIMER_REAL) {
> +		if (gettimeofday(&tv, NULL) == -1)
> +			tst_brk(TBROK | TERRNO, "gettimeofday(&tv1, NULL) failed");
> +		else
> +			tst_res(TINFO, "Test end time: %ld.%lds", tv.tv_sec, tv.tv_usec);
> +	}
>  }
>  
>  static void setup(void)
> @@ -114,10 +152,11 @@ static void setup(void)
>  	if (time_step <= 0)
>  		time_step = 1000;
>  
> -	time_count = 3 * time_step;
> +	tst_res(TINFO, "clock low-resolution: %luns, time step: %luus",
> +		time_res.tv_nsec, time_step);
>  
> -	tst_res(TINFO, "low-resolution: %luns, time step: %luus, time count: %luus",
> -		time_res.tv_nsec, time_step, time_count);
> +	time_sec  = 9 + time_step / 1000;
> +	time_usec = 3 * time_step;
>  }
>  
>  static struct tst_test test = {


-- 
Thank you,
Richard.


More information about the ltp mailing list