test/timeout: revert use of memory barriers

The memory barriers where introduced with commit "test-timeout: fix build
errors with -std=gnu++20" presumably in order to prevent GCC optimization from
removing the empty for loops the test is using because using a volatile index
variable was no longer an option.

However, the memory barriers seem to have a negative effect on the measurements
performed with the affected loops. The commit caused the timeout test to fail
at least on imx53_qsb.

This commit fixes the issue by using a simple empty for loop without volatiles
or memory barriers but protected inside a function that is compiled with
optimization disabled.

Ref #4959
This commit is contained in:
Martin Stein 2023-07-07 11:31:44 +02:00 committed by Norman Feske
parent e18c02991e
commit 647631af09

View File

@ -18,7 +18,6 @@
#include <util/fifo.h> #include <util/fifo.h>
#include <util/misc_math.h> #include <util/misc_math.h>
#include <base/attached_rom_dataspace.h> #include <base/attached_rom_dataspace.h>
#include <cpu/memory_barrier.h>
using namespace Genode; using namespace Genode;
@ -51,17 +50,15 @@ static bool precise_time(Xml_node config)
return false; return false;
} }
struct A1 {
A1() {
log(__func__,__LINE__);
}
};
struct A2 { #pragma GCC push_options
A2() { #pragma GCC optimize("O0")
log(__func__,__LINE__); void delay_loop(unsigned long num_iterations)
{
for (unsigned long idx = 0; idx < num_iterations; idx++) { }
} }
}; #pragma GCC pop_options
struct Test struct Test
{ {
@ -522,7 +519,7 @@ struct Fast_polling : Test
/* measure consumed time of a limited busy loop */ /* measure consumed time of a limited busy loop */
uint64_t volatile start_ms = timer_2.elapsed_ms(); uint64_t volatile start_ms = timer_2.elapsed_ms();
for (unsigned long cnt = 0; cnt < max_cnt; cnt++) memory_barrier(); delay_loop(max_cnt);
uint64_t volatile end_ms = timer_2.elapsed_ms(); uint64_t volatile end_ms = timer_2.elapsed_ms();
/* /*
@ -569,8 +566,7 @@ struct Fast_polling : Test
for (unsigned poll = 0; poll < nr_of_polls; poll++) { for (unsigned poll = 0; poll < nr_of_polls; poll++) {
/* create delay between two polls */ /* create delay between two polls */
for (unsigned long i = 0; i < delay_loops_per_poll_; i++) delay_loop(delay_loops_per_poll_);
memory_barrier();
/* count delay loops to limit frequency of remote time reading */ /* count delay loops to limit frequency of remote time reading */
delay_loops = delay_loops + delay_loops_per_poll_; delay_loops = delay_loops + delay_loops_per_poll_;