diff options
author | Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 2021-02-26 17:11:55 +0100 |
---|---|---|
committer | Vlastimil Babka <vbabka@suse.cz> | 2021-09-04 01:12:23 +0200 |
commit | 5a836bf6b09f99ead1b69457ff39ab3011ece57b (patch) | |
tree | 959be42f69d765d7198b8c1d6c8aa1a3f3e54ec7 /mm/slab_common.c | |
parent | 08beb547a1f7b66fbeaf40f2d3675a3ea0060c0b (diff) | |
download | linux-5a836bf6b09f99ead1b69457ff39ab3011ece57b.tar.gz linux-5a836bf6b09f99ead1b69457ff39ab3011ece57b.tar.bz2 linux-5a836bf6b09f99ead1b69457ff39ab3011ece57b.zip |
mm: slub: move flush_cpu_slab() invocations __free_slab() invocations out of IRQ context
flush_all() flushes a specific SLAB cache on each CPU (where the cache
is present). The deactivate_slab()/__free_slab() invocation happens
within IPI handler and is problematic for PREEMPT_RT.
The flush operation is not a frequent operation or a hot path. The
per-CPU flush operation can be moved to within a workqueue.
Because a workqueue handler, unlike IPI handler, does not disable irqs,
flush_slab() now has to disable them for working with the kmem_cache_cpu
fields. deactivate_slab() is safe to call with irqs enabled.
[vbabka@suse.cz: adapt to new SLUB changes]
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
Diffstat (limited to 'mm/slab_common.c')
-rw-r--r-- | mm/slab_common.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/mm/slab_common.c b/mm/slab_common.c index 1c673c323baf..ec2bb0beed75 100644 --- a/mm/slab_common.c +++ b/mm/slab_common.c @@ -502,6 +502,7 @@ void kmem_cache_destroy(struct kmem_cache *s) if (unlikely(!s)) return; + cpus_read_lock(); mutex_lock(&slab_mutex); s->refcount--; @@ -516,6 +517,7 @@ void kmem_cache_destroy(struct kmem_cache *s) } out_unlock: mutex_unlock(&slab_mutex); + cpus_read_unlock(); } EXPORT_SYMBOL(kmem_cache_destroy); |