On Tue, 2023-08-29 at 19:11 +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); > read_unlock_irqrestore(&pool_rwlock, flags); > goto exit; > } Hi Andrey, There are two find_stack() function calls in __stack_depot_save(). Maybe we need to add refcount_inc() for both two find_stack()? Thanks, Kuan-Ying Lee