Hi Daniel, I love your patch! Perhaps something to improve:
[auto build test WARNING on pm/linux-next] [also build test WARNING on v5.2-rc5 next-20190621] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Daniel-Lezcano/cpuidle-drivers-mobile-Add-new-governor-for-mobile-embedded-systems/20190622-064303 base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next reproduce: # apt-get install sparse # sparse version: v0.6.1-rc1-7-g2b96cd8-dirty make ARCH=x86_64 allmodconfig make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' If you fix the issue, kindly add following tag Reported-by: kbuild test robot <l...@intel.com> sparse warnings: (new ones prefixed by >>) vim +502 kernel/irq/timings.c bbba0e7c Daniel Lezcano 2019-03-28 437 e1c92149 Daniel Lezcano 2017-06-23 438 /** e1c92149 Daniel Lezcano 2017-06-23 439 * irq_timings_next_event - Return when the next event is supposed to arrive e1c92149 Daniel Lezcano 2017-06-23 440 * e1c92149 Daniel Lezcano 2017-06-23 441 * During the last busy cycle, the number of interrupts is incremented e1c92149 Daniel Lezcano 2017-06-23 442 * and stored in the irq_timings structure. This information is e1c92149 Daniel Lezcano 2017-06-23 443 * necessary to: e1c92149 Daniel Lezcano 2017-06-23 444 * e1c92149 Daniel Lezcano 2017-06-23 445 * - know if the index in the table wrapped up: e1c92149 Daniel Lezcano 2017-06-23 446 * e1c92149 Daniel Lezcano 2017-06-23 447 * If more than the array size interrupts happened during the e1c92149 Daniel Lezcano 2017-06-23 448 * last busy/idle cycle, the index wrapped up and we have to e1c92149 Daniel Lezcano 2017-06-23 449 * begin with the next element in the array which is the last one e1c92149 Daniel Lezcano 2017-06-23 450 * in the sequence, otherwise it is a the index 0. e1c92149 Daniel Lezcano 2017-06-23 451 * e1c92149 Daniel Lezcano 2017-06-23 452 * - have an indication of the interrupts activity on this CPU e1c92149 Daniel Lezcano 2017-06-23 453 * (eg. irq/sec) e1c92149 Daniel Lezcano 2017-06-23 454 * e1c92149 Daniel Lezcano 2017-06-23 455 * The values are 'consumed' after inserting in the statistical model, e1c92149 Daniel Lezcano 2017-06-23 456 * thus the count is reinitialized. e1c92149 Daniel Lezcano 2017-06-23 457 * e1c92149 Daniel Lezcano 2017-06-23 458 * The array of values **must** be browsed in the time direction, the e1c92149 Daniel Lezcano 2017-06-23 459 * timestamp must increase between an element and the next one. e1c92149 Daniel Lezcano 2017-06-23 460 * e1c92149 Daniel Lezcano 2017-06-23 461 * Returns a nanosec time based estimation of the earliest interrupt, e1c92149 Daniel Lezcano 2017-06-23 462 * U64_MAX otherwise. e1c92149 Daniel Lezcano 2017-06-23 463 */ e1c92149 Daniel Lezcano 2017-06-23 464 u64 irq_timings_next_event(u64 now) e1c92149 Daniel Lezcano 2017-06-23 465 { bbba0e7c Daniel Lezcano 2019-03-28 466 struct irq_timings *irqts = this_cpu_ptr(&irq_timings); bbba0e7c Daniel Lezcano 2019-03-28 467 struct irqt_stat *irqs; bbba0e7c Daniel Lezcano 2019-03-28 468 struct irqt_stat __percpu *s; bbba0e7c Daniel Lezcano 2019-03-28 469 u64 ts, next_evt = U64_MAX; bbba0e7c Daniel Lezcano 2019-03-28 470 int i, irq = 0; bbba0e7c Daniel Lezcano 2019-03-28 471 e1c92149 Daniel Lezcano 2017-06-23 472 /* e1c92149 Daniel Lezcano 2017-06-23 473 * This function must be called with the local irq disabled in e1c92149 Daniel Lezcano 2017-06-23 474 * order to prevent the timings circular buffer to be updated e1c92149 Daniel Lezcano 2017-06-23 475 * while we are reading it. e1c92149 Daniel Lezcano 2017-06-23 476 */ a934d4d1 Frederic Weisbecker 2017-11-06 477 lockdep_assert_irqs_disabled(); e1c92149 Daniel Lezcano 2017-06-23 478 bbba0e7c Daniel Lezcano 2019-03-28 479 if (!irqts->count) bbba0e7c Daniel Lezcano 2019-03-28 480 return next_evt; bbba0e7c Daniel Lezcano 2019-03-28 481 bbba0e7c Daniel Lezcano 2019-03-28 482 /* bbba0e7c Daniel Lezcano 2019-03-28 483 * Number of elements in the circular buffer: If it happens it bbba0e7c Daniel Lezcano 2019-03-28 484 * was flushed before, then the number of elements could be bbba0e7c Daniel Lezcano 2019-03-28 485 * smaller than IRQ_TIMINGS_SIZE, so the count is used, bbba0e7c Daniel Lezcano 2019-03-28 486 * otherwise the array size is used as we wrapped. The index bbba0e7c Daniel Lezcano 2019-03-28 487 * begins from zero when we did not wrap. That could be done bbba0e7c Daniel Lezcano 2019-03-28 488 * in a nicer way with the proper circular array structure bbba0e7c Daniel Lezcano 2019-03-28 489 * type but with the cost of extra computation in the bbba0e7c Daniel Lezcano 2019-03-28 490 * interrupt handler hot path. We choose efficiency. bbba0e7c Daniel Lezcano 2019-03-28 491 * bbba0e7c Daniel Lezcano 2019-03-28 492 * Inject measured irq/timestamp to the pattern prediction bbba0e7c Daniel Lezcano 2019-03-28 493 * model while decrementing the counter because we consume the bbba0e7c Daniel Lezcano 2019-03-28 494 * data from our circular buffer. bbba0e7c Daniel Lezcano 2019-03-28 495 */ bbba0e7c Daniel Lezcano 2019-03-28 496 bbba0e7c Daniel Lezcano 2019-03-28 497 i = (irqts->count & IRQ_TIMINGS_MASK) - 1; bbba0e7c Daniel Lezcano 2019-03-28 498 irqts->count = min(IRQ_TIMINGS_SIZE, irqts->count); bbba0e7c Daniel Lezcano 2019-03-28 499 bbba0e7c Daniel Lezcano 2019-03-28 500 for (; irqts->count > 0; irqts->count--, i = (i + 1) & IRQ_TIMINGS_MASK) { bbba0e7c Daniel Lezcano 2019-03-28 501 irq = irq_timing_decode(irqts->values[i], &ts); bbba0e7c Daniel Lezcano 2019-03-28 @502 s = idr_find(&irqt_stats, irq); bbba0e7c Daniel Lezcano 2019-03-28 503 if (s) bbba0e7c Daniel Lezcano 2019-03-28 504 irq_timings_store(irq, this_cpu_ptr(s), ts); bbba0e7c Daniel Lezcano 2019-03-28 505 } bbba0e7c Daniel Lezcano 2019-03-28 506 bbba0e7c Daniel Lezcano 2019-03-28 507 /* bbba0e7c Daniel Lezcano 2019-03-28 508 * Look in the list of interrupts' statistics, the earliest bbba0e7c Daniel Lezcano 2019-03-28 509 * next event. bbba0e7c Daniel Lezcano 2019-03-28 510 */ bbba0e7c Daniel Lezcano 2019-03-28 @511 idr_for_each_entry(&irqt_stats, s, i) { bbba0e7c Daniel Lezcano 2019-03-28 512 bbba0e7c Daniel Lezcano 2019-03-28 513 irqs = this_cpu_ptr(s); bbba0e7c Daniel Lezcano 2019-03-28 514 bbba0e7c Daniel Lezcano 2019-03-28 515 ts = __irq_timings_next_event(irqs, i, now); bbba0e7c Daniel Lezcano 2019-03-28 516 if (ts <= now) bbba0e7c Daniel Lezcano 2019-03-28 517 return now; bbba0e7c Daniel Lezcano 2019-03-28 518 bbba0e7c Daniel Lezcano 2019-03-28 519 if (ts < next_evt) bbba0e7c Daniel Lezcano 2019-03-28 520 next_evt = ts; bbba0e7c Daniel Lezcano 2019-03-28 521 } bbba0e7c Daniel Lezcano 2019-03-28 522 bbba0e7c Daniel Lezcano 2019-03-28 523 return next_evt; e1c92149 Daniel Lezcano 2017-06-23 524 } e1c92149 Daniel Lezcano 2017-06-23 525 e1c92149 Daniel Lezcano 2017-06-23 526 void irq_timings_free(int irq) e1c92149 Daniel Lezcano 2017-06-23 527 { e1c92149 Daniel Lezcano 2017-06-23 528 struct irqt_stat __percpu *s; e1c92149 Daniel Lezcano 2017-06-23 529 e1c92149 Daniel Lezcano 2017-06-23 530 s = idr_find(&irqt_stats, irq); e1c92149 Daniel Lezcano 2017-06-23 531 if (s) { e1c92149 Daniel Lezcano 2017-06-23 532 free_percpu(s); e1c92149 Daniel Lezcano 2017-06-23 533 idr_remove(&irqt_stats, irq); e1c92149 Daniel Lezcano 2017-06-23 534 } e1c92149 Daniel Lezcano 2017-06-23 535 } e1c92149 Daniel Lezcano 2017-06-23 536 e1c92149 Daniel Lezcano 2017-06-23 537 int irq_timings_alloc(int irq) e1c92149 Daniel Lezcano 2017-06-23 538 { e1c92149 Daniel Lezcano 2017-06-23 539 struct irqt_stat __percpu *s; e1c92149 Daniel Lezcano 2017-06-23 540 int id; e1c92149 Daniel Lezcano 2017-06-23 541 e1c92149 Daniel Lezcano 2017-06-23 542 /* e1c92149 Daniel Lezcano 2017-06-23 543 * Some platforms can have the same private interrupt per cpu, e1c92149 Daniel Lezcano 2017-06-23 544 * so this function may be be called several times with the e1c92149 Daniel Lezcano 2017-06-23 545 * same interrupt number. Just bail out in case the per cpu e1c92149 Daniel Lezcano 2017-06-23 546 * stat structure is already allocated. e1c92149 Daniel Lezcano 2017-06-23 547 */ e1c92149 Daniel Lezcano 2017-06-23 548 s = idr_find(&irqt_stats, irq); e1c92149 Daniel Lezcano 2017-06-23 549 if (s) e1c92149 Daniel Lezcano 2017-06-23 550 return 0; e1c92149 Daniel Lezcano 2017-06-23 551 e1c92149 Daniel Lezcano 2017-06-23 552 s = alloc_percpu(*s); e1c92149 Daniel Lezcano 2017-06-23 553 if (!s) e1c92149 Daniel Lezcano 2017-06-23 554 return -ENOMEM; e1c92149 Daniel Lezcano 2017-06-23 555 e1c92149 Daniel Lezcano 2017-06-23 556 idr_preload(GFP_KERNEL); e1c92149 Daniel Lezcano 2017-06-23 @557 id = idr_alloc(&irqt_stats, s, irq, irq + 1, GFP_NOWAIT); :::::: The code at line 502 was first introduced by commit :::::: bbba0e7c5cdadb47a91edea1d5cd0caadbbb016f genirq/timings: Add array suffix computation code :::::: TO: Daniel Lezcano <daniel.lezc...@linaro.org> :::::: CC: Thomas Gleixner <t...@linutronix.de> --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation