genirq/timings: Encapsulate storing function
For the next patches providing the selftest, it is required to insert interval values directly in the buffer in order to check the correctness of the code. Encapsulate the code doing that in a always inline function in order to reuse it in the test code. No functional changes. Signed-off-by: Daniel Lezcano <daniel.lezcano@linaro.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: andriy.shevchenko@linux.intel.com Link: https://lkml.kernel.org/r/20190527205521.12091-6-daniel.lezcano@linaro.org
This commit is contained in:
parent
df025e47e4
commit
23aa3b9a6b
|
@ -430,11 +430,43 @@ static u64 __irq_timings_next_event(struct irqt_stat *irqs, int irq, u64 now)
|
||||||
return irqs->last_ts + irqs->ema_time[index];
|
return irqs->last_ts + irqs->ema_time[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static __always_inline int irq_timings_interval_index(u64 interval)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* The PREDICTION_FACTOR increase the interval size for the
|
||||||
|
* array of exponential average.
|
||||||
|
*/
|
||||||
|
u64 interval_us = (interval >> 10) / PREDICTION_FACTOR;
|
||||||
|
|
||||||
|
return likely(interval_us) ? ilog2(interval_us) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __always_inline void __irq_timings_store(int irq, struct irqt_stat *irqs,
|
||||||
|
u64 interval)
|
||||||
|
{
|
||||||
|
int index;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get the index in the ema table for this interrupt.
|
||||||
|
*/
|
||||||
|
index = irq_timings_interval_index(interval);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Store the index as an element of the pattern in another
|
||||||
|
* circular array.
|
||||||
|
*/
|
||||||
|
irqs->circ_timings[irqs->count & IRQ_TIMINGS_MASK] = index;
|
||||||
|
|
||||||
|
irqs->ema_time[index] = irq_timings_ema_new(interval,
|
||||||
|
irqs->ema_time[index]);
|
||||||
|
|
||||||
|
irqs->count++;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void irq_timings_store(int irq, struct irqt_stat *irqs, u64 ts)
|
static inline void irq_timings_store(int irq, struct irqt_stat *irqs, u64 ts)
|
||||||
{
|
{
|
||||||
u64 old_ts = irqs->last_ts;
|
u64 old_ts = irqs->last_ts;
|
||||||
u64 interval;
|
u64 interval;
|
||||||
int index;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The timestamps are absolute time values, we need to compute
|
* The timestamps are absolute time values, we need to compute
|
||||||
|
@ -465,24 +497,7 @@ static inline void irq_timings_store(int irq, struct irqt_stat *irqs, u64 ts)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
__irq_timings_store(irq, irqs, interval);
|
||||||
* Get the index in the ema table for this interrupt. The
|
|
||||||
* PREDICTION_FACTOR increase the interval size for the array
|
|
||||||
* of exponential average.
|
|
||||||
*/
|
|
||||||
index = likely(interval) ?
|
|
||||||
ilog2((interval >> 10) / PREDICTION_FACTOR) : 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Store the index as an element of the pattern in another
|
|
||||||
* circular array.
|
|
||||||
*/
|
|
||||||
irqs->circ_timings[irqs->count & IRQ_TIMINGS_MASK] = index;
|
|
||||||
|
|
||||||
irqs->ema_time[index] = irq_timings_ema_new(interval,
|
|
||||||
irqs->ema_time[index]);
|
|
||||||
|
|
||||||
irqs->count++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue