On Thu, 22 Jun 2017, root wrote:
@@ -962,6 +962,7 @@ __visible void __irq_entry smp_apic_timer_interrupt(struct pt_regs *regs)
* interrupt lock, which is the WrongThing (tm) to do.
No way, that we sprinkle this function into every interrupt hotpath. There
are enough genuine ways to do that w/o touching a gazillion of files.
+static unsigned int grow_poll_ns(unsigned int old, unsigned int grow,
+ unsigned int max)
+ unsigned int val;
+ /* 10us as base poll duration */
+ if (old == 0 && grow)
+ return 10000;
+ val = old * grow;
+ if (val > max)
+ val = max;
+ return val;
+static unsigned int shrink_poll_ns(unsigned int old, unsigned int shrink)
+ if (shrink == 0)
+ return 0;
+ return old / shrink;
+ unsigned int val, poll_duration;
+ unsigned long begin_ns, now_ns;
+ if (!poll_threshold_ns)
If at all then this needs to be a static key based decision.
+ begin_ns = this_cpu_read(poll_begin_ns);
+ /* Not from halt state */
+ if (!begin_ns)
If you integrate this stuff into the proper place, then the whole mess goes
away. We really do not need another facility to track idle state. We have
enough already, really.