[patch 09/38] iommu/vt-d: Use sched_clock() instead of get_cycles()

Thomas Gleixner
2026-04-10T12:19:15Z

Calculating the timeout from get_cycles() is a historical leftover without
any functional requirement.

Use ktime_get() instead.

Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Cc: x86@kernel.org
Cc: Lu Baolu <baolu.lu@linux.intel.com>
Cc: iommu@lists.linux.dev
---
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(); \
} \