|
|
9bac43 |
From f2fb460ba2b9c5547f8bcf4d7542a5e17bbe09bd Mon Sep 17 00:00:00 2001
|
|
|
9bac43 |
From: Peter Xu <peterx@redhat.com>
|
|
|
9bac43 |
Date: Mon, 9 Oct 2017 06:51:32 +0200
|
|
|
9bac43 |
Subject: [PATCH 05/69] intel_iommu: fix missing BQL in pt fast path
|
|
|
9bac43 |
|
|
|
9bac43 |
RH-Author: Peter Xu <peterx@redhat.com>
|
|
|
9bac43 |
Message-id: <20171009065132.5597-2-peterx@redhat.com>
|
|
|
9bac43 |
Patchwork-id: 76929
|
|
|
9bac43 |
O-Subject: [RHEV-7.5 qemu-kvm-rhev PATCH 1/1] intel_iommu: fix missing BQL in pt fast path
|
|
|
9bac43 |
Bugzilla: 1449067
|
|
|
9bac43 |
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
9bac43 |
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
9bac43 |
RH-Acked-by: Thomas Huth <thuth@redhat.com>
|
|
|
9bac43 |
|
|
|
9bac43 |
In vtd_switch_address_space() we did the memory region switch, however
|
|
|
9bac43 |
it's possible that the caller of it has not taken the BQL at all. Make
|
|
|
9bac43 |
sure we have it.
|
|
|
9bac43 |
|
|
|
9bac43 |
CC: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
9bac43 |
CC: Jason Wang <jasowang@redhat.com>
|
|
|
9bac43 |
CC: Michael S. Tsirkin <mst@redhat.com>
|
|
|
9bac43 |
Signed-off-by: Peter Xu <peterx@redhat.com>
|
|
|
9bac43 |
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
9bac43 |
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
|
9bac43 |
(cherry picked from commit 66a4a0318e6b9539505491e4576fb93a708095d8)
|
|
|
9bac43 |
Signed-off-by: Peter Xu <peterx@redhat.com>
|
|
|
9bac43 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
9bac43 |
---
|
|
|
9bac43 |
hw/i386/intel_iommu.c | 15 +++++++++++++++
|
|
|
9bac43 |
1 file changed, 15 insertions(+)
|
|
|
9bac43 |
|
|
|
9bac43 |
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
|
|
|
9bac43 |
index a7bf87a..3a5bb0b 100644
|
|
|
9bac43 |
--- a/hw/i386/intel_iommu.c
|
|
|
9bac43 |
+++ b/hw/i386/intel_iommu.c
|
|
|
9bac43 |
@@ -957,6 +957,8 @@ static bool vtd_dev_pt_enabled(VTDAddressSpace *as)
|
|
|
9bac43 |
static bool vtd_switch_address_space(VTDAddressSpace *as)
|
|
|
9bac43 |
{
|
|
|
9bac43 |
bool use_iommu;
|
|
|
9bac43 |
+ /* Whether we need to take the BQL on our own */
|
|
|
9bac43 |
+ bool take_bql = !qemu_mutex_iothread_locked();
|
|
|
9bac43 |
|
|
|
9bac43 |
assert(as);
|
|
|
9bac43 |
|
|
|
9bac43 |
@@ -967,6 +969,15 @@ static bool vtd_switch_address_space(VTDAddressSpace *as)
|
|
|
9bac43 |
VTD_PCI_FUNC(as->devfn),
|
|
|
9bac43 |
use_iommu);
|
|
|
9bac43 |
|
|
|
9bac43 |
+ /*
|
|
|
9bac43 |
+ * It's possible that we reach here without BQL, e.g., when called
|
|
|
9bac43 |
+ * from vtd_pt_enable_fast_path(). However the memory APIs need
|
|
|
9bac43 |
+ * it. We'd better make sure we have had it already, or, take it.
|
|
|
9bac43 |
+ */
|
|
|
9bac43 |
+ if (take_bql) {
|
|
|
9bac43 |
+ qemu_mutex_lock_iothread();
|
|
|
9bac43 |
+ }
|
|
|
9bac43 |
+
|
|
|
9bac43 |
/* Turn off first then on the other */
|
|
|
9bac43 |
if (use_iommu) {
|
|
|
9bac43 |
memory_region_set_enabled(&as->sys_alias, false);
|
|
|
9bac43 |
@@ -976,6 +987,10 @@ static bool vtd_switch_address_space(VTDAddressSpace *as)
|
|
|
9bac43 |
memory_region_set_enabled(&as->sys_alias, true);
|
|
|
9bac43 |
}
|
|
|
9bac43 |
|
|
|
9bac43 |
+ if (take_bql) {
|
|
|
9bac43 |
+ qemu_mutex_unlock_iothread();
|
|
|
9bac43 |
+ }
|
|
|
9bac43 |
+
|
|
|
9bac43 |
return use_iommu;
|
|
|
9bac43 |
}
|
|
|
9bac43 |
|
|
|
9bac43 |
--
|
|
|
9bac43 |
1.8.3.1
|
|
|
9bac43 |
|