[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging-4.13] VT-d: restore flush hooks when disabling qinval
commit 21e1ae3d2c80e606fc81be7a576c4a047c9dc879 Author: Jan Beulich <jbeulich@xxxxxxxx> AuthorDate: Tue Apr 20 12:13:53 2021 +0200 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Tue Apr 20 12:13:53 2021 +0200 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@xxxxxxxx> Reviewed-by: Kevin Tian <kevin.tian@xxxxxxxxx> master commit: 9c39dba2b179c0f4c42c98e97ea0878119718530 master date: 2021-03-30 14:40:24 +0200 --- xen/drivers/passthrough/vtd/extern.h | 10 ++++++++++ xen/drivers/passthrough/vtd/iommu.c | 19 ++++++++----------- xen/drivers/passthrough/vtd/qinval.c | 3 +++ 3 files changed, 21 insertions(+), 11 deletions(-) diff --git a/xen/drivers/passthrough/vtd/extern.h b/xen/drivers/passthrough/vtd/extern.h index f776feefe6..1cac22a02f 100644 --- a/xen/drivers/passthrough/vtd/extern.h +++ b/xen/drivers/passthrough/vtd/extern.h @@ -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); diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 1e4f800a1a..01a2a461ba 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -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; } } diff --git a/xen/drivers/passthrough/vtd/qinval.c b/xen/drivers/passthrough/vtd/qinval.c index 39b7abd009..764ef9f0fc 100644 --- a/xen/drivers/passthrough/vtd/qinval.c +++ b/xen/drivers/passthrough/vtd/qinval.c @@ -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; } -- generated by git-patchbot for /home/xen/git/xen.git#staging-4.13
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |