[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC 0/4] transaction-based ptimer API
From: |
Peter Maydell |
Subject: |
[RFC 0/4] transaction-based ptimer API |
Date: |
Fri, 4 Oct 2019 12:48:44 +0100 |
Currently the ptimer design uses a QEMU bottom-half as its mechanism
for calling back into the device model using the ptimer when the
timer has expired. Unfortunately this design is fatally flawed,
because it means that there is a lag between the ptimer updating its
own state and the device callback function updating device state, and
guest accesses to device registers between the two can return
inconsistent device state. This was reported as a bug in a specific
timer device but it's a problem with the generic ptimer code:
https://bugs.launchpad.net/qemu/+bug/1777777
This RFC patchset introduces a change to the ptimer API so that
instead of using a bottom-half for the trigger a device can choose to
use a new 'transaction' based approach. In this design (suggested by
RTH) all calls which modify ptimer state:
- ptimer_set_period()
- ptimer_set_freq()
- ptimer_set_limit()
- ptimer_set_count()
- ptimer_run()
- ptimer_stop()
must be between matched calls to ptimer_transaction_begin() and
ptimer_transaction_commit(). When ptimer_transaction_commit() is
called it will evaluate the state of the timer after all the changes
in the transaction, and call the callback if necessary.
I'm sending this out as an RFC to get opinions on the new API
before I proceed to converting all the users of ptimer. (My
plan is that the final patchset will start with these patches,
have another couple of dozen patches changing the other timer
devices using ptimer, and then have a "delete the BH API/code"
patch. Or we could split the "change to new API" parts into
smaller per-architecture ones.)
Patch 1 is some new trace events I added to the arm_timer code
while I was investigating the original bug report.
Patch 2 is just a function rename so we can keep the nicer
"ptimer_init()" name for the new API.
Patch 3 adds the new API and its implementation.
Patch 4 is a sample conversion of a ptimer-using device,
which fixes the reported bug:
https://bugs.launchpad.net/qemu/+bug/1777777
thanks
-- PMM
Peter Maydell (4):
hw/timer/arm_timer: Add trace events
ptimer: Rename ptimer_init() to ptimer_init_with_bh()
ptimer: Provide new transaction-based API
hw/timer/arm_timer.c: Switch to transaction-based ptimer API
include/hw/ptimer.h | 77 ++++++++++++++++++--
hw/arm/musicpal.c | 2 +-
hw/core/ptimer.c | 116 +++++++++++++++++++++++++++----
hw/dma/xilinx_axidma.c | 2 +-
hw/m68k/mcf5206.c | 2 +-
hw/m68k/mcf5208.c | 2 +-
hw/net/fsl_etsec/etsec.c | 2 +-
hw/net/lan9118.c | 2 +-
hw/timer/allwinner-a10-pit.c | 2 +-
hw/timer/altera_timer.c | 2 +-
hw/timer/arm_mptimer.c | 6 +-
hw/timer/arm_timer.c | 43 +++++++++---
hw/timer/cmsdk-apb-dualtimer.c | 2 +-
hw/timer/cmsdk-apb-timer.c | 2 +-
hw/timer/digic-timer.c | 2 +-
hw/timer/etraxfs_timer.c | 6 +-
hw/timer/exynos4210_mct.c | 7 +-
hw/timer/exynos4210_pwm.c | 2 +-
hw/timer/exynos4210_rtc.c | 4 +-
hw/timer/grlib_gptimer.c | 2 +-
hw/timer/imx_epit.c | 4 +-
hw/timer/imx_gpt.c | 2 +-
hw/timer/lm32_timer.c | 2 +-
hw/timer/milkymist-sysctl.c | 4 +-
hw/timer/mss-timer.c | 2 +-
hw/timer/puv3_ost.c | 2 +-
hw/timer/sh_timer.c | 2 +-
hw/timer/slavio_timer.c | 2 +-
hw/timer/xilinx_timer.c | 2 +-
hw/watchdog/cmsdk-apb-watchdog.c | 2 +-
tests/ptimer-test.c | 22 +++---
hw/timer/trace-events | 7 ++
32 files changed, 263 insertions(+), 75 deletions(-)
--
2.20.1
- [RFC 0/4] transaction-based ptimer API,
Peter Maydell <=
- [RFC 1/4] hw/timer/arm_timer: Add trace events, Peter Maydell, 2019/10/04
- [RFC 2/4] ptimer: Rename ptimer_init() to ptimer_init_with_bh(), Peter Maydell, 2019/10/04
- [RFC 4/4] hw/timer/arm_timer.c: Switch to transaction-based ptimer API, Peter Maydell, 2019/10/04
- [RFC 3/4] ptimer: Provide new transaction-based API, Peter Maydell, 2019/10/04
- Re: [RFC 0/4] transaction-based ptimer API, Paolo Bonzini, 2019/10/04