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 z_clock_announce() (really, not to produce an interrupt at
all) until the specified expiration. 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 endmenu

View file

@ -30,8 +30,7 @@ static void arm_arch_timer_compare_isr(void *arg)
last_cycle += delta_ticks * CYC_PER_TICK; last_cycle += delta_ticks * CYC_PER_TICK;
if (!IS_ENABLED(CONFIG_TICKLESS_KERNEL) || if (!IS_ENABLED(CONFIG_TICKLESS_KERNEL)) {
IS_ENABLED(CONFIG_QEMU_TICKLESS_WORKAROUND)) {
u64_t next_cycle = last_cycle + CYC_PER_TICK; u64_t next_cycle = last_cycle + CYC_PER_TICK;
if ((s64_t)(next_cycle - curr_cycle) < MIN_DELAY) { 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); ARG_UNUSED(idle);
#if defined(CONFIG_TICKLESS_KERNEL) && !defined(CONFIG_QEMU_TICKLESS_WORKAROUND) #if defined(CONFIG_TICKLESS_KERNEL)
if (idle) { if (idle) {
return; return;

View file

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

View file

@ -14,8 +14,7 @@
#define MAX_TICKS ((MAX_CYC - CYC_PER_TICK) / CYC_PER_TICK) #define MAX_TICKS ((MAX_CYC - CYC_PER_TICK) / CYC_PER_TICK)
#define MIN_DELAY 1000 #define MIN_DELAY 1000
#define TICKLESS (IS_ENABLED(CONFIG_TICKLESS_KERNEL) && \ #define TICKLESS IS_ENABLED(CONFIG_TICKLESS_KERNEL)
!IS_ENABLED(CONFIG_QEMU_TICKLESS_WORKAROUND))
static struct k_spinlock lock; static struct k_spinlock lock;
static u64_t last_count; static u64_t last_count;
@ -93,7 +92,7 @@ void z_clock_set_timeout(s32_t ticks, bool idle)
{ {
ARG_UNUSED(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 /* 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 * logic below to reset the comparator, we'll always bump it
* forward to the "next tick" due to MIN_DELAY handling and * 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; last_count += dticks * CYC_PER_TICK;
if (!IS_ENABLED(CONFIG_TICKLESS_KERNEL) || if (!IS_ENABLED(CONFIG_TICKLESS_KERNEL)) {
IS_ENABLED(CONFIG_QEMU_TICKLESS_WORKAROUND)) {
u32_t next = last_count + CYC_PER_TICK; u32_t next = last_count + CYC_PER_TICK;
if ((s32_t)(next - curr) < MIN_DELAY) { if ((s32_t)(next - curr) < MIN_DELAY) {
@ -70,7 +69,7 @@ void z_clock_set_timeout(s32_t ticks, bool idle)
{ {
ARG_UNUSED(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 = ticks == K_TICKS_FOREVER ? MAX_TICKS : ticks;
ticks = MAX(MIN(ticks - 1, (s32_t)MAX_TICKS), 0); 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_INIT_STACKS=y
CONFIG_POLL=y CONFIG_POLL=y
CONFIG_SCHED_SCALABLE=y CONFIG_SCHED_SCALABLE=y
CONFIG_QEMU_TICKLESS_WORKAROUND=y
# The Zephyr CMSIS v2 emulation assumes that ticks are ms, currently # The Zephyr CMSIS v2 emulation assumes that ticks are ms, currently
CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000 CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,5 +1,4 @@
CONFIG_ZTEST=y CONFIG_ZTEST=y
CONFIG_QEMU_TICKLESS_WORKAROUND=y
CONFIG_POLL=y CONFIG_POLL=y
# Not a single test case here is SMP-safe. Save the cycles needed for # 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_ZTEST=y
CONFIG_QEMU_TICKLESS_WORKAROUND=y
CONFIG_NET_TEST=y CONFIG_NET_TEST=y
CONFIG_NET_LOOPBACK=y CONFIG_NET_LOOPBACK=y

View file

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

View file

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