Skip to content

Commit a9f2a84

Browse files
tehcastertorvalds
authored andcommitted
mm, slab: reschedule cache_reap() on the same CPU
cache_reap() is initially scheduled in start_cpu_timer() via schedule_delayed_work_on(). But then the next iterations are scheduled via schedule_delayed_work(), i.e. using WORK_CPU_UNBOUND. Thus since commit ef55718 ("workqueue: schedule WORK_CPU_UNBOUND work on wq_unbound_cpumask CPUs") there is no guarantee the future iterations will run on the originally intended cpu, although it's still preferred. I was able to demonstrate this with /sys/module/workqueue/parameters/debug_force_rr_cpu. IIUC, it may also happen due to migrating timers in nohz context. As a result, some cpu's would be calling cache_reap() more frequently and others never. This patch uses schedule_delayed_work_on() with the current cpu when scheduling the next iteration. Link: http://lkml.kernel.org/r/[email protected] Fixes: ef55718 ("workqueue: schedule WORK_CPU_UNBOUND work on wq_unbound_cpumask CPUs") Signed-off-by: Vlastimil Babka <[email protected]> Acked-by: Pekka Enberg <[email protected]> Acked-by: Christoph Lameter <[email protected]> Cc: Joonsoo Kim <[email protected]> Cc: David Rientjes <[email protected]> Cc: Tejun Heo <[email protected]> Cc: Lai Jiangshan <[email protected]> Cc: John Stultz <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Stephen Boyd <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 1cbf29d commit a9f2a84

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

mm/slab.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4086,7 +4086,8 @@ static void cache_reap(struct work_struct *w)
40864086
next_reap_node();
40874087
out:
40884088
/* Set up the next iteration */
4089-
schedule_delayed_work(work, round_jiffies_relative(REAPTIMEOUT_AC));
4089+
schedule_delayed_work_on(smp_processor_id(), work,
4090+
round_jiffies_relative(REAPTIMEOUT_AC));
40904091
}
40914092

40924093
void get_slabinfo(struct kmem_cache *cachep, struct slabinfo *sinfo)

0 commit comments

Comments
 (0)