diff options
author | Paolo Bonzini <pbonzini@redhat.com> | 2016-03-10 16:30:22 +0100 |
---|---|---|
committer | Radim Krčmář <rkrcmar@redhat.com> | 2016-04-20 15:29:17 +0200 |
commit | 2e4682ba2ed79d8082b78d292b3b80f54d970b7a (patch) | |
tree | 8e5b5b046d1e680516b2491275cfb1df9d14d2ab /include/linux/kvm_host.h | |
parent | 46971a2f59f135341f8912f516540fef6890d4df (diff) | |
download | lwn-2e4682ba2ed79d8082b78d292b3b80f54d970b7a.tar.gz lwn-2e4682ba2ed79d8082b78d292b3b80f54d970b7a.zip |
KVM: add missing memory barrier in kvm_{make,check}_request
kvm_make_request and kvm_check_request imply a producer-consumer
relationship; add implicit memory barriers to them. There was indeed
already a place that was adding an explicit smp_mb() to order between
kvm_check_request and the processing of the request. That memory
barrier can be removed (as an added benefit, kvm_check_request can use
smp_mb__after_atomic which is free on x86).
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'include/linux/kvm_host.h')
-rw-r--r-- | include/linux/kvm_host.h | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 5276fe0916fc..ad40d44784c7 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1091,6 +1091,11 @@ static inline bool kvm_vcpu_compatible(struct kvm_vcpu *vcpu) { return true; } static inline void kvm_make_request(int req, struct kvm_vcpu *vcpu) { + /* + * Ensure the rest of the request is published to kvm_check_request's + * caller. Paired with the smp_mb__after_atomic in kvm_check_request. + */ + smp_wmb(); set_bit(req, &vcpu->requests); } @@ -1098,6 +1103,12 @@ static inline bool kvm_check_request(int req, struct kvm_vcpu *vcpu) { if (test_bit(req, &vcpu->requests)) { clear_bit(req, &vcpu->requests); + + /* + * Ensure the rest of the request is visible to kvm_check_request's + * caller. Paired with the smp_wmb in kvm_make_request. + */ + smp_mb__after_atomic(); return true; } else { return false; |