timer: remove QEMU_TICKLESS_WORKAROUND

Qemu icount mode enabled, remove QEMU_TICKLESS_WORKAROUND.

Signed-off-by: Wentong Wu <wentong.wu@intel.com>
This commit is contained in:
Wentong Wu 2020-05-12 10:32:40 +08:00 committed by Carles Cufí
commit 72227574d8
15 changed files with 9 additions and 42 deletions

View file

@ -305,20 +305,4 @@ config TICKLESS_CAPABLE
z_clock_announce() (really, not to produce an interrupt at
all) until the specified expiration.
config QEMU_TICKLESS_WORKAROUND
bool "Disable tickless on qemu due to asynchrony bug"
depends on QEMU_TARGET && TICKLESS_KERNEL
help
Qemu (without -icount) has trouble keeping time when the
host process needs to timeshare. The host OS will routinely
schedule out a process at timescales equivalent to the guest
tick rate. With traditional ticks delivered regularly by
the hardware, that's mostly OK as it looks like a late
interrupt. But in tickless mode, the driver needs some CPU
in order to schedule the tick in the first place. If that
gets delayed across a tick boundary, time gets wonky. This
tunable is a hint to the driver to disable tickless
accounting on qemu. Use it only on tests that are known to
have problems.
endmenu

View file

@ -30,8 +30,7 @@ static void arm_arch_timer_compare_isr(void *arg)
last_cycle += delta_ticks * CYC_PER_TICK;
if (!IS_ENABLED(CONFIG_TICKLESS_KERNEL) ||
IS_ENABLED(CONFIG_QEMU_TICKLESS_WORKAROUND)) {
if (!IS_ENABLED(CONFIG_TICKLESS_KERNEL)) {
u64_t next_cycle = last_cycle + CYC_PER_TICK;
if ((s64_t)(next_cycle - curr_cycle) < MIN_DELAY) {
@ -62,7 +61,7 @@ void z_clock_set_timeout(s32_t ticks, bool idle)
{
ARG_UNUSED(idle);
#if defined(CONFIG_TICKLESS_KERNEL) && !defined(CONFIG_QEMU_TICKLESS_WORKAROUND)
#if defined(CONFIG_TICKLESS_KERNEL)
if (idle) {
return;

View file

@ -59,8 +59,7 @@ static void hpet_isr(void *arg)
last_count += dticks * cyc_per_tick;
if (!IS_ENABLED(CONFIG_TICKLESS_KERNEL) ||
IS_ENABLED(CONFIG_QEMU_TICKLESS_WORKAROUND)) {
if (!IS_ENABLED(CONFIG_TICKLESS_KERNEL)) {
u32_t next = last_count + cyc_per_tick;
if ((s32_t)(next - now) < MIN_DELAY) {
@ -128,7 +127,7 @@ void z_clock_set_timeout(s32_t ticks, bool idle)
{
ARG_UNUSED(idle);
#if defined(CONFIG_TICKLESS_KERNEL) && !defined(CONFIG_QEMU_TICKLESS_WORKAROUND)
#if defined(CONFIG_TICKLESS_KERNEL)
if (ticks == K_TICKS_FOREVER && idle) {
GENERAL_CONF_REG &= ~GCONF_ENABLE;
return;

View file

@ -14,8 +14,7 @@
#define MAX_TICKS ((MAX_CYC - CYC_PER_TICK) / CYC_PER_TICK)
#define MIN_DELAY 1000
#define TICKLESS (IS_ENABLED(CONFIG_TICKLESS_KERNEL) && \
!IS_ENABLED(CONFIG_QEMU_TICKLESS_WORKAROUND))
#define TICKLESS IS_ENABLED(CONFIG_TICKLESS_KERNEL)
static struct k_spinlock lock;
static u64_t last_count;
@ -93,7 +92,7 @@ void z_clock_set_timeout(s32_t ticks, bool idle)
{
ARG_UNUSED(idle);
#if defined(CONFIG_TICKLESS_KERNEL) && !defined(CONFIG_QEMU_TICKLESS_WORKAROUND)
#if defined(CONFIG_TICKLESS_KERNEL)
/* RISCV has no idle handler yet, so if we try to spin on the
* logic below to reset the comparator, we'll always bump it
* forward to the "next tick" due to MIN_DELAY handling and

View file

@ -44,8 +44,7 @@ static void ccompare_isr(void *arg)
last_count += dticks * CYC_PER_TICK;
if (!IS_ENABLED(CONFIG_TICKLESS_KERNEL) ||
IS_ENABLED(CONFIG_QEMU_TICKLESS_WORKAROUND)) {
if (!IS_ENABLED(CONFIG_TICKLESS_KERNEL)) {
u32_t next = last_count + CYC_PER_TICK;
if ((s32_t)(next - curr) < MIN_DELAY) {
@ -70,7 +69,7 @@ void z_clock_set_timeout(s32_t ticks, bool idle)
{
ARG_UNUSED(idle);
#if defined(CONFIG_TICKLESS_KERNEL) && !defined(CONFIG_QEMU_TICKLESS_WORKAROUND)
#if defined(CONFIG_TICKLESS_KERNEL)
ticks = ticks == K_TICKS_FOREVER ? MAX_TICKS : ticks;
ticks = MAX(MIN(ticks - 1, (s32_t)MAX_TICKS), 0);

View file

@ -9,6 +9,5 @@ CONFIG_THREAD_MONITOR=y
CONFIG_INIT_STACKS=y
CONFIG_POLL=y
CONFIG_SCHED_SCALABLE=y
CONFIG_QEMU_TICKLESS_WORKAROUND=y
# The Zephyr CMSIS v2 emulation assumes that ticks are ms, currently
CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000

View file

@ -2,7 +2,6 @@ CONFIG_ZTEST=y
CONFIG_PRINTK=y
CONFIG_LOG=y
CONFIG_POLL=y
CONFIG_QEMU_TICKLESS_WORKAROUND=y
CONFIG_BOOT_DELAY=500
CONFIG_IRQ_OFFLOAD=y
CONFIG_TEST_USERSPACE=y

View file

@ -2,7 +2,6 @@ CONFIG_ZTEST=y
CONFIG_IRQ_OFFLOAD=y
CONFIG_NUM_PREEMPT_PRIORITIES=30
#CONFIG_SCHED_SCALABLE=y
CONFIG_QEMU_TICKLESS_WORKAROUND=y
CONFIG_MAX_THREAD_BYTES=4
CONFIG_TEST_USERSPACE=y
CONFIG_MP_NUM_CPUS=1

View file

@ -2,6 +2,5 @@ CONFIG_ZTEST=y
CONFIG_IRQ_OFFLOAD=y
CONFIG_TEST_USERSPACE=y
CONFIG_SCHED_MULTIQ=y
CONFIG_QEMU_TICKLESS_WORKAROUND=y
CONFIG_MAX_THREAD_BYTES=4
CONFIG_MP_NUM_CPUS=1

View file

@ -1,5 +1,4 @@
CONFIG_IRQ_OFFLOAD=y
CONFIG_ZTEST=y
CONFIG_QEMU_TICKLESS_WORKAROUND=y
CONFIG_TEST_USERSPACE=y
CONFIG_MP_NUM_CPUS=1

View file

@ -1,5 +1,4 @@
CONFIG_ZTEST=y
CONFIG_QEMU_TICKLESS_WORKAROUND=y
CONFIG_TEST_USERSPACE=y
CONFIG_MP_NUM_CPUS=1

View file

@ -1,5 +1,4 @@
CONFIG_ZTEST=y
CONFIG_QEMU_TICKLESS_WORKAROUND=y
CONFIG_POLL=y
# Not a single test case here is SMP-safe. Save the cycles needed for

View file

@ -20,7 +20,5 @@ CONFIG_MAIN_STACK_SIZE=2048
CONFIG_ZTEST=y
CONFIG_QEMU_TICKLESS_WORKAROUND=y
CONFIG_NET_TEST=y
CONFIG_NET_LOOPBACK=y

View file

@ -26,5 +26,3 @@ CONFIG_ZTEST=y
# User mode requirements
CONFIG_TEST_USERSPACE=y
CONFIG_HEAP_MEM_POOL_SIZE=128
CONFIG_QEMU_TICKLESS_WORKAROUND=y

View file

@ -30,5 +30,3 @@ CONFIG_ZTEST=y
# User mode requirements
CONFIG_TEST_USERSPACE=y
CONFIG_HEAP_MEM_POOL_SIZE=2048
CONFIG_QEMU_TICKLESS_WORKAROUND=y