mirror of https://github.com/xemu-project/xemu.git
intel_iommu: fix missing BQL in pt fast path
In vtd_switch_address_space() we did the memory region switch, however it's possible that the caller of it has not taken the BQL at all. Make sure we have it. CC: Paolo Bonzini <pbonzini@redhat.com> CC: Jason Wang <jasowang@redhat.com> CC: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Peter Xu <peterx@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
c1800a1627
commit
66a4a0318e
|
@ -957,6 +957,8 @@ static bool vtd_dev_pt_enabled(VTDAddressSpace *as)
|
||||||
static bool vtd_switch_address_space(VTDAddressSpace *as)
|
static bool vtd_switch_address_space(VTDAddressSpace *as)
|
||||||
{
|
{
|
||||||
bool use_iommu;
|
bool use_iommu;
|
||||||
|
/* Whether we need to take the BQL on our own */
|
||||||
|
bool take_bql = !qemu_mutex_iothread_locked();
|
||||||
|
|
||||||
assert(as);
|
assert(as);
|
||||||
|
|
||||||
|
@ -967,6 +969,15 @@ static bool vtd_switch_address_space(VTDAddressSpace *as)
|
||||||
VTD_PCI_FUNC(as->devfn),
|
VTD_PCI_FUNC(as->devfn),
|
||||||
use_iommu);
|
use_iommu);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* It's possible that we reach here without BQL, e.g., when called
|
||||||
|
* from vtd_pt_enable_fast_path(). However the memory APIs need
|
||||||
|
* it. We'd better make sure we have had it already, or, take it.
|
||||||
|
*/
|
||||||
|
if (take_bql) {
|
||||||
|
qemu_mutex_lock_iothread();
|
||||||
|
}
|
||||||
|
|
||||||
/* Turn off first then on the other */
|
/* Turn off first then on the other */
|
||||||
if (use_iommu) {
|
if (use_iommu) {
|
||||||
memory_region_set_enabled(&as->sys_alias, false);
|
memory_region_set_enabled(&as->sys_alias, false);
|
||||||
|
@ -976,6 +987,10 @@ static bool vtd_switch_address_space(VTDAddressSpace *as)
|
||||||
memory_region_set_enabled(&as->sys_alias, true);
|
memory_region_set_enabled(&as->sys_alias, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (take_bql) {
|
||||||
|
qemu_mutex_unlock_iothread();
|
||||||
|
}
|
||||||
|
|
||||||
return use_iommu;
|
return use_iommu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue