On Tue, Aug 29, 2023 at 07:11PM +0200, andrey.konovalov@xxxxxxxxx wrote: > From: Andrey Konovalov <andreyknvl@xxxxxxxxxx> > > Add a reference counter for how many times a stack records has been added > to stack depot. > > Do no yet decrement the refcount, this is implemented in one of the > following patches. > > This is preparatory patch for implementing the eviction of stack records > from the stack depot. > > Signed-off-by: Andrey Konovalov <andreyknvl@xxxxxxxxxx> > --- > lib/stackdepot.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/lib/stackdepot.c b/lib/stackdepot.c > index 5ad454367379..a84c0debbb9e 100644 > --- a/lib/stackdepot.c > +++ b/lib/stackdepot.c > @@ -22,6 +22,7 @@ > #include <linux/mutex.h> > #include <linux/percpu.h> > #include <linux/printk.h> > +#include <linux/refcount.h> > #include <linux/slab.h> > #include <linux/spinlock.h> > #include <linux/stacktrace.h> > @@ -60,6 +61,7 @@ struct stack_record { > u32 hash; /* Hash in hash table */ > u32 size; /* Number of stored frames */ > union handle_parts handle; > + refcount_t count; > unsigned long entries[DEPOT_STACK_MAX_FRAMES]; /* Frames */ > }; > > @@ -348,6 +350,7 @@ depot_alloc_stack(unsigned long *entries, int size, u32 hash, void **prealloc) > stack->hash = hash; > stack->size = size; > /* stack->handle is already filled in by depot_init_pool. */ > + refcount_set(&stack->count, 1); > memcpy(stack->entries, entries, flex_array_size(stack, entries, size)); > > /* > @@ -452,6 +455,7 @@ depot_stack_handle_t __stack_depot_save(unsigned long *entries, > /* Fast path: look the stack trace up without full locking. */ > found = find_stack(*bucket, entries, nr_entries, hash); > if (found) { > + refcount_inc(&found->count); If someone doesn't use stack_depot_evict(), and the refcount eventually overflows, it'll do a WARN (per refcount_warn_saturate()). I think the interface needs to be different: stack_depot_get(): increments refcount (could be inline if just wrapper around refcount_inc()) stack_depot_put(): what stack_depot_evict() currently does Then it's clear that if someone uses either stack_depot_get() or _put() that these need to be balanced. Not using either will result in the old behaviour of never evicting an entry. > read_unlock_irqrestore(&pool_rwlock, flags); > goto exit; > } > -- > 2.25.1 >