From patchwork Mon Dec 6 08:44:59 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sheng Yang X-Patchwork-Id: 377372 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oB68gWqJ002969 for ; Mon, 6 Dec 2010 08:42:32 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751933Ab0LFIm3 (ORCPT ); Mon, 6 Dec 2010 03:42:29 -0500 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 Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga102.fm.intel.com with ESMTP; 06 Dec 2010 00:42:28 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.59,305,1288594800"; d="scan'208";a="864891302" Received: from syang10-desktop.sh.intel.com (HELO syang10-desktop) ([10.239.13.1]) by fmsmga001.fm.intel.com with ESMTP; 06 Dec 2010 00:42:27 -0800 Received: from yasker by syang10-desktop with local (Exim 4.72) (envelope-from ) id 1PPWgt-0007av-Oo; Mon, 06 Dec 2010 16:44:59 +0800 From: Sheng Yang To: Avi Kivity , Marcelo Tosatti Cc: kvm@vger.kernel.org, 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> X-Mailer: git-send-email 1.7.1 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Mon, 06 Dec 2010 08:42:32 +0000 (UTC) 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. */