• David Hildenbrand's avatar
    KVM: s390: protect VCPU cpu timer with a seqcount · 9c23a131
    David Hildenbrand authored
    For now, only the owning VCPU thread (that has loaded the VCPU) can get a
    consistent cpu timer value when calculating the delta. However, other
    threads might also be interested in a more recent, consistent value. Of
    special interest will be the timer callback of a VCPU that executes without
    having the VCPU loaded and could run in parallel with the VCPU thread.
    
    The cpu timer has a nice property: it is only updated by the owning VCPU
    thread. And speaking about accounting, a consistent value can only be
    calculated by looking at cputm_start and the cpu timer itself in
    one shot, otherwise the result might be wrong.
    
    As we only have one writing thread at a time (owning VCPU thread), we can
    use a seqcount instead of a seqlock and retry if the VCPU refreshed its
    cpu timer. This avoids any heavy locking and only introduces a counter
    update/check plus a handful of smp_wmb().
    
    The owning VCPU thread should never have to retry on reads, and also for
    other threads this might be a very rare scenario.
    
    Please note that we have to use the raw_* variants for locking the seqcount
    as lockdep will produce false warnings otherwise. The rq->lock held during
    vcpu_load/put is also acquired from hardirq context. Lockdep cannot know
    that we avoid potential deadlocks by disabling preemption and thereby
    disable concurrent write locking attempts (via vcpu_put/load).
    Reviewed-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
    Signed-off-by: default avatarDavid Hildenbrand <dahi@linux.vnet.ibm.com>
    Signed-off-by: default avatarChristian Borntraeger <borntraeger@de.ibm.com>
    9c23a131
kvm_host.h 18.4 KB