Calculating the timeout from get_cycles() is a historical leftover without any functional requirement.
Use ktime_get() instead. Signed-off-by: Thomas Gleixner <[email protected]> Cc: [email protected] Cc: Lu Baolu <[email protected]> Cc: [email protected] --- arch/x86/include/asm/iommu.h | 3 --- drivers/iommu/intel/dmar.c | 4 ++-- drivers/iommu/intel/iommu.h | 8 ++++++-- 3 files changed, 8 insertions(+), 7 deletions(-) --- a/arch/x86/include/asm/iommu.h +++ b/arch/x86/include/asm/iommu.h @@ -18,9 +18,6 @@ extern bool x86_swiotlb_enable; #define x86_swiotlb_enable false #endif -/* 10 seconds */ -#define DMAR_OPERATION_TIMEOUT ((cycles_t) tsc_khz*10*1000) - static inline int __init arch_rmrr_sanity_check(struct acpi_dmar_reserved_memory *rmrr) { --- a/drivers/iommu/intel/dmar.c +++ b/drivers/iommu/intel/dmar.c @@ -1606,9 +1606,9 @@ void qi_flush_pasid_cache(struct intel_i */ void dmar_disable_qi(struct intel_iommu *iommu) { + ktime_t start_time = ktime_get(); unsigned long flags; u32 sts; - cycles_t start_time = get_cycles(); if (!ecap_qis(iommu->ecap)) return; @@ -1624,7 +1624,7 @@ void dmar_disable_qi(struct intel_iommu */ while ((readl(iommu->reg + DMAR_IQT_REG) != readl(iommu->reg + DMAR_IQH_REG)) && - (DMAR_OPERATION_TIMEOUT > (get_cycles() - start_time))) + (DMAR_OPERATION_TIMEOUT > (ktime_get() - start_time))) cpu_relax(); iommu->gcmd &= ~DMA_GCMD_QIE; --- a/drivers/iommu/intel/iommu.h +++ b/drivers/iommu/intel/iommu.h @@ -23,6 +23,7 @@ #include <linux/xarray.h> #include <linux/perf_event.h> #include <linux/pci.h> +#include <linux/timekeeping.h> #include <linux/generic_pt/iommu.h> #include <asm/iommu.h> @@ -360,14 +361,17 @@ /* PERFINTRSTS_REG */ #define DMA_PERFINTRSTS_PIS ((u32)1) +#define DMAR_OPERATION_TIMEOUT (((ktime_t)10) * NSEC_PER_SEC) + #define IOMMU_WAIT_OP(iommu, offset, op, cond, sts) \ do { \ - cycles_t start_time = get_cycles(); \ + ktime_t start_time = ktime_get(); \ + \ while (1) { \ sts = op(iommu->reg + offset); \ if (cond) \ break; \ - if (DMAR_OPERATION_TIMEOUT < (get_cycles() - start_time))\ + if (DMAR_OPERATION_TIMEOUT < (ktime_get() - start_time))\ panic("DMAR hardware is malfunctioning\n"); \ cpu_relax(); \ } \

