id = 2703 title = "ptimer period sporadically too long" state = "closed" created_at = "2024-11-27T14:19:00.476Z" closed_at = "2025-03-09T00:40:01.337Z" labels = ["icount"] url = "https://gitlab.com/qemu-project/qemu/-/issues/2703" host-os = "EndeavourOS" host-arch = "x86" qemu-version = "9.1.0 (v9.1.0-27-g154e0ea1fe-dirty) // custom device added" guest-os = "Linux" guest-arch = "x86" description = """A ptimer in a custom device with a frequency of 10kHz is sporadically called after more than 100,000ns in virtual time have elapsed. With a icount shift of 4 or 5 this happens almost everytime before the linux guest can even finish booting. With a shift of 0 this happens very rarely, but it does occur from time to time.""" reproduce = """1. setup a ptimer with a frequency of 10kHz and assert that the time passed between callbacks is exactly 100,000ns 2. run 3. wait for boom""" additional = """``` // Timer setup ptimer_transaction_begin(state->timer); ptimer_set_freq(state->timer, 10000); ptimer_run(state->timer, 0); ptimer_transaction_commit(state->timer); ``` ``` // timer callback int64_t now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL); static int64_t last = 0; if (last > 0) { if (now - last != 100000) { fprintf(stderr, "error tick %ld after %ld is incorrect: %ld\\n", now, last, now - last); assert(0); } } last = now; ``` ``` error tick 47867503135 after 47867400000 is incorrect: 103135 qemu-system-x86_64: ../...file.c:119: timer_callback: Assertion `0' failed. ```"""