Skip to content
  • Paolo Bonzini's avatar
    icount: prepare the code for future races in calling qemu_clock_warp · ce78d18c
    Paolo Bonzini authored
    
    
    Computing the deadline of all vm_clocks is somewhat expensive and calls
    out to qemu-timer.c; two reasons not to do it in the seqlock's write-side
    critical section.  This however opens the door for races in setting and
    reading vm_clock_warp_start.
    
    To plug them, we need to cover the case where a new deadline slips in
    between the call to qemu_clock_deadline_ns_all and the actual modification
    of the icount_warp_timer.  Restrict changes to vm_clock_warp_start and
    the icount_warp_timer's expiration time, to only move them back (which
    would simply cause an early wakeup).
    
    If a vm_clock timer is cancelled while CPUs are idle, this might cause the
    icount_warp_timer to fire unnecessarily.  This is not a problem, after it
    fires the timer becomes inactive and the next call to timer_mod_anticipate
    will be precise.
    
    In addition to this, we must deactivate the icount_warp_timer _before_
    checking whether CPUs are idle.  This way, if the "last" CPU becomes idle
    during the call to timer_del we will still set up the icount_warp_timer.
    
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    ce78d18c