diff mbox series

[v2,1/2] lib: add tst_get_timeout()

Message ID 6680bda80c85d424a5219d9f55dc9c5355dc0da1.1535454204.git.jstancek@redhat.com
State Superseded
Headers show
Series [v2,1/2] lib: add tst_get_timeout() | expand

Commit Message

Jan Stancek Aug. 28, 2018, 11:07 a.m. UTC
Signed-off-by: Jan Stancek <jstancek@redhat.com>
---
 include/tst_test.h | 1 +
 lib/tst_test.c     | 5 +++++
 2 files changed, 6 insertions(+)

Comments

Li Wang Aug. 28, 2018, 12:34 p.m. UTC | #1
On Tue, Aug 28, 2018 at 7:07 PM, Jan Stancek <jstancek@redhat.com> wrote:

> Signed-off-by: Jan Stancek <jstancek@redhat.com>
>
...
> +{
> +       return results->timeout;
> +}
>

Patch set looks good to me.

At the beginning, I thought to use tst_timeout_mul() function which will be
introduced by Richard's new 1/5 patch 'lib: Allow user to easily get
LTP_TIMEOUT_MUL value". But after looking at this tst_get_timeout(), it
seems more useful to ltp testcase in future. So I stand by this method.

And, test get pass on kernel 4.19.0-rc1+ x86_64.
Cyril Hrubis Aug. 28, 2018, 12:58 p.m. UTC | #2
Hi!
It's just an idea, but we can make this even more elegant API.

We measure the time in the test library anyway, so what about we added
something as tst_timeout_reached() that would return number of seconds
remaining to 80% of the real timeout or 0 if in a case that the timeout
was reached. Then we can use this as a soft-timeout in all the testcases
without any additional steps.
Richard Palethorpe Aug. 28, 2018, 2:20 p.m. UTC | #3
Hello,

Cyril Hrubis <chrubis@suse.cz> writes:

> Hi!
> It's just an idea, but we can make this even more elegant API.
>
> We measure the time in the test library anyway, so what about we added
> something as tst_timeout_reached() that would return number of seconds
> remaining to 80% of the real timeout or 0 if in a case that the timeout
> was reached. Then we can use this as a soft-timeout in all the testcases
> without any additional steps.
>
> --
> Cyril Hrubis
> chrubis@suse.cz

80% is probably way more than many of the CVE test cases need unless the
overall timeout is reduced from 5 minutes. Probably 20% would be
OK. Assuming this is the kind of usage scenario you had in mind.

We could also call it tst_timeout_approaching, tst_timeout_near or
tst_time_to_fail... not sure if they are any better.

--
Thank you,
Richard.
Jan Stancek Aug. 28, 2018, 2:38 p.m. UTC | #4
----- Original Message -----
> Hello,
> 
> Cyril Hrubis <chrubis@suse.cz> writes:
> 
> > Hi!
> > It's just an idea, but we can make this even more elegant API.
> >
> > We measure the time in the test library anyway, so what about we added
> > something as tst_timeout_reached() that would return number of seconds
> > remaining to 80% of the real timeout or 0 if in a case that the timeout
> > was reached. Then we can use this as a soft-timeout in all the testcases
> > without any additional steps.
> >
> > --
> > Cyril Hrubis
> > chrubis@suse.cz
> 
> 80% is probably way more than many of the CVE test cases need unless the
> overall timeout is reduced from 5 minutes. Probably 20% would be
> OK. Assuming this is the kind of usage scenario you had in mind.

I'd leave it to user. Give him data how much time is left,
and let him decide what is sensible limit for soft-timeout.

I'll send example in v3 series shortly.

> 
> We could also call it tst_timeout_approaching, tst_timeout_near or
> tst_time_to_fail... not sure if they are any better.
> 
> --
> Thank you,
> Richard.
>
Li Wang Aug. 29, 2018, 4:52 a.m. UTC | #5
On Tue, Aug 28, 2018 at 10:38 PM, Jan Stancek <jstancek@redhat.com> wrote:

>
>
> ----- Original Message -----
> > Hello,
> >
> > Cyril Hrubis <chrubis@suse.cz> writes:
> >
> > > Hi!
> > > It's just an idea, but we can make this even more elegant API.
> > >
> > > We measure the time in the test library anyway, so what about we added
> > > something as tst_timeout_reached() that would return number of seconds
> > > remaining to 80% of the real timeout or 0 if in a case that the timeout
> > > was reached. Then we can use this as a soft-timeout in all the
> testcases
> > > without any additional steps.
> > >
> > > --
> > > Cyril Hrubis
> > > chrubis@suse.cz
> >
> > 80% is probably way more than many of the CVE test cases need unless the
> > overall timeout is reduced from 5 minutes. Probably 20% would be
> > OK. Assuming this is the kind of usage scenario you had in mind.
>
> I'd leave it to user. Give him data how much time is left,
> and let him decide what is sensible limit for soft-timeout.
>
> Hmm, I'm not sure if I have any misunderstood on Cyril's words. But from
what I think, maybe we also could give more flexible to customize the
soft-timeout as tst_timeout_reached(0.8) to return true when testcase
reached 80% of the real timeout. This makes thing more easier and can
satisfy some kind of demanded.

Here I draw the main idea base on Jan's V3 patch:


diff --git a/include/tst_test.h b/include/tst_test.h
index 98dacf3..7318c3e 100644
--- a/include/tst_test.h
+++ b/include/tst_test.h
@@ -218,6 +218,7 @@ const char *tst_strsig(int sig);
 const char *tst_strstatus(int status);

 void tst_set_timeout(int timeout);
+unsigned int tst_timeout_reached(float ratio);

 #ifndef TST_NO_DEFAULT_MAIN

diff --git a/lib/tst_test.c b/lib/tst_test.c
index 2f3d357..7864aa5 100644
--- a/lib/tst_test.c
+++ b/lib/tst_test.c
@@ -47,6 +47,8 @@ static int iterations = 1;
 static float duration = -1;
 static pid_t main_pid, lib_pid;
 static int mntpoint_mounted;
+static clockid_t tst_clock;
+static struct timespec tst_start_time;

 struct results {
  int passed;
@@ -758,6 +760,7 @@ static void do_setup(int argc, char *argv[])

  if (tst_test->sample)
  tst_test = tst_timer_test_setup(tst_test);
+ tst_clock = tst_timer_find_clock();

  parse_opts(argc, argv);

@@ -1012,6 +1015,8 @@ void tst_set_timeout(int timeout)
  results->timeout = results->timeout * m + 0.5;
  }

+ if (tst_clock_gettime(tst_clock, &tst_start_time))
+ tst_res(TWARN | TERRNO, "tst_clock_gettime() failed");
  tst_res(TINFO, "Timeout per run is %uh %02um %02us",
  results->timeout/3600, (results->timeout%3600)/60,
  results->timeout % 60);
@@ -1022,6 +1027,24 @@ void tst_set_timeout(int timeout)
  heartbeat();
 }

+unsigned int tst_timeout_reached(float ratio)
+{
+       static struct timespec now;
+       unsigned int elapsed;
+
+       if (ratio >= 1 || ratio <= 0)
+               tst_brk(TBROK, "ratio should be: 0 < ratio < 1");
+
+       if (tst_clock_gettime(tst_clock, &now))
+               tst_res(TWARN | TERRNO, "tst_clock_gettime() failed");
+
+       elapsed = tst_timespec_diff_ms(now, tst_start_time) / 1000;
+       if (elapsed >= (results->timeout * ratio))
+               return 1;
+
+       return 0;
+}
+
 static int fork_testrun(void)
 {
  int status;
diff --git a/testcases/kernel/syscalls/move_pages/move_pages12.c
b/testcases/kernel/syscalls/move_pages/move_pages12.c
index 43acb42..0dc94ee 100644
--- a/testcases/kernel/syscalls/move_pages/move_pages12.c
+++ b/testcases/kernel/syscalls/move_pages/move_pages12.c
@@ -123,14 +123,15 @@ static void do_test(void)
  memset(addr, 0, TEST_PAGES * hpsz);

  SAFE_MUNMAP(addr, TEST_PAGES * hpsz);
- }

- if (i == LOOPS) {
- SAFE_KILL(cpid, SIGKILL);
- SAFE_WAITPID(cpid, &status, 0);
- if (!WIFEXITED(status))
- tst_res(TPASS, "Bug not reproduced");
+ if(tst_timeout_reached(0.8))
+ break;
  }
+
+ SAFE_KILL(cpid, SIGKILL);
+ SAFE_WAITPID(cpid, &status, 0);
+ if (!WIFEXITED(status))
+ tst_res(TPASS, "Bug not reproduced");
 }
Jan Stancek Aug. 29, 2018, 7:18 a.m. UTC | #6
----- Original Message -----
> On Tue, Aug 28, 2018 at 10:38 PM, Jan Stancek <jstancek@redhat.com> wrote:
> 
> >
> >
> > ----- Original Message -----
> > > Hello,
> > >
> > > Cyril Hrubis <chrubis@suse.cz> writes:
> > >
> > > > Hi!
> > > > It's just an idea, but we can make this even more elegant API.
> > > >
> > > > We measure the time in the test library anyway, so what about we added
> > > > something as tst_timeout_reached() that would return number of seconds
> > > > remaining to 80% of the real timeout or 0 if in a case that the timeout
> > > > was reached. Then we can use this as a soft-timeout in all the
> > testcases
> > > > without any additional steps.
> > > >
> > > > --
> > > > Cyril Hrubis
> > > > chrubis@suse.cz
> > >
> > > 80% is probably way more than many of the CVE test cases need unless the
> > > overall timeout is reduced from 5 minutes. Probably 20% would be
> > > OK. Assuming this is the kind of usage scenario you had in mind.
> >
> > I'd leave it to user. Give him data how much time is left,
> > and let him decide what is sensible limit for soft-timeout.
> >
> > Hmm, I'm not sure if I have any misunderstood on Cyril's words. But from
> what I think, maybe we also could give more flexible to customize the
> soft-timeout as tst_timeout_reached(0.8) to return true when testcase
> reached 80% of the real timeout. This makes thing more easier and can
> satisfy some kind of demanded.

Sure, but then we are always working with ratios, and can't do something like
"15 seconds before timeout do X".
diff mbox series

Patch

diff --git a/include/tst_test.h b/include/tst_test.h
index 98dacf3873ab..f801d276d2e5 100644
--- a/include/tst_test.h
+++ b/include/tst_test.h
@@ -217,6 +217,7 @@  const char *tst_strsig(int sig);
  */
 const char *tst_strstatus(int status);
 
+unsigned int tst_get_timeout(void);
 void tst_set_timeout(int timeout);
 
 #ifndef TST_NO_DEFAULT_MAIN
diff --git a/lib/tst_test.c b/lib/tst_test.c
index 2f3d357d2fcc..7bd18205ae7f 100644
--- a/lib/tst_test.c
+++ b/lib/tst_test.c
@@ -992,6 +992,11 @@  static void sigint_handler(int sig LTP_ATTRIBUTE_UNUSED)
 	}
 }
 
+unsigned int tst_get_timeout(void)
+{
+	return results->timeout;
+}
+
 void tst_set_timeout(int timeout)
 {
 	char *mul = getenv("LTP_TIMEOUT_MUL");