From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sheng Yang Subject: [PATCH] KVM: Add reading critical region for kvm_io_bus_read/write Date: Mon, 6 Dec 2010 16:44:59 +0800 Message-ID: <1291625099-29152-1-git-send-email-sheng@linux.intel.com> Cc: kvm@vger.kernel.org, Sheng Yang To: Avi Kivity , Marcelo Tosatti Return-path: Received: from mga11.intel.com ([192.55.52.93]:46451 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751853Ab0LFIm3 (ORCPT ); Mon, 6 Dec 2010 03:42:29 -0500 Sender: kvm-owner@vger.kernel.org List-ID: Seems we missed it. Signed-off-by: Sheng Yang --- Do we need this, or slot_lock covered this? virt/kvm/kvm_main.c | 24 ++++++++++++++++-------- 1 files changed, 16 insertions(+), 8 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index c4ee364..3e71b91 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2228,28 +2228,36 @@ static void kvm_io_bus_destroy(struct kvm_io_bus *bus) int kvm_io_bus_write(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, const void *val) { - int i; + int i, idx, r = -EOPNOTSUPP; struct kvm_io_bus *bus; + idx = srcu_read_lock(&kvm->srcu); bus = srcu_dereference(kvm->buses[bus_idx], &kvm->srcu); for (i = 0; i < bus->dev_count; i++) - if (!kvm_iodevice_write(bus->devs[i], addr, len, val)) - return 0; - return -EOPNOTSUPP; + if (!kvm_iodevice_write(bus->devs[i], addr, len, val)) { + r = 0; + break; + } + srcu_read_unlock(&kvm->srcu, idx); + return r; } /* kvm_io_bus_read - called under kvm->slots_lock */ int kvm_io_bus_read(struct kvm *kvm, enum kvm_bus bus_idx, gpa_t addr, int len, void *val) { - int i; + int i, idx, r = -EOPNOTSUPP; struct kvm_io_bus *bus; + idx = srcu_read_lock(&kvm->srcu); bus = srcu_dereference(kvm->buses[bus_idx], &kvm->srcu); for (i = 0; i < bus->dev_count; i++) - if (!kvm_iodevice_read(bus->devs[i], addr, len, val)) - return 0; - return -EOPNOTSUPP; + if (!kvm_iodevice_read(bus->devs[i], addr, len, val)) { + r = 0; + break; + } + srcu_read_unlock(&kvm->srcu, idx); + return r; } /* Caller must hold slots_lock. */ -- 1.7.0.1