mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-03 19:55:31 +00:00
mm, slab: split out the cpu offline variant of flush_slab()
flush_slab() is called either as part IPI handler on given live cpu, or as a cleanup on behalf of another cpu that went offline. The first case needs to protect updating the kmem_cache_cpu fields with disabled irqs. Currently the whole call happens with irqs disabled by the IPI handler, but the following patch will change from IPI to workqueue, and flush_slab() will have to disable irqs (to be replaced with a local lock later) in the critical part. To prepare for this change, replace the call to flush_slab() for the dead cpu handling with an opencoded variant that will not disable irqs nor take a local lock. Suggested-by: Mike Galbraith <efault@gmx.de> Signed-off-by: Vlastimil Babka <vbabka@suse.cz>
This commit is contained in:
parent
0e7ac738f7
commit
08beb547a1
12
mm/slub.c
12
mm/slub.c
@ -2511,9 +2511,17 @@ static inline void flush_slab(struct kmem_cache *s, struct kmem_cache_cpu *c)
|
||||
static inline void __flush_cpu_slab(struct kmem_cache *s, int cpu)
|
||||
{
|
||||
struct kmem_cache_cpu *c = per_cpu_ptr(s->cpu_slab, cpu);
|
||||
void *freelist = c->freelist;
|
||||
struct page *page = c->page;
|
||||
|
||||
if (c->page)
|
||||
flush_slab(s, c);
|
||||
c->page = NULL;
|
||||
c->freelist = NULL;
|
||||
c->tid = next_tid(c->tid);
|
||||
|
||||
if (page) {
|
||||
deactivate_slab(s, page, freelist);
|
||||
stat(s, CPUSLAB_FLUSH);
|
||||
}
|
||||
|
||||
unfreeze_partials_cpu(s, c);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user