linux/kernel/irq/timings.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2// Copyright (C) 2016, Linaro Ltd - Daniel Lezcano <daniel.lezcano@linaro.org>
   3#define pr_fmt(fmt) "irq_timings: " fmt
   4
   5#include <linux/kernel.h>
   6#include <linux/percpu.h>
   7#include <linux/slab.h>
   8#include <linux/static_key.h>
   9#include <linux/init.h>
  10#include <linux/interrupt.h>
  11#include <linux/idr.h>
  12#include <linux/irq.h>
  13#include <linux/math64.h>
  14#include <linux/log2.h>
  15
  16#include <trace/events/irq.h>
  17
  18#include "internals.h"
  19
  20DEFINE_STATIC_KEY_FALSE(irq_timing_enabled);
  21
  22DEFINE_PER_CPU(struct irq_timings, irq_timings);
  23
  24static DEFINE_IDR(irqt_stats);
  25
  26void irq_timings_enable(void)
  27{
  28        static_branch_enable(&irq_timing_enabled);
  29}
  30
  31void irq_timings_disable(void)
  32{
  33        static_branch_disable(&irq_timing_enabled);
  34}
  35
  36/*
  37 * The main goal of this algorithm is to predict the next interrupt
  38 * occurrence on the current CPU.
  39 *
  40 * Currently, the interrupt timings are stored in a circular array
  41 * buffer every time there is an interrupt, as a tuple: the interrupt
  42 * number and the associated timestamp when the event occurred <irq,
  43 * timestamp>.
  44 *
  45 * For every interrupt occurring in a short period of time, we can
  46 * measure the elapsed time between the occurrences for the same
  47 * interrupt and we end up with a suite of intervals. The experience
  48 * showed the interrupts are often coming following a periodic
  49 * pattern.
  50 *
  51 * The objective of the algorithm is to find out this periodic pattern
  52 * in a fastest way and use its period to predict the next irq event.
  53 *
  54 * When the next interrupt event is requested, we are in the situation
  55 * where the interrupts are disabled and the circular buffer
  56 * containing the timings is filled with the events which happened
  57 * after the previous next-interrupt-event request.
  58 *
  59 * At this point, we read the circular buffer and we fill the irq
  60 * related statistics structure. After this step, the circular array
  61 * containing the timings is empty because all the values are
  62 * dispatched in their corresponding buffers.
  63 *
  64 * Now for each interrupt, we can predict the next event by using the
  65 * suffix array, log interval and exponential moving average
  66 *
  67 * 1. Suffix array
  68 *
  69 * Suffix array is an array of all the suffixes of a string. It is
  70 * widely used as a data structure for compression, text search, ...
  71 * For instance for the word 'banana', the suffixes will be: 'banana'
  72 * 'anana' 'nana' 'ana' 'na' 'a'
  73 *
  74 * Usually, the suffix array is sorted but for our purpose it is
  75 * not necessary and won't provide any improvement in the context of
  76 * the solved problem where we clearly define the boundaries of the
  77 * search by a max period and min period.
  78 *
  79 * The suffix array will build a suite of intervals of different
  80 * length and will look for the repetition of each suite. If the suite
  81 * is repeating then we have the period because it is the length of
  82 * the suite whatever its position in the buffer.
  83 *
  84 * 2. Log interval
  85 *
  86 * We saw the irq timings allow to compute the interval of the
  87 * occurrences for a specific interrupt. We can reasonably assume the
  88 * longer is the interval, the higher is the error for the next event
  89 * and we can consider storing those interval values into an array
  90 * where each slot in the array correspond to an interval at the power
  91 * of 2 of the index. For example, index 12 will contain values
  92 * between 2^11 and 2^12.
  93 *
  94 * At the end we have an array of values where at each index defines a
  95 * [2^index - 1, 2 ^ index] interval values allowing to store a large
  96 * number of values inside a small array.
  97 *
  98 * For example, if we have the value 1123, then we store it at
  99 * ilog2(1123) = 10 index value.
 100 *
 101 * Storing those value at the specific index is done by computing an
 102 * exponential moving average for this specific slot. For instance,
 103 * for values 1800, 1123, 1453, ... fall under the same slot (10) and
 104 * the exponential moving average is computed every time a new value
 105 * is stored at this slot.
 106 *
 107 * 3. Exponential Moving Average
 108 *
 109 * The EMA is largely used to track a signal for stocks or as a low
 110 * pass filter. The magic of the formula, is it is very simple and the
 111 * reactivity of the average can be tuned with the factors called
 112 * alpha.
 113 *
 114 * The higher the alphas are, the faster the average respond to the
 115 * signal change. In our case, if a slot in the array is a big
 116 * interval, we can have numbers with a big difference between
 117 * them. The impact of those differences in the average computation
 118 * can be tuned by changing the alpha value.
 119 *
 120 *
 121 *  -- The algorithm --
 122 *
 123 * We saw the different processing above, now let's see how they are
 124 * used together.
 125 *
 126 * For each interrupt:
 127 *      For each interval:
 128 *              Compute the index = ilog2(interval)
 129 *              Compute a new_ema(buffer[index], interval)
 130 *              Store the index in a circular buffer
 131 *
 132 *      Compute the suffix array of the indexes
 133 *
 134 *      For each suffix:
 135 *              If the suffix is reverse-found 3 times
 136 *                      Return suffix
 137 *
 138 *      Return Not found
 139 *
 140 * However we can not have endless suffix array to be build, it won't
 141 * make sense and it will add an extra overhead, so we can restrict
 142 * this to a maximum suffix length of 5 and a minimum suffix length of
 143 * 2. The experience showed 5 is the majority of the maximum pattern
 144 * period found for different devices.
 145 *
 146 * The result is a pattern finding less than 1us for an interrupt.
 147 *
 148 * Example based on real values:
 149 *
 150 * Example 1 : MMC write/read interrupt interval:
 151 *
 152 *      223947, 1240, 1384, 1386, 1386,
 153 *      217416, 1236, 1384, 1386, 1387,
 154 *      214719, 1241, 1386, 1387, 1384,
 155 *      213696, 1234, 1384, 1386, 1388,
 156 *      219904, 1240, 1385, 1389, 1385,
 157 *      212240, 1240, 1386, 1386, 1386,
 158 *      214415, 1236, 1384, 1386, 1387,
 159 *      214276, 1234, 1384, 1388, ?
 160 *
 161 * For each element, apply ilog2(value)
 162 *
 163 *      15, 8, 8, 8, 8,
 164 *      15, 8, 8, 8, 8,
 165 *      15, 8, 8, 8, 8,
 166 *      15, 8, 8, 8, 8,
 167 *      15, 8, 8, 8, 8,
 168 *      15, 8, 8, 8, 8,
 169 *      15, 8, 8, 8, 8,
 170 *      15, 8, 8, 8, ?
 171 *
 172 * Max period of 5, we take the last (max_period * 3) 15 elements as
 173 * we can be confident if the pattern repeats itself three times it is
 174 * a repeating pattern.
 175 *
 176 *                   8,
 177 *      15, 8, 8, 8, 8,
 178 *      15, 8, 8, 8, 8,
 179 *      15, 8, 8, 8, ?
 180 *
 181 * Suffixes are:
 182 *
 183 *  1) 8, 15, 8, 8, 8  <- max period
 184 *  2) 8, 15, 8, 8
 185 *  3) 8, 15, 8
 186 *  4) 8, 15           <- min period
 187 *
 188 * From there we search the repeating pattern for each suffix.
 189 *
 190 * buffer: 8, 15, 8, 8, 8, 8, 15, 8, 8, 8, 8, 15, 8, 8, 8
 191 *         |   |  |  |  |  |   |  |  |  |  |   |  |  |  |
 192 *         8, 15, 8, 8, 8  |   |  |  |  |  |   |  |  |  |
 193 *                         8, 15, 8, 8, 8  |   |  |  |  |
 194 *                                         8, 15, 8, 8, 8
 195 *
 196 * When moving the suffix, we found exactly 3 matches.
 197 *
 198 * The first suffix with period 5 is repeating.
 199 *
 200 * The next event is (3 * max_period) % suffix_period
 201 *
 202 * In this example, the result 0, so the next event is suffix[0] => 8
 203 *
 204 * However, 8 is the index in the array of exponential moving average
 205 * which was calculated on the fly when storing the values, so the
 206 * interval is ema[8] = 1366
 207 *
 208 *
 209 * Example 2:
 210 *
 211 *      4, 3, 5, 100,
 212 *      3, 3, 5, 117,
 213 *      4, 4, 5, 112,
 214 *      4, 3, 4, 110,
 215 *      3, 5, 3, 117,
 216 *      4, 4, 5, 112,
 217 *      4, 3, 4, 110,
 218 *      3, 4, 5, 112,
 219 *      4, 3, 4, 110
 220 *
 221 * ilog2
 222 *
 223 *      0, 0, 0, 4,
 224 *      0, 0, 0, 4,
 225 *      0, 0, 0, 4,
 226 *      0, 0, 0, 4,
 227 *      0, 0, 0, 4,
 228 *      0, 0, 0, 4,
 229 *      0, 0, 0, 4,
 230 *      0, 0, 0, 4,
 231 *      0, 0, 0, 4
 232 *
 233 * Max period 5:
 234 *         0, 0, 4,
 235 *      0, 0, 0, 4,
 236 *      0, 0, 0, 4,
 237 *      0, 0, 0, 4
 238 *
 239 * Suffixes:
 240 *
 241 *  1) 0, 0, 4, 0, 0
 242 *  2) 0, 0, 4, 0
 243 *  3) 0, 0, 4
 244 *  4) 0, 0
 245 *
 246 * buffer: 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4
 247 *         |  |  |  |  |  |  X
 248 *         0, 0, 4, 0, 0, |  X
 249 *                        0, 0
 250 *
 251 * buffer: 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 4
 252 *         |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
 253 *         0, 0, 4, 0, |  |  |  |  |  |  |  |  |  |  |
 254 *                     0, 0, 4, 0, |  |  |  |  |  |  |
 255 *                                 0, 0, 4, 0, |  |  |
 256 *                                             0  0  4
 257 *
 258 * Pattern is found 3 times, the remaining is 1 which results from
 259 * (max_period * 3) % suffix_period. This value is the index in the
 260 * suffix arrays. The suffix array for a period 4 has the value 4
 261 * at index 1.
 262 */
 263#define EMA_ALPHA_VAL           64
 264#define EMA_ALPHA_SHIFT         7
 265
 266#define PREDICTION_PERIOD_MIN   3
 267#define PREDICTION_PERIOD_MAX   5
 268#define PREDICTION_FACTOR       4
 269#define PREDICTION_MAX          10 /* 2 ^ PREDICTION_MAX useconds */
 270#define PREDICTION_BUFFER_SIZE  16 /* slots for EMAs, hardly more than 16 */
 271
 272/*
 273 * Number of elements in the circular buffer: If it happens it was
 274 * flushed before, then the number of elements could be smaller than
 275 * IRQ_TIMINGS_SIZE, so the count is used, otherwise the array size is
 276 * used as we wrapped. The index begins from zero when we did not
 277 * wrap. That could be done in a nicer way with the proper circular
 278 * array structure type but with the cost of extra computation in the
 279 * interrupt handler hot path. We choose efficiency.
 280 */
 281#define for_each_irqts(i, irqts)                                        \
 282        for (i = irqts->count < IRQ_TIMINGS_SIZE ?                      \
 283                     0 : irqts->count & IRQ_TIMINGS_MASK,               \
 284                     irqts->count = min(IRQ_TIMINGS_SIZE,               \
 285                                        irqts->count);                  \
 286             irqts->count > 0; irqts->count--,                          \
 287                     i = (i + 1) & IRQ_TIMINGS_MASK)
 288
 289struct irqt_stat {
 290        u64     last_ts;
 291        u64     ema_time[PREDICTION_BUFFER_SIZE];
 292        int     timings[IRQ_TIMINGS_SIZE];
 293        int     circ_timings[IRQ_TIMINGS_SIZE];
 294        int     count;
 295};
 296
 297/*
 298 * Exponential moving average computation
 299 */
 300static u64 irq_timings_ema_new(u64 value, u64 ema_old)
 301{
 302        s64 diff;
 303
 304        if (unlikely(!ema_old))
 305                return value;
 306
 307        diff = (value - ema_old) * EMA_ALPHA_VAL;
 308        /*
 309         * We can use a s64 type variable to be added with the u64
 310         * ema_old variable as this one will never have its topmost
 311         * bit set, it will be always smaller than 2^63 nanosec
 312         * interrupt interval (292 years).
 313         */
 314        return ema_old + (diff >> EMA_ALPHA_SHIFT);
 315}
 316
 317static int irq_timings_next_event_index(int *buffer, size_t len, int period_max)
 318{
 319        int period;
 320
 321        /*
 322         * Move the beginning pointer to the end minus the max period x 3.
 323         * We are at the point we can begin searching the pattern
 324         */
 325        buffer = &buffer[len - (period_max * 3)];
 326
 327        /* Adjust the length to the maximum allowed period x 3 */
 328        len = period_max * 3;
 329
 330        /*
 331         * The buffer contains the suite of intervals, in a ilog2
 332         * basis, we are looking for a repetition. We point the
 333         * beginning of the search three times the length of the
 334         * period beginning at the end of the buffer. We do that for
 335         * each suffix.
 336         */
 337        for (period = period_max; period >= PREDICTION_PERIOD_MIN; period--) {
 338
 339                /*
 340                 * The first comparison always succeed because the
 341                 * suffix is deduced from the first n-period bytes of
 342                 * the buffer and we compare the initial suffix with
 343                 * itself, so we can skip the first iteration.
 344                 */
 345                int idx = period;
 346                size_t size = period;
 347
 348                /*
 349                 * We look if the suite with period 'i' repeat
 350                 * itself. If it is truncated at the end, as it
 351                 * repeats we can use the period to find out the next
 352                 * element with the modulo.
 353                 */
 354                while (!memcmp(buffer, &buffer[idx], size * sizeof(int))) {
 355
 356                        /*
 357                         * Move the index in a period basis
 358                         */
 359                        idx += size;
 360
 361                        /*
 362                         * If this condition is reached, all previous
 363                         * memcmp were successful, so the period is
 364                         * found.
 365                         */
 366                        if (idx == len)
 367                                return buffer[len % period];
 368
 369                        /*
 370                         * If the remaining elements to compare are
 371                         * smaller than the period, readjust the size
 372                         * of the comparison for the last iteration.
 373                         */
 374                        if (len - idx < period)
 375                                size = len - idx;
 376                }
 377        }
 378
 379        return -1;
 380}
 381
 382static u64 __irq_timings_next_event(struct irqt_stat *irqs, int irq, u64 now)
 383{
 384        int index, i, period_max, count, start, min = INT_MAX;
 385
 386        if ((now - irqs->last_ts) >= NSEC_PER_SEC) {
 387                irqs->count = irqs->last_ts = 0;
 388                return U64_MAX;
 389        }
 390
 391        /*
 392         * As we want to find three times the repetition, we need a
 393         * number of intervals greater or equal to three times the
 394         * maximum period, otherwise we truncate the max period.
 395         */
 396        period_max = irqs->count > (3 * PREDICTION_PERIOD_MAX) ?
 397                PREDICTION_PERIOD_MAX : irqs->count / 3;
 398
 399        /*
 400         * If we don't have enough irq timings for this prediction,
 401         * just bail out.
 402         */
 403        if (period_max <= PREDICTION_PERIOD_MIN)
 404                return U64_MAX;
 405
 406        /*
 407         * 'count' will depends if the circular buffer wrapped or not
 408         */
 409        count = irqs->count < IRQ_TIMINGS_SIZE ?
 410                irqs->count : IRQ_TIMINGS_SIZE;
 411
 412        start = irqs->count < IRQ_TIMINGS_SIZE ?
 413                0 : (irqs->count & IRQ_TIMINGS_MASK);
 414
 415        /*
 416         * Copy the content of the circular buffer into another buffer
 417         * in order to linearize the buffer instead of dealing with
 418         * wrapping indexes and shifted array which will be prone to
 419         * error and extremely difficult to debug.
 420         */
 421        for (i = 0; i < count; i++) {
 422                int index = (start + i) & IRQ_TIMINGS_MASK;
 423
 424                irqs->timings[i] = irqs->circ_timings[index];
 425                min = min_t(int, irqs->timings[i], min);
 426        }
 427
 428        index = irq_timings_next_event_index(irqs->timings, count, period_max);
 429        if (index < 0)
 430                return irqs->last_ts + irqs->ema_time[min];
 431
 432        return irqs->last_ts + irqs->ema_time[index];
 433}
 434
 435static __always_inline int irq_timings_interval_index(u64 interval)
 436{
 437        /*
 438         * The PREDICTION_FACTOR increase the interval size for the
 439         * array of exponential average.
 440         */
 441        u64 interval_us = (interval >> 10) / PREDICTION_FACTOR;
 442
 443        return likely(interval_us) ? ilog2(interval_us) : 0;
 444}
 445
 446static __always_inline void __irq_timings_store(int irq, struct irqt_stat *irqs,
 447                                                u64 interval)
 448{
 449        int index;
 450
 451        /*
 452         * Get the index in the ema table for this interrupt.
 453         */
 454        index = irq_timings_interval_index(interval);
 455
 456        if (index > PREDICTION_BUFFER_SIZE - 1) {
 457                irqs->count = 0;
 458                return;
 459        }
 460
 461        /*
 462         * Store the index as an element of the pattern in another
 463         * circular array.
 464         */
 465        irqs->circ_timings[irqs->count & IRQ_TIMINGS_MASK] = index;
 466
 467        irqs->ema_time[index] = irq_timings_ema_new(interval,
 468                                                    irqs->ema_time[index]);
 469
 470        irqs->count++;
 471}
 472
 473static inline void irq_timings_store(int irq, struct irqt_stat *irqs, u64 ts)
 474{
 475        u64 old_ts = irqs->last_ts;
 476        u64 interval;
 477
 478        /*
 479         * The timestamps are absolute time values, we need to compute
 480         * the timing interval between two interrupts.
 481         */
 482        irqs->last_ts = ts;
 483
 484        /*
 485         * The interval type is u64 in order to deal with the same
 486         * type in our computation, that prevent mindfuck issues with
 487         * overflow, sign and division.
 488         */
 489        interval = ts - old_ts;
 490
 491        /*
 492         * The interrupt triggered more than one second apart, that
 493         * ends the sequence as predictable for our purpose. In this
 494         * case, assume we have the beginning of a sequence and the
 495         * timestamp is the first value. As it is impossible to
 496         * predict anything at this point, return.
 497         *
 498         * Note the first timestamp of the sequence will always fall
 499         * in this test because the old_ts is zero. That is what we
 500         * want as we need another timestamp to compute an interval.
 501         */
 502        if (interval >= NSEC_PER_SEC) {
 503                irqs->count = 0;
 504                return;
 505        }
 506
 507        __irq_timings_store(irq, irqs, interval);
 508}
 509
 510/**
 511 * irq_timings_next_event - Return when the next event is supposed to arrive
 512 *
 513 * During the last busy cycle, the number of interrupts is incremented
 514 * and stored in the irq_timings structure. This information is
 515 * necessary to:
 516 *
 517 * - know if the index in the table wrapped up:
 518 *
 519 *      If more than the array size interrupts happened during the
 520 *      last busy/idle cycle, the index wrapped up and we have to
 521 *      begin with the next element in the array which is the last one
 522 *      in the sequence, otherwise it is at the index 0.
 523 *
 524 * - have an indication of the interrupts activity on this CPU
 525 *   (eg. irq/sec)
 526 *
 527 * The values are 'consumed' after inserting in the statistical model,
 528 * thus the count is reinitialized.
 529 *
 530 * The array of values **must** be browsed in the time direction, the
 531 * timestamp must increase between an element and the next one.
 532 *
 533 * Returns a nanosec time based estimation of the earliest interrupt,
 534 * U64_MAX otherwise.
 535 */
 536u64 irq_timings_next_event(u64 now)
 537{
 538        struct irq_timings *irqts = this_cpu_ptr(&irq_timings);
 539        struct irqt_stat *irqs;
 540        struct irqt_stat __percpu *s;
 541        u64 ts, next_evt = U64_MAX;
 542        int i, irq = 0;
 543
 544        /*
 545         * This function must be called with the local irq disabled in
 546         * order to prevent the timings circular buffer to be updated
 547         * while we are reading it.
 548         */
 549        lockdep_assert_irqs_disabled();
 550
 551        if (!irqts->count)
 552                return next_evt;
 553
 554        /*
 555         * Number of elements in the circular buffer: If it happens it
 556         * was flushed before, then the number of elements could be
 557         * smaller than IRQ_TIMINGS_SIZE, so the count is used,
 558         * otherwise the array size is used as we wrapped. The index
 559         * begins from zero when we did not wrap. That could be done
 560         * in a nicer way with the proper circular array structure
 561         * type but with the cost of extra computation in the
 562         * interrupt handler hot path. We choose efficiency.
 563         *
 564         * Inject measured irq/timestamp to the pattern prediction
 565         * model while decrementing the counter because we consume the
 566         * data from our circular buffer.
 567         */
 568        for_each_irqts(i, irqts) {
 569                irq = irq_timing_decode(irqts->values[i], &ts);
 570                s = idr_find(&irqt_stats, irq);
 571                if (s)
 572                        irq_timings_store(irq, this_cpu_ptr(s), ts);
 573        }
 574
 575        /*
 576         * Look in the list of interrupts' statistics, the earliest
 577         * next event.
 578         */
 579        idr_for_each_entry(&irqt_stats, s, i) {
 580
 581                irqs = this_cpu_ptr(s);
 582
 583                ts = __irq_timings_next_event(irqs, i, now);
 584                if (ts <= now)
 585                        return now;
 586
 587                if (ts < next_evt)
 588                        next_evt = ts;
 589        }
 590
 591        return next_evt;
 592}
 593
 594void irq_timings_free(int irq)
 595{
 596        struct irqt_stat __percpu *s;
 597
 598        s = idr_find(&irqt_stats, irq);
 599        if (s) {
 600                free_percpu(s);
 601                idr_remove(&irqt_stats, irq);
 602        }
 603}
 604
 605int irq_timings_alloc(int irq)
 606{
 607        struct irqt_stat __percpu *s;
 608        int id;
 609
 610        /*
 611         * Some platforms can have the same private interrupt per cpu,
 612         * so this function may be called several times with the
 613         * same interrupt number. Just bail out in case the per cpu
 614         * stat structure is already allocated.
 615         */
 616        s = idr_find(&irqt_stats, irq);
 617        if (s)
 618                return 0;
 619
 620        s = alloc_percpu(*s);
 621        if (!s)
 622                return -ENOMEM;
 623
 624        idr_preload(GFP_KERNEL);
 625        id = idr_alloc(&irqt_stats, s, irq, irq + 1, GFP_NOWAIT);
 626        idr_preload_end();
 627
 628        if (id < 0) {
 629                free_percpu(s);
 630                return id;
 631        }
 632
 633        return 0;
 634}
 635
 636#ifdef CONFIG_TEST_IRQ_TIMINGS
 637struct timings_intervals {
 638        u64 *intervals;
 639        size_t count;
 640};
 641
 642/*
 643 * Intervals are given in nanosecond base
 644 */
 645static u64 intervals0[] __initdata = {
 646        10000, 50000, 200000, 500000,
 647        10000, 50000, 200000, 500000,
 648        10000, 50000, 200000, 500000,
 649        10000, 50000, 200000, 500000,
 650        10000, 50000, 200000, 500000,
 651        10000, 50000, 200000, 500000,
 652        10000, 50000, 200000, 500000,
 653        10000, 50000, 200000, 500000,
 654        10000, 50000, 200000,
 655};
 656
 657static u64 intervals1[] __initdata = {
 658        223947000, 1240000, 1384000, 1386000, 1386000,
 659        217416000, 1236000, 1384000, 1386000, 1387000,
 660        214719000, 1241000, 1386000, 1387000, 1384000,
 661        213696000, 1234000, 1384000, 1386000, 1388000,
 662        219904000, 1240000, 1385000, 1389000, 1385000,
 663        212240000, 1240000, 1386000, 1386000, 1386000,
 664        214415000, 1236000, 1384000, 1386000, 1387000,
 665        214276000, 1234000,
 666};
 667
 668static u64 intervals2[] __initdata = {
 669        4000, 3000, 5000, 100000,
 670        3000, 3000, 5000, 117000,
 671        4000, 4000, 5000, 112000,
 672        4000, 3000, 4000, 110000,
 673        3000, 5000, 3000, 117000,
 674        4000, 4000, 5000, 112000,
 675        4000, 3000, 4000, 110000,
 676        3000, 4000, 5000, 112000,
 677        4000,
 678};
 679
 680static u64 intervals3[] __initdata = {
 681        1385000, 212240000, 1240000,
 682        1386000, 214415000, 1236000,
 683        1384000, 214276000, 1234000,
 684        1386000, 214415000, 1236000,
 685        1385000, 212240000, 1240000,
 686        1386000, 214415000, 1236000,
 687        1384000, 214276000, 1234000,
 688        1386000, 214415000, 1236000,
 689        1385000, 212240000, 1240000,
 690};
 691
 692static u64 intervals4[] __initdata = {
 693        10000, 50000, 10000, 50000,
 694        10000, 50000, 10000, 50000,
 695        10000, 50000, 10000, 50000,
 696        10000, 50000, 10000, 50000,
 697        10000, 50000, 10000, 50000,
 698        10000, 50000, 10000, 50000,
 699        10000, 50000, 10000, 50000,
 700        10000, 50000, 10000, 50000,
 701        10000,
 702};
 703
 704static struct timings_intervals tis[] __initdata = {
 705        { intervals0, ARRAY_SIZE(intervals0) },
 706        { intervals1, ARRAY_SIZE(intervals1) },
 707        { intervals2, ARRAY_SIZE(intervals2) },
 708        { intervals3, ARRAY_SIZE(intervals3) },
 709        { intervals4, ARRAY_SIZE(intervals4) },
 710};
 711
 712static int __init irq_timings_test_next_index(struct timings_intervals *ti)
 713{
 714        int _buffer[IRQ_TIMINGS_SIZE];
 715        int buffer[IRQ_TIMINGS_SIZE];
 716        int index, start, i, count, period_max;
 717
 718        count = ti->count - 1;
 719
 720        period_max = count > (3 * PREDICTION_PERIOD_MAX) ?
 721                PREDICTION_PERIOD_MAX : count / 3;
 722
 723        /*
 724         * Inject all values except the last one which will be used
 725         * to compare with the next index result.
 726         */
 727        pr_debug("index suite: ");
 728
 729        for (i = 0; i < count; i++) {
 730                index = irq_timings_interval_index(ti->intervals[i]);
 731                _buffer[i & IRQ_TIMINGS_MASK] = index;
 732                pr_cont("%d ", index);
 733        }
 734
 735        start = count < IRQ_TIMINGS_SIZE ? 0 :
 736                count & IRQ_TIMINGS_MASK;
 737
 738        count = min_t(int, count, IRQ_TIMINGS_SIZE);
 739
 740        for (i = 0; i < count; i++) {
 741                int index = (start + i) & IRQ_TIMINGS_MASK;
 742                buffer[i] = _buffer[index];
 743        }
 744
 745        index = irq_timings_next_event_index(buffer, count, period_max);
 746        i = irq_timings_interval_index(ti->intervals[ti->count - 1]);
 747
 748        if (index != i) {
 749                pr_err("Expected (%d) and computed (%d) next indexes differ\n",
 750                       i, index);
 751                return -EINVAL;
 752        }
 753
 754        return 0;
 755}
 756
 757static int __init irq_timings_next_index_selftest(void)
 758{
 759        int i, ret;
 760
 761        for (i = 0; i < ARRAY_SIZE(tis); i++) {
 762
 763                pr_info("---> Injecting intervals number #%d (count=%zd)\n",
 764                        i, tis[i].count);
 765
 766                ret = irq_timings_test_next_index(&tis[i]);
 767                if (ret)
 768                        break;
 769        }
 770
 771        return ret;
 772}
 773
 774static int __init irq_timings_test_irqs(struct timings_intervals *ti)
 775{
 776        struct irqt_stat __percpu *s;
 777        struct irqt_stat *irqs;
 778        int i, index, ret, irq = 0xACE5;
 779
 780        ret = irq_timings_alloc(irq);
 781        if (ret) {
 782                pr_err("Failed to allocate irq timings\n");
 783                return ret;
 784        }
 785
 786        s = idr_find(&irqt_stats, irq);
 787        if (!s) {
 788                ret = -EIDRM;
 789                goto out;
 790        }
 791
 792        irqs = this_cpu_ptr(s);
 793
 794        for (i = 0; i < ti->count; i++) {
 795
 796                index = irq_timings_interval_index(ti->intervals[i]);
 797                pr_debug("%d: interval=%llu ema_index=%d\n",
 798                         i, ti->intervals[i], index);
 799
 800                __irq_timings_store(irq, irqs, ti->intervals[i]);
 801                if (irqs->circ_timings[i & IRQ_TIMINGS_MASK] != index) {
 802                        ret = -EBADSLT;
 803                        pr_err("Failed to store in the circular buffer\n");
 804                        goto out;
 805                }
 806        }
 807
 808        if (irqs->count != ti->count) {
 809                ret = -ERANGE;
 810                pr_err("Count differs\n");
 811                goto out;
 812        }
 813
 814        ret = 0;
 815out:
 816        irq_timings_free(irq);
 817
 818        return ret;
 819}
 820
 821static int __init irq_timings_irqs_selftest(void)
 822{
 823        int i, ret;
 824
 825        for (i = 0; i < ARRAY_SIZE(tis); i++) {
 826                pr_info("---> Injecting intervals number #%d (count=%zd)\n",
 827                        i, tis[i].count);
 828                ret = irq_timings_test_irqs(&tis[i]);
 829                if (ret)
 830                        break;
 831        }
 832
 833        return ret;
 834}
 835
 836static int __init irq_timings_test_irqts(struct irq_timings *irqts,
 837                                         unsigned count)
 838{
 839        int start = count >= IRQ_TIMINGS_SIZE ? count - IRQ_TIMINGS_SIZE : 0;
 840        int i, irq, oirq = 0xBEEF;
 841        u64 ots = 0xDEAD, ts;
 842
 843        /*
 844         * Fill the circular buffer by using the dedicated function.
 845         */
 846        for (i = 0; i < count; i++) {
 847                pr_debug("%d: index=%d, ts=%llX irq=%X\n",
 848                         i, i & IRQ_TIMINGS_MASK, ots + i, oirq + i);
 849
 850                irq_timings_push(ots + i, oirq + i);
 851        }
 852
 853        /*
 854         * Compute the first elements values after the index wrapped
 855         * up or not.
 856         */
 857        ots += start;
 858        oirq += start;
 859
 860        /*
 861         * Test the circular buffer count is correct.
 862         */
 863        pr_debug("---> Checking timings array count (%d) is right\n", count);
 864        if (WARN_ON(irqts->count != count))
 865                return -EINVAL;
 866
 867        /*
 868         * Test the macro allowing to browse all the irqts.
 869         */
 870        pr_debug("---> Checking the for_each_irqts() macro\n");
 871        for_each_irqts(i, irqts) {
 872
 873                irq = irq_timing_decode(irqts->values[i], &ts);
 874
 875                pr_debug("index=%d, ts=%llX / %llX, irq=%X / %X\n",
 876                         i, ts, ots, irq, oirq);
 877
 878                if (WARN_ON(ts != ots || irq != oirq))
 879                        return -EINVAL;
 880
 881                ots++; oirq++;
 882        }
 883
 884        /*
 885         * The circular buffer should have be flushed when browsed
 886         * with for_each_irqts
 887         */
 888        pr_debug("---> Checking timings array is empty after browsing it\n");
 889        if (WARN_ON(irqts->count))
 890                return -EINVAL;
 891
 892        return 0;
 893}
 894
 895static int __init irq_timings_irqts_selftest(void)
 896{
 897        struct irq_timings *irqts = this_cpu_ptr(&irq_timings);
 898        int i, ret;
 899
 900        /*
 901         * Test the circular buffer with different number of
 902         * elements. The purpose is to test at the limits (empty, half
 903         * full, full, wrapped with the cursor at the boundaries,
 904         * wrapped several times, etc ...
 905         */
 906        int count[] = { 0,
 907                        IRQ_TIMINGS_SIZE >> 1,
 908                        IRQ_TIMINGS_SIZE,
 909                        IRQ_TIMINGS_SIZE + (IRQ_TIMINGS_SIZE >> 1),
 910                        2 * IRQ_TIMINGS_SIZE,
 911                        (2 * IRQ_TIMINGS_SIZE) + 3,
 912        };
 913
 914        for (i = 0; i < ARRAY_SIZE(count); i++) {
 915
 916                pr_info("---> Checking the timings with %d/%d values\n",
 917                        count[i], IRQ_TIMINGS_SIZE);
 918
 919                ret = irq_timings_test_irqts(irqts, count[i]);
 920                if (ret)
 921                        break;
 922        }
 923
 924        return ret;
 925}
 926
 927static int __init irq_timings_selftest(void)
 928{
 929        int ret;
 930
 931        pr_info("------------------- selftest start -----------------\n");
 932
 933        /*
 934         * At this point, we don't except any subsystem to use the irq
 935         * timings but us, so it should not be enabled.
 936         */
 937        if (static_branch_unlikely(&irq_timing_enabled)) {
 938                pr_warn("irq timings already initialized, skipping selftest\n");
 939                return 0;
 940        }
 941
 942        ret = irq_timings_irqts_selftest();
 943        if (ret)
 944                goto out;
 945
 946        ret = irq_timings_irqs_selftest();
 947        if (ret)
 948                goto out;
 949
 950        ret = irq_timings_next_index_selftest();
 951out:
 952        pr_info("---------- selftest end with %s -----------\n",
 953                ret ? "failure" : "success");
 954
 955        return ret;
 956}
 957early_initcall(irq_timings_selftest);
 958#endif
 959