Commit 0eb77e988032 ("vmstat: make vmstat_updater deferrable again and shut down on idle") made vmstat_shepherd deferrable. vmstat_update itself is still useing standard timer which might interrupt idle task. This is possible because "mm, vmstat: make quiet_vmstat lighter" removed cancel_delayed_work from the quiet_vmstat. Change vmstat_work to use DEFERRABLE_WORK to prevent from pointless wakeups from the idle context.
Unified · Split
| @@ -1512,7 +1512,7 @@ static void __init start_shepherd_timer(void) · 1511 unmodified lines | |||
| 1512 | int cpu; | 1512 | int cpu; |
| 1513 | 1513 | ||
| 1514 | for_each_possible_cpu(cpu) | 1514 | for_each_possible_cpu(cpu) |
| 1515 | INIT_DELAYED_WORK(per_cpu_ptr(&vmstat_work, cpu), | 1515 | INIT_DEFERRABLE_WORK(per_cpu_ptr(&vmstat_work, cpu), |
| 1516 | vmstat_update); | 1516 | vmstat_update); |
| 1517 | 1517 | ||
| 1518 | if (!alloc_cpumask_var(&cpu_stat_off, GFP_KERNEL)) | 1518 | if (!alloc_cpumask_var(&cpu_stat_off, GFP_KERNEL)) |