[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[UNIKRAFT PATCH RFCv3 31/32] plat/arm/generic_timer: Fix assert in ns_to_ticks



There is a UK_ASSERT hit when testing nginx app with backtrace:
[   88.612809] CRIT: [libkvmplat] generic_timer.c @ 84   : Assertion failure: 
ns <= (3600UL*((1) * 1000000000ULL))
[   88.614229] Info: [libkvmplat] shutdown.c @ 35   : Unikraft halted
        [0x4010514c] uk_dump_backtrace+0/0x4c
        [0x40100d78] ns_to_ticks+0x68/0x98
        [0x40101028] generic_timer_cpu_block_until+0x94/0xd8
        [0x40100a08] time_block_until+0x18/0x5c
        [0x401049ec] ukplat_lcpu_halt_to+0x1c/0x30
        [0x4011f258] schedcoop_schedule+0x370/0x414
        [0x4011f7d0] schedcoop_yield+0x14/0x20
        [0x40141568] uk_sched_yield+0xf4/0x100
        [0x40141d60] uk_9preq_waitreply+0x94/0xe4
        [0x40144a24] send_and_wait_zc+0x94/0xc4
        [0x40144a80] send_and_wait_no_zc+0x2c/0x34
        [0x40145370] uk_9p_open+0xcc/0x19c
        [0x4013941c] uk_9pfs_write+0x118/0x2a4
        [0x40132790] vfs_write+0xb8/0x134
        [0x4012a744] sys_write+0x158/0x188
        [0x4012dd5c] pwrite+0x78/0xdc
        [0x4012dee0] __uk_syscall_e_write+0x28/0x30
        [0x4012deb0] uk_syscall_e_write+0x34/0x3c
        [0x4012dde4] write+0x24/0x2c
        [0x4022da44] ngx_write_fd+0x24/0x2c
        [0x4022dd70] ngx_log_error_core+0x324/0x45c
        [0x40235f90] ngx_destroy_pool+0x16c/0x228
        [0x4027a278] ngx_http_close_connection+0x9c/0xa8
        [0x40279584] ngx_http_keepalive_handler+0x26c/0x348
        [0x402564dc] ngx_event_process_posted+0xfc/0x11c
        [0x40250bd8] ngx_process_events_and_timers+0x1c8/0x1d8
        [0x4025c368] ngx_single_process_cycle+0xf4/0x294
        [0x4021b4fc] nginx_main+0x560/0x580
        [0x4021ae7c] main+0x1c/0x24

This fixes it by acquiring until_ticks only when now_ns < until_ns

Signed-off-by: Jia He <justin.he@xxxxxxx>
---
 plat/common/arm/generic_timer.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/plat/common/arm/generic_timer.c b/plat/common/arm/generic_timer.c
index 58a9f40..1b63f84 100644
--- a/plat/common/arm/generic_timer.c
+++ b/plat/common/arm/generic_timer.c
@@ -220,10 +220,10 @@ void generic_timer_cpu_block_until(uint64_t until_ns)
 
        /* Record current ns and until_ticks for timer */
        now_ns = ukplat_monotonic_clock();
-       until_ticks = generic_timer_get_ticks()
-                               + ns_to_ticks(until_ns - now_ns);
 
        if (now_ns < until_ns) {
+               until_ticks = generic_timer_get_ticks()
+                               + ns_to_ticks(until_ns - now_ns);
                generic_timer_update_compare(until_ticks);
                generic_timer_enable();
                generic_timer_unmask_irq();
-- 
2.17.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.