mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
lib/stacktrace, kasan, kmsan: rework extra_bits interface
The current implementation of the extra_bits interface is confusing: passing extra_bits to __stack_depot_save makes it seem that the extra bits are somehow stored in stack depot. In reality, they are only embedded into a stack depot handle and are not used within stack depot. Drop the extra_bits argument from __stack_depot_save and instead provide a new stack_depot_set_extra_bits function (similar to the exsiting stack_depot_get_extra_bits) that saves extra bits into a stack depot handle. Update the callers of __stack_depot_save to use the new interace. This change also fixes a minor issue in the old code: __stack_depot_save does not return NULL if saving stack trace fails and extra_bits is used. Link: https://lkml.kernel.org/r/317123b5c05e2f82854fc55d8b285e0869d3cb77.1676063693.git.andreyknvl@google.com Signed-off-by: Andrey Konovalov <andreyknvl@google.com> Reviewed-by: Alexander Potapenko <glider@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
d11a5621f3
commit
36aa1e6779
@@ -357,7 +357,6 @@ static inline struct stack_record *find_stack(struct stack_record *bucket,
|
||||
*
|
||||
* @entries: Pointer to storage array
|
||||
* @nr_entries: Size of the storage array
|
||||
* @extra_bits: Flags to store in unused bits of depot_stack_handle_t
|
||||
* @alloc_flags: Allocation gfp flags
|
||||
* @can_alloc: Allocate stack pools (increased chance of failure if false)
|
||||
*
|
||||
@@ -369,10 +368,6 @@ static inline struct stack_record *find_stack(struct stack_record *bucket,
|
||||
* If the stack trace in @entries is from an interrupt, only the portion up to
|
||||
* interrupt entry is saved.
|
||||
*
|
||||
* Additional opaque flags can be passed in @extra_bits, stored in the unused
|
||||
* bits of the stack handle, and retrieved using stack_depot_get_extra_bits()
|
||||
* without calling stack_depot_fetch().
|
||||
*
|
||||
* Context: Any context, but setting @can_alloc to %false is required if
|
||||
* alloc_pages() cannot be used from the current context. Currently
|
||||
* this is the case from contexts where neither %GFP_ATOMIC nor
|
||||
@@ -382,7 +377,6 @@ static inline struct stack_record *find_stack(struct stack_record *bucket,
|
||||
*/
|
||||
depot_stack_handle_t __stack_depot_save(unsigned long *entries,
|
||||
unsigned int nr_entries,
|
||||
unsigned int extra_bits,
|
||||
gfp_t alloc_flags, bool can_alloc)
|
||||
{
|
||||
struct stack_record *found = NULL, **bucket;
|
||||
@@ -471,8 +465,6 @@ exit:
|
||||
if (found)
|
||||
retval.handle = found->handle.handle;
|
||||
fast_exit:
|
||||
retval.extra = extra_bits;
|
||||
|
||||
return retval.handle;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__stack_depot_save);
|
||||
@@ -493,7 +485,7 @@ depot_stack_handle_t stack_depot_save(unsigned long *entries,
|
||||
unsigned int nr_entries,
|
||||
gfp_t alloc_flags)
|
||||
{
|
||||
return __stack_depot_save(entries, nr_entries, 0, alloc_flags, true);
|
||||
return __stack_depot_save(entries, nr_entries, alloc_flags, true);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(stack_depot_save);
|
||||
|
||||
@@ -576,6 +568,38 @@ int stack_depot_snprint(depot_stack_handle_t handle, char *buf, size_t size,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(stack_depot_snprint);
|
||||
|
||||
/**
|
||||
* stack_depot_set_extra_bits - Set extra bits in a stack depot handle
|
||||
*
|
||||
* @handle: Stack depot handle returned from stack_depot_save()
|
||||
* @extra_bits: Value to set the extra bits
|
||||
*
|
||||
* Return: Stack depot handle with extra bits set
|
||||
*
|
||||
* Stack depot handles have a few unused bits, which can be used for storing
|
||||
* user-specific information. These bits are transparent to the stack depot.
|
||||
*/
|
||||
depot_stack_handle_t __must_check stack_depot_set_extra_bits(
|
||||
depot_stack_handle_t handle, unsigned int extra_bits)
|
||||
{
|
||||
union handle_parts parts = { .handle = handle };
|
||||
|
||||
/* Don't set extra bits on empty handles. */
|
||||
if (!handle)
|
||||
return 0;
|
||||
|
||||
parts.extra = extra_bits;
|
||||
return parts.handle;
|
||||
}
|
||||
EXPORT_SYMBOL(stack_depot_set_extra_bits);
|
||||
|
||||
/**
|
||||
* stack_depot_get_extra_bits - Retrieve extra bits from a stack depot handle
|
||||
*
|
||||
* @handle: Stack depot handle with extra bits saved
|
||||
*
|
||||
* Return: Extra bits retrieved from the stack depot handle
|
||||
*/
|
||||
unsigned int stack_depot_get_extra_bits(depot_stack_handle_t handle)
|
||||
{
|
||||
union handle_parts parts = { .handle = handle };
|
||||
|
Reference in New Issue
Block a user