kvm/ppc: Hold srcu lock when calling kvm_io_bus_read/write
These functions do an srcu_dereference without acquiring the srcu lock themselves. Signed-off-by: Scott Wood <scottwood@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
1d6f6b7339
commit
ed840ee9c8
|
@ -622,6 +622,8 @@ static void kvmppc_complete_mmio_load(struct kvm_vcpu *vcpu,
|
||||||
int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
||||||
unsigned int rt, unsigned int bytes, int is_bigendian)
|
unsigned int rt, unsigned int bytes, int is_bigendian)
|
||||||
{
|
{
|
||||||
|
int idx, ret;
|
||||||
|
|
||||||
if (bytes > sizeof(run->mmio.data)) {
|
if (bytes > sizeof(run->mmio.data)) {
|
||||||
printk(KERN_ERR "%s: bad MMIO length: %d\n", __func__,
|
printk(KERN_ERR "%s: bad MMIO length: %d\n", __func__,
|
||||||
run->mmio.len);
|
run->mmio.len);
|
||||||
|
@ -637,8 +639,14 @@ int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
||||||
vcpu->mmio_is_write = 0;
|
vcpu->mmio_is_write = 0;
|
||||||
vcpu->arch.mmio_sign_extend = 0;
|
vcpu->arch.mmio_sign_extend = 0;
|
||||||
|
|
||||||
if (!kvm_io_bus_read(vcpu->kvm, KVM_MMIO_BUS, run->mmio.phys_addr,
|
idx = srcu_read_lock(&vcpu->kvm->srcu);
|
||||||
bytes, &run->mmio.data)) {
|
|
||||||
|
ret = kvm_io_bus_read(vcpu->kvm, KVM_MMIO_BUS, run->mmio.phys_addr,
|
||||||
|
bytes, &run->mmio.data);
|
||||||
|
|
||||||
|
srcu_read_unlock(&vcpu->kvm->srcu, idx);
|
||||||
|
|
||||||
|
if (!ret) {
|
||||||
kvmppc_complete_mmio_load(vcpu, run);
|
kvmppc_complete_mmio_load(vcpu, run);
|
||||||
vcpu->mmio_needed = 0;
|
vcpu->mmio_needed = 0;
|
||||||
return EMULATE_DONE;
|
return EMULATE_DONE;
|
||||||
|
@ -663,6 +671,7 @@ int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
||||||
u64 val, unsigned int bytes, int is_bigendian)
|
u64 val, unsigned int bytes, int is_bigendian)
|
||||||
{
|
{
|
||||||
void *data = run->mmio.data;
|
void *data = run->mmio.data;
|
||||||
|
int idx, ret;
|
||||||
|
|
||||||
if (bytes > sizeof(run->mmio.data)) {
|
if (bytes > sizeof(run->mmio.data)) {
|
||||||
printk(KERN_ERR "%s: bad MMIO length: %d\n", __func__,
|
printk(KERN_ERR "%s: bad MMIO length: %d\n", __func__,
|
||||||
|
@ -692,8 +701,14 @@ int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, run->mmio.phys_addr,
|
idx = srcu_read_lock(&vcpu->kvm->srcu);
|
||||||
bytes, &run->mmio.data)) {
|
|
||||||
|
ret = kvm_io_bus_write(vcpu->kvm, KVM_MMIO_BUS, run->mmio.phys_addr,
|
||||||
|
bytes, &run->mmio.data);
|
||||||
|
|
||||||
|
srcu_read_unlock(&vcpu->kvm->srcu, idx);
|
||||||
|
|
||||||
|
if (!ret) {
|
||||||
vcpu->mmio_needed = 0;
|
vcpu->mmio_needed = 0;
|
||||||
return EMULATE_DONE;
|
return EMULATE_DONE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue