Message ID | 6e2367e7693aa107f05c649abe06180fff847bb4.1694625260.git.andreyknvl@google.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | stackdepot: allow evicting stack traces | expand |
On Wed, Sep 13, 2023 at 7:18 PM <andrey.konovalov@linux.dev> wrote: > > From: Andrey Konovalov <andreyknvl@google.com> > > Make tag-based KASAN modes to evict stack traces from the stack depot "Make tag-based KASAN modes evict stack traces from the stack depot" (without "to") > Internally, pass STACK_DEPOT_FLAG_GET to stack_depot_save_flags (via > kasan_save_stack) to increment the refcount when saving a new entry > to stack ring and call stack_depot_put when removing an entry from > stack ring. > > Signed-off-by: Andrey Konovalov <andreyknvl@google.com> Reviewed-by: Alexander Potapenko <glider@google.com> (but see the two other comments) > --- a/mm/kasan/report_tags.c > +++ b/mm/kasan/report_tags.c > @@ -7,6 +7,7 @@ > #include <linux/atomic.h> > > #include "kasan.h" > +#include "../slab.h" Why?
On Mon, Oct 9, 2023 at 2:24 PM Alexander Potapenko <glider@google.com> wrote: > > On Wed, Sep 13, 2023 at 7:18 PM <andrey.konovalov@linux.dev> wrote: > > > > From: Andrey Konovalov <andreyknvl@google.com> > > > > Make tag-based KASAN modes to evict stack traces from the stack depot > "Make tag-based KASAN modes evict stack traces from the stack depot" > (without "to") > > > Internally, pass STACK_DEPOT_FLAG_GET to stack_depot_save_flags (via > > kasan_save_stack) to increment the refcount when saving a new entry > > to stack ring and call stack_depot_put when removing an entry from > > stack ring. > > > > Signed-off-by: Andrey Konovalov <andreyknvl@google.com> > Reviewed-by: Alexander Potapenko <glider@google.com> > > (but see the two other comments) > > > --- a/mm/kasan/report_tags.c > > +++ b/mm/kasan/report_tags.c > > @@ -7,6 +7,7 @@ > > #include <linux/atomic.h> > > > > #include "kasan.h" > > +#include "../slab.h" > > Why? This belongs to the previous patch, will fix in v3, thanks!
diff --git a/mm/kasan/report_tags.c b/mm/kasan/report_tags.c index 98c238ba3545..55154743f915 100644 --- a/mm/kasan/report_tags.c +++ b/mm/kasan/report_tags.c @@ -7,6 +7,7 @@ #include <linux/atomic.h> #include "kasan.h" +#include "../slab.h" extern struct kasan_stack_ring stack_ring; diff --git a/mm/kasan/tags.c b/mm/kasan/tags.c index b6c017e670d8..739ae997463d 100644 --- a/mm/kasan/tags.c +++ b/mm/kasan/tags.c @@ -97,12 +97,13 @@ static void save_stack_info(struct kmem_cache *cache, void *object, gfp_t gfp_flags, bool is_free) { unsigned long flags; - depot_stack_handle_t stack; + depot_stack_handle_t stack, old_stack; u64 pos; struct kasan_stack_ring_entry *entry; void *old_ptr; - stack = kasan_save_stack(gfp_flags, STACK_DEPOT_FLAG_CAN_ALLOC); + stack = kasan_save_stack(gfp_flags, + STACK_DEPOT_FLAG_CAN_ALLOC | STACK_DEPOT_FLAG_GET); /* * Prevent save_stack_info() from modifying stack ring @@ -121,6 +122,8 @@ static void save_stack_info(struct kmem_cache *cache, void *object, if (!try_cmpxchg(&entry->ptr, &old_ptr, STACK_RING_BUSY_PTR)) goto next; /* Busy slot. */ + old_stack = entry->stack; + entry->size = cache->object_size; entry->pid = current->pid; entry->stack = stack; @@ -129,6 +132,9 @@ static void save_stack_info(struct kmem_cache *cache, void *object, entry->ptr = object; read_unlock_irqrestore(&stack_ring.lock, flags); + + if (old_stack) + stack_depot_put(old_stack); } void kasan_save_alloc_info(struct kmem_cache *cache, void *object, gfp_t flags)