From 574a1bd198761f4ab217b3d7217d04cbf2a71376 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Thu, 2 Mar 2017 17:08:32 +0100 Subject: [PATCH] test/cpu_quota: tolerate errors in session quota Previously we pre-calculated the translation errors for the session quota to make a discret check in the test. But since the order, in which init childs get their CPU quota isn't always the same anymore (we should have never made assumptions about that) the translation errors differ from trial to trial. However, the errors are below 0.01% of the super period. We now tolerate them in the run script. Ref #2304 --- repos/base-hw/src/test/cpu_quota/main.cc | 7 ++-- repos/os/run/cpu_quota.run | 44 ++++++++++++++---------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/repos/base-hw/src/test/cpu_quota/main.cc b/repos/base-hw/src/test/cpu_quota/main.cc index 0bc65e340c..1fbe50b47c 100644 --- a/repos/base-hw/src/test/cpu_quota/main.cc +++ b/repos/base-hw/src/test/cpu_quota/main.cc @@ -124,6 +124,10 @@ struct Main Main(Env &env) : env(env) { + Cpu_session::Quota quota = env.cpu().quota(); + log("quota super period ", quota.super_period_us); + log("quota ", quota.us); + log("start measurement ..."); timer.sigh(timer_signal.cap); auto measure = [&] (unsigned duration_sec) { @@ -148,9 +152,6 @@ struct Main /* conclusion */ synchronizer.threshold(CONCLUSION_NR_OF_THREADS); synchronizer.synchronize(); - Cpu_session::Quota quota = env.cpu().quota(); - log("quota super period ", quota.super_period_us); - log("quota ", quota.us); log(counter_a); log(counter_b); log("done"); diff --git a/repos/os/run/cpu_quota.run b/repos/os/run/cpu_quota.run index 5b57cd5d17..cafdd7ffe0 100644 --- a/repos/os/run/cpu_quota.run +++ b/repos/os/run/cpu_quota.run @@ -135,7 +135,7 @@ proc check_counter { name opt cnt total_cnt } { global err_cnt set bad 0 - set class "Good: " + set class "Good:" set tol 0.01 set is 0 @@ -176,23 +176,37 @@ proc check_counter { name opt cnt total_cnt } { if {[expr abs($err) > $tol]} { - set class "Bad: " + set class "Bad: " set err_cnt [expr $err_cnt + 1] } - puts "$class$name received $is_fmt% CPU (goal $opt_fmt% tol $tol_fmt% err $err_fmt%)" + puts "$class $name received $is_fmt% CPU (goal $opt_fmt% tol $tol_fmt% err $err_fmt%)" } -proc check_quota { name opt_sp quota_sp opt quota } { +proc check_quota { name opt_sp quota_sp opt_pc quota } { global err_cnt - if {[expr $quota != $opt]} { - puts "Bad: $name has quota $quota us (goal $opt us)" + set opt [expr $opt_sp * $opt_pc / 100] + set quota_err [expr $quota - $opt] + set quota_class "Good:" + set sp_class "Good:" + + # + # We tolerate rounding errors up to 0.01% of the super period as the two + # quota translations from init to core and then from core to the user are + # distinct. + # + set quota_tol [expr $opt_sp * 1 / 10000] + + if {[expr abs($quota_err) > $quota_tol]} { + set quota_class "Bad: " set err_cnt [expr $err_cnt + 1] } if {[expr $quota_sp != $opt_sp]} { - puts "Bad: $name has super period $quota_sp us (goal $opt_sp us)" + set sp_class "Bad: " set err_cnt [expr $err_cnt + 1] } + puts "$quota_class $name has_quota $quota us (goal $opt tol $quota_tol err $quota_err us)" + puts "$sp_class $name has super period $quota_sp us (goal $opt_sp us)" } # pre-define variables if regexp does not match @@ -207,17 +221,11 @@ regexp {[0-9]+} [regexp -inline {slow. quota super period [0-9]+} $output] slow_ regexp {[0-9]+} [regexp -inline {midl. quota super period [0-9]+} $output] midl_quota_sp regexp {[0-9]+} [regexp -inline {fast. quota super period [0-9]+} $output] fast_quota_sp -# -# We have to consider the rounding errors as the two translations from init to -# core and then from core to the user are distinct. -# -# Slow quota (1000000 * (0x8000 * 5 / 100)) / 0x8000 = 49987 -# Slow quota (1000000 * (0x8000 * 20 / 100)) / 0x8000 = 199981 -# Slow quota (1000000 * (0x8000 * 60 / 100)) / 0x8000 = 599975 -# -check_quota "Slow test" 1000000 $slow_quota_sp 49987 $slow_quota -check_quota "Middle test" 1000000 $midl_quota_sp 199981 $midl_quota -check_quota "Fast test" 1000000 $fast_quota_sp 599975 $fast_quota +set super_period_us 1000000 + +check_quota "Slow test" $super_period_us $slow_quota_sp 5 $slow_quota +check_quota "Middle test" $super_period_us $midl_quota_sp 20 $midl_quota +check_quota "Fast test" $super_period_us $fast_quota_sp 60 $fast_quota regexp {[0-9]+} [regexp -inline {slow. counter A [0-9]+} $output] slow_a_cnt regexp {[0-9]+} [regexp -inline {midl. counter A [0-9]+} $output] midl_a_cnt