diff options
Diffstat (limited to 'kernel/irq/internals.h')
-rw-r--r-- | kernel/irq/internals.h | 21 |
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 | ||
357 | static __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 |
381 | static inline void irq_remove_timings(struct irq_desc *desc) {} | 384 | static inline void irq_remove_timings(struct irq_desc *desc) {} |