linux/arch/s390/kvm
David Hildenbrand 9c23a1318e KVM: s390: protect VCPU cpu timer with a seqcount
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: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
2016-03-08 13:57:53 +01:00
..
diag.c KVM: Use common function for VCPU lookup by id 2015-11-30 12:47:04 +01:00
gaccess.c KVM: s390: gaccess: implement instruction fetching mode 2016-02-10 13:12:51 +01:00
gaccess.h KVM: s390: gaccess: implement instruction fetching mode 2016-02-10 13:12:51 +01:00
guestdbg.c s390: remove all usages of PSW_ADDR_INSN 2016-01-19 12:14:03 +01:00
intercept.c KVM: s390: irq delivery should not rely on icptcode 2016-02-10 13:12:53 +01:00
interrupt.c KVM: s390: abstract access to the VCPU cpu timer 2016-03-08 13:57:52 +01:00
irq.h KVM: s390: irq routing for adapter interrupts. 2014-03-21 13:43:00 +01:00
Kconfig KVM: s390: Enable the KVM-VFIO device 2016-01-26 15:40:17 +01:00
kvm-s390.c KVM: s390: protect VCPU cpu timer with a seqcount 2016-03-08 13:57:53 +01:00
kvm-s390.h KVM: s390: abstract access to the VCPU cpu timer 2016-03-08 13:57:52 +01:00
Makefile KVM: s390: Enable the KVM-VFIO device 2016-01-26 15:40:17 +01:00
priv.c KVM: s390: gaccess: introduce access modes 2016-02-10 13:12:50 +01:00
sigp.c KVM: s390: fix wrong lookup of VCPUs by array index 2015-11-19 14:47:43 +01:00
trace-s390.h KVM: s390: obey kptr_restrict in traces 2015-12-15 17:06:32 +01:00
trace.h KVM: s390: interpretive execution of SIGP EXTERNAL CALL 2014-05-16 14:57:28 +02:00