On Mon, Jun 15, 2026 at 08:05:58PM +0900, Harry Yoo (Oracle) wrote:
> call_rcu() disables IRQs with local_irq_save() to protect its per-cpu
> data structures. Therefore, if IRQs are not disabled, they cannot be
> corrupted by reentrance into call_rcu(). So fall back to the deferred
> path only when !allow_spin && irqs_disabled().
> 
> The RCU subsystem does not guarantee this contractually, and this
> optimization relies on RCU's implementation details. Ideally, it should
> be removed once call_rcu_nolock() is supported by the RCU subsystem.
> 
> Link: 
> https://lore.kernel.org/linux-mm/caadnvqkrvd5zsnekbzzu7w86ghbghuug2pvzpgztngns+fg...@mail.gmail.com
> Suggested-by: Alexei Starovoitov <[email protected]>
> Signed-off-by: Harry Yoo (Oracle) <[email protected]>
> ---
>  mm/slub.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/mm/slub.c b/mm/slub.c
> index b0d38d515386..6a3552b70683 100644
> --- a/mm/slub.c
> +++ b/mm/slub.c
> @@ -6158,8 +6158,8 @@ bool __kfree_rcu_sheaf(struct kmem_cache *s, void *obj, 
> bool allow_spin)
>       if (likely(rcu_sheaf->size < s->sheaf_capacity)) {
>               rcu_sheaf = NULL;
>       } else {
> -             if (unlikely(!allow_spin)) {
> -                     /* call_rcu() cannot be called in an unknown context */
> +             /* call_rcu() disables IRQs to protect percpu data structures */
> +             if (unlikely(!allow_spin && irqs_disabled())) {

Perhaps this could be more neatly exposed by RCU? something like
maybe_in_call_rcu(). Also, it's a bit odd that you're introducing code and
then subsequently patching over it with an improvement. Maybe this could be
squashed into patch 3?

>                       rcu_sheaf->size--;
>                       local_unlock(&s->cpu_sheaves->lock);
>                       goto fail;
> 
> -- 
> 2.53.0
> 

-- 
Pedro

Reply via email to