mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
VT-d: restore flush hooks when disabling qinval
Leaving the hooks untouched is at best a latent risk: There may well be
cases where some flush is needed, which then needs carrying out the
"register" way.
Switch from u<N> to uint<N>_t while needing to touch the function
headers anyway.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
master commit: 9c39dba2b1
master date: 2021-03-30 14:40:24 +0200
This commit is contained in:
1 parent
4352a49dcc
commit
21e1ae3d2c
3 files changed
+21
-11
No files matched your search
@@ -50,6 +50,16 @@ int iommu_flush_iec_global(struct vtd_iommu *iommu);
|
||||
int iommu_flush_iec_index(struct vtd_iommu *iommu, u8 im, u16 iidx);
|
||||
void clear_fault_bits(struct vtd_iommu *iommu);
|
||||
|
||||
int __must_check vtd_flush_context_reg(struct vtd_iommu *iommu, uint16_t did,
|
||||
uint16_t source_id,
|
||||
uint8_t function_mask, uint64_t type,
|
||||
bool flush_non_present_entry);
|
||||
int __must_check vtd_flush_iotlb_reg(struct vtd_iommu *iommu, uint16_t did,
|
||||
uint64_t addr, unsigned int size_order,
|
||||
uint64_t type,
|
||||
bool flush_non_present_entry,
|
||||
bool flush_dev_iotlb);
|
||||
|
||||
struct vtd_iommu *ioapic_to_iommu(unsigned int apic_id);
|
||||
struct vtd_iommu *hpet_to_iommu(unsigned int hpet_id);
|
||||
struct acpi_drhd_unit *ioapic_to_drhd(unsigned int apic_id);
|
||||
|
||||
@@ -327,10 +327,9 @@ static void iommu_flush_write_buffer(struct vtd_iommu *iommu)
|
||||
}
|
||||
|
||||
/* return value determine if we need a write buffer flush */
|
||||
static int __must_check flush_context_reg(struct vtd_iommu *iommu, u16 did,
|
||||
u16 source_id, u8 function_mask,
|
||||
u64 type,
|
||||
bool flush_non_present_entry)
|
||||
int vtd_flush_context_reg(struct vtd_iommu *iommu, uint16_t did,
|
||||
uint16_t source_id, uint8_t function_mask,
|
||||
uint64_t type, bool flush_non_present_entry)
|
||||
{
|
||||
u64 val = 0;
|
||||
unsigned long flags;
|
||||
@@ -396,11 +395,9 @@ static int __must_check iommu_flush_context_device(struct vtd_iommu *iommu,
|
||||
}
|
||||
|
||||
/* return value determine if we need a write buffer flush */
|
||||
static int __must_check flush_iotlb_reg(struct vtd_iommu *iommu, u16 did,
|
||||
u64 addr,
|
||||
unsigned int size_order, u64 type,
|
||||
bool flush_non_present_entry,
|
||||
bool flush_dev_iotlb)
|
||||
int vtd_flush_iotlb_reg(struct vtd_iommu *iommu, uint16_t did, uint64_t addr,
|
||||
unsigned int size_order, uint64_t type,
|
||||
bool flush_non_present_entry, bool flush_dev_iotlb)
|
||||
{
|
||||
int tlb_offset = ecap_iotlb_offset(iommu->ecap);
|
||||
u64 val = 0;
|
||||
@@ -2161,8 +2158,8 @@ static int __must_check init_vtd_hw(bool resume)
|
||||
*/
|
||||
if ( enable_qinval(iommu) != 0 )
|
||||
{
|
||||
iommu->flush.context = flush_context_reg;
|
||||
iommu->flush.iotlb = flush_iotlb_reg;
|
||||
iommu->flush.context = vtd_flush_context_reg;
|
||||
iommu->flush.iotlb = vtd_flush_iotlb_reg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -462,4 +462,7 @@ void disable_qinval(struct vtd_iommu *iommu)
|
||||
!(sts & DMA_GSTS_QIES), sts);
|
||||
out:
|
||||
spin_unlock_irqrestore(&iommu->register_lock, flags);
|
||||
|
||||
iommu->flush.context = vtd_flush_context_reg;
|
||||
iommu->flush.iotlb = vtd_flush_iotlb_reg;
|
||||
}
|
||||