KVM: arm/arm64: vgic: Use READ_ONCE fo cmpxchg
authorChristoffer Dall <cdall@linaro.org>
Wed, 2 Aug 2017 14:28:42 +0000 (16:28 +0200)
committerMarc Zyngier <marc.zyngier@arm.com>
Thu, 3 Aug 2017 14:47:36 +0000 (15:47 +0100)
There is a small chance that the compiler could generate separate loads
for the dist->propbaser which could be modified from another CPU.  As we
want to make sure we atomically update the entire value, and don't race
with other updates, guarantee that the cmpxchg operation compares
against the original value.

Acked-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Christoffer Dall <cdall@linaro.org>
Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
virt/kvm/arm/vgic/vgic-mmio-v3.c

index 714fa393354613de21aef3184360689699bbbfd0..408ef06638fc6c7d8a459576e30feacaa3c3cea2 100644 (file)
@@ -369,7 +369,7 @@ static void vgic_mmio_write_propbase(struct kvm_vcpu *vcpu,
                return;
 
        do {
-               old_propbaser = dist->propbaser;
+               old_propbaser = READ_ONCE(dist->propbaser);
                propbaser = old_propbaser;
                propbaser = update_64bit_reg(propbaser, addr & 4, len, val);
                propbaser = vgic_sanitise_propbaser(propbaser);
@@ -397,7 +397,7 @@ static void vgic_mmio_write_pendbase(struct kvm_vcpu *vcpu,
                return;
 
        do {
-               old_pendbaser = vgic_cpu->pendbaser;
+               old_pendbaser = READ_ONCE(vgic_cpu->pendbaser);
                pendbaser = old_pendbaser;
                pendbaser = update_64bit_reg(pendbaser, addr & 4, len, val);
                pendbaser = vgic_sanitise_pendbaser(pendbaser);