On 2024-11-22 16:01:29 [+0100], Marco Elver wrote:
> > Do we need to update the comment saying that it must not be used from
> > NMI or do we make it jump over the locked section in the NMI case?
> 
> Good point. It was meant to also be usable from NMI, because it's very
> likely to succeed, and should just take the lock-less fast path once the
> stack is in the depot.
> 
> But I think we need a fix like this for initial saving of a stack trace:
> 
> 
> diff --git a/lib/stackdepot.c b/lib/stackdepot.c
> index 5ed34cc963fc..245d5b416699 100644
> --- a/lib/stackdepot.c
> +++ b/lib/stackdepot.c
> @@ -630,7 +630,15 @@ depot_stack_handle_t stack_depot_save_flags(unsigned 
> long *entries,
>                       prealloc = page_address(page);
>       }
>  
> -     raw_spin_lock_irqsave(&pool_lock, flags);
> +     if (in_nmi()) {
> +             /* We can never allocate in NMI context. */
> +             WARN_ON_ONCE(can_alloc);
> +             /* Best effort; bail if we fail to take the lock. */
> +             if (!raw_spin_trylock_irqsave(&pool_lock, flags))
> +                     goto exit;
> +     } else {
> +             raw_spin_lock_irqsave(&pool_lock, flags);
> +     }
>       printk_deferred_enter();
>  
>       /* Try to find again, to avoid concurrently inserting duplicates. */
> 
> 
> If that looks reasonable, I'll turn it into a patch.

Yes, looks reasonable.

Sebastian

Reply via email to