diff options
author | Thomas Huth <thuth@redhat.com> | 2015-09-18 02:57:28 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2015-09-20 19:05:15 -0400 |
commit | 3eb4ee68254235e4f47bc0410538fcdaede39589 (patch) | |
tree | 062222b787a8af59323b12c9dd928d12da111ad8 /arch/powerpc/kvm/book3s.c | |
parent | 7e022e717f54897e396504306d0c9b61452adf4e (diff) |
KVM: PPC: Book3S: Take the kvm->srcu lock in kvmppc_h_logical_ci_load/store()
Access to the kvm->buses (like with the kvm_io_bus_read() and -write()
functions) has to be protected via the kvm->srcu lock.
The kvmppc_h_logical_ci_load() and -store() functions are missing
this lock so far, so let's add it there, too.
This fixes the problem that the kernel reports "suspicious RCU usage"
when lock debugging is enabled.
Cc: stable@vger.kernel.org # v4.1+
Fixes: 99342cf8044420eebdf9297ca03a14cb6a7085a1
Signed-off-by: Thomas Huth <thuth@redhat.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/kvm/book3s.c')
-rw-r--r-- | arch/powerpc/kvm/book3s.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/powerpc/kvm/book3s.c b/arch/powerpc/kvm/book3s.c index cf009167d208..099c79d8c160 100644 --- a/arch/powerpc/kvm/book3s.c +++ b/arch/powerpc/kvm/book3s.c | |||
@@ -829,12 +829,15 @@ int kvmppc_h_logical_ci_load(struct kvm_vcpu *vcpu) | |||
829 | unsigned long size = kvmppc_get_gpr(vcpu, 4); | 829 | unsigned long size = kvmppc_get_gpr(vcpu, 4); |
830 | unsigned long addr = kvmppc_get_gpr(vcpu, 5); | 830 | unsigned long addr = kvmppc_get_gpr(vcpu, 5); |
831 | u64 buf; | 831 | u64 buf; |
832 | int srcu_idx; | ||
832 | int ret; | 833 | int ret; |
833 | 834 | ||
834 | if (!is_power_of_2(size) || (size > sizeof(buf))) | 835 | if (!is_power_of_2(size) || (size > sizeof(buf))) |
835 | return H_TOO_HARD; | 836 | return H_TOO_HARD; |
836 | 837 | ||
838 | srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
837 | ret = kvm_io_bus_read(vcpu, KVM_MMIO_BUS, addr, size, &buf); | 839 | ret = kvm_io_bus_read(vcpu, KVM_MMIO_BUS, addr, size, &buf); |
840 | srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx); | ||
838 | if (ret != 0) | 841 | if (ret != 0) |
839 | return H_TOO_HARD; | 842 | return H_TOO_HARD; |
840 | 843 | ||
@@ -869,6 +872,7 @@ int kvmppc_h_logical_ci_store(struct kvm_vcpu *vcpu) | |||
869 | unsigned long addr = kvmppc_get_gpr(vcpu, 5); | 872 | unsigned long addr = kvmppc_get_gpr(vcpu, 5); |
870 | unsigned long val = kvmppc_get_gpr(vcpu, 6); | 873 | unsigned long val = kvmppc_get_gpr(vcpu, 6); |
871 | u64 buf; | 874 | u64 buf; |
875 | int srcu_idx; | ||
872 | int ret; | 876 | int ret; |
873 | 877 | ||
874 | switch (size) { | 878 | switch (size) { |
@@ -892,7 +896,9 @@ int kvmppc_h_logical_ci_store(struct kvm_vcpu *vcpu) | |||
892 | return H_TOO_HARD; | 896 | return H_TOO_HARD; |
893 | } | 897 | } |
894 | 898 | ||
899 | srcu_idx = srcu_read_lock(&vcpu->kvm->srcu); | ||
895 | ret = kvm_io_bus_write(vcpu, KVM_MMIO_BUS, addr, size, &buf); | 900 | ret = kvm_io_bus_write(vcpu, KVM_MMIO_BUS, addr, size, &buf); |
901 | srcu_read_unlock(&vcpu->kvm->srcu, srcu_idx); | ||
896 | if (ret != 0) | 902 | if (ret != 0) |
897 | return H_TOO_HARD; | 903 | return H_TOO_HARD; |
898 | 904 | ||