summaryrefslogtreecommitdiffstats
path: root/kernel/irq/internals.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/irq/internals.h')
-rw-r--r--kernel/irq/internals.h21
1 files changed, 12 insertions, 9 deletions
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h
index 70c3053bc1f6..21f9927ff5ad 100644
--- a/kernel/irq/internals.h
+++ b/kernel/irq/internals.h
@@ -354,6 +354,16 @@ static inline int irq_timing_decode(u64 value, u64 *timestamp)
354 return value & U16_MAX; 354 return value & U16_MAX;
355} 355}
356 356
357static __always_inline void irq_timings_push(u64 ts, int irq)
358{
359 struct irq_timings *timings = this_cpu_ptr(&irq_timings);
360
361 timings->values[timings->count & IRQ_TIMINGS_MASK] =
362 irq_timing_encode(ts, irq);
363
364 timings->count++;
365}
366
357/* 367/*
358 * The function record_irq_time is only called in one place in the 368 * The function record_irq_time is only called in one place in the
359 * interrupts handler. We want this function always inline so the code 369 * interrupts handler. We want this function always inline so the code
@@ -367,15 +377,8 @@ static __always_inline void record_irq_time(struct irq_desc *desc)
367 if (!static_branch_likely(&irq_timing_enabled)) 377 if (!static_branch_likely(&irq_timing_enabled))
368 return; 378 return;
369 379
370 if (desc->istate & IRQS_TIMINGS) { 380 if (desc->istate & IRQS_TIMINGS)
371 struct irq_timings *timings = this_cpu_ptr(&irq_timings); 381 irq_timings_push(local_clock(), irq_desc_get_irq(desc));
372
373 timings->values[timings->count & IRQ_TIMINGS_MASK] =
374 irq_timing_encode(local_clock(),
375 irq_desc_get_irq(desc));
376
377 timings->count++;
378 }
379} 382}
380#else 383#else
381static inline void irq_remove_timings(struct irq_desc *desc) {} 384static inline void irq_remove_timings(struct irq_desc *desc) {}