Il 22/07/2014 11:58, Sebastian Tanase ha scritto:
> 
> -timers_state.cpu_clock_offset contains the offset between the real and 
> virtual clocks.
> However, when using the value of the virtual clock 
> (qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL)),
> qemu_icount_bias already includes this offset because, on ARM, 
> qemu_clock_warp (which 
> then calls icount_warp_rt) is called for the first time in tcg_exec_all, 
> making
> qemu_icount_bias take the value of qemu_clock_get_ns(QEMU_CLOCK_REALTIME)

Does this means that QEMU_CLOCK_VIRTUAL counts up from
qemu_clock_get_ns(QEMU_CLOCK_REALTIME) rather than 0?  This would be a
bug, and it would be good to fix it (by initializing vm_clock_warp_start
to -1).

> A solution to not compute the initial offset in qemu_icount_bias would be to 
> initialize 
> vm_clock_warp_start to -1. The result  will be that qemu_icount_bias will 
> start counting when
> the vcpu goes from active to inactive. At that time, vm_clock_warp_start will 
> already store the realtime clock 
> value and a timer on the real clock will be set to expire at clock + 
> deadline, making qemu_icount_bias increment
> by deadline.

That would be correct.

> A consequence of initializing vm_clock_warp_start to -1 is also 
> the fact that we'll skip the first check for a virtual expired timer. As I 
> mentioned above, in ARM case, 
> it's not dangerous because there are no timers active the first time we 
> perform this check. However, this 
> is just a potential scenario and I cannot guarantee that on other target 
> architectures there won't be 
> an expired timer pending the first time we check.

Like a timer that expired in the past?  That would be caught in
tcg_cpu_exec, when it initializes the decrementer to
qemu_clock_deadline_ns_all(QEMU_CLOCK_VIRTUAL).

> So, do you think it is worth taking this solution into account or it will 
> cause more harm than good?

Yes, even more so.  If we add workarounds to complicated code, it will
become even more complicated.

Paolo

Reply via email to