In message: [linux-yocto rt v5.2&v5.4] mm: slub: Always flush the delayed empty 
slubs in flush_all()
on 26/05/2020 Kevin Hao wrote:

> commit 23a2c31b19e99beaf5107071b0f32a596202cdae from
> git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git
> 
> After commit f0b231101c94 ("mm/SLUB: delay giving back empty slubs to
> IRQ enabled regions"), when the free_slab() is invoked with the IRQ
> disabled, the empty slubs are moved to a per-CPU list and will be
> freed after IRQ enabled later. But in the current codes, there is
> a check to see if there really has the cpu slub on a specific cpu
> before flushing the delayed empty slubs, this may cause a reference
> of already released kmem_cache in a scenario like below:
>       cpu 0                           cpu 1
>   kmem_cache_destroy()
>     flush_all()
>                          --->IPI       flush_cpu_slab()
>                                          flush_slab()
>                                            deactivate_slab()
>                                              discard_slab()
>                                                free_slab()
>                                              c->page = NULL;
>       for_each_online_cpu(cpu)
>         if (!has_cpu_slab(1, s))
>           continue
>         this skip to flush the delayed
>         empty slub released by cpu1
>     kmem_cache_free(kmem_cache, s)
> 
>                                        kmalloc()
>                                          __slab_alloc()
>                                             free_delayed()
>                                             __free_slab()
>                                             reference to released kmem_cache
> 
> Fixes: f0b231101c94 ("mm/SLUB: delay giving back empty slubs to IRQ enabled 
> regions")
> Signed-off-by: Kevin Hao <[email protected]>
> Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
> Cc: [email protected]
> ---
> Hi Bruce,
> 
> Please help me merge this into the following two branches:
>   v5.2/standard/preempt-rt/base
>   v5.4/standard/preempt-rt/base

I thought about waiting for this to loop through the rt 5.4-stable tree, but
who knows how long that would take!

I've merged the changes to both -rt branches now.

Bruce

> 
>  mm/slub.c | 3 ---
>  1 file changed, 3 deletions(-)
> 
> diff --git a/mm/slub.c b/mm/slub.c
> index 05f176aa7f70..5c10491cd93a 100644
> --- a/mm/slub.c
> +++ b/mm/slub.c
> @@ -2382,9 +2382,6 @@ static void flush_all(struct kmem_cache *s)
>       for_each_online_cpu(cpu) {
>               struct slub_free_list *f;
>  
> -             if (!has_cpu_slab(cpu, s))
> -                     continue;
> -
>               f = &per_cpu(slub_free_list, cpu);
>               raw_spin_lock_irq(&f->lock);
>               list_splice_init(&f->list, &tofree);
> -- 
> 2.26.2
> 
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.

View/Reply Online (#8724): 
https://lists.yoctoproject.org/g/linux-yocto/message/8724
Mute This Topic: https://lists.yoctoproject.org/mt/74470908/21656
Group Owner: [email protected]
Unsubscribe: https://lists.yoctoproject.org/g/linux-yocto/unsub  
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to