On Thu, 21 Dec 2023 at 19:35, <andrey.konovalov@xxxxxxxxx> wrote: > > From: Andrey Konovalov <andreyknvl@xxxxxxxxxx> > > Avoid duplicating code for saving extra info into tracks: reuse the > common function for this. > > Fixes: 5d4c6ac94694 ("kasan: record and report more information") Looking at this patch and the previous ones, is this Fixes really needed? I.e. was the previous patch broken? > Signed-off-by: Andrey Konovalov <andreyknvl@xxxxxxxxxx> Reviewed-by: Marco Elver <elver@xxxxxxxxxx> > --- > mm/kasan/common.c | 12 ++++++++++-- > mm/kasan/generic.c | 4 ++-- > mm/kasan/kasan.h | 3 ++- > mm/kasan/tags.c | 17 +---------------- > 4 files changed, 15 insertions(+), 21 deletions(-) > > diff --git a/mm/kasan/common.c b/mm/kasan/common.c > index fe6c4b43ad9f..d004a0f4406c 100644 > --- a/mm/kasan/common.c > +++ b/mm/kasan/common.c > @@ -48,7 +48,7 @@ depot_stack_handle_t kasan_save_stack(gfp_t flags, depot_flags_t depot_flags) > return stack_depot_save_flags(entries, nr_entries, flags, depot_flags); > } > > -void kasan_set_track(struct kasan_track *track, gfp_t flags) > +void kasan_set_track(struct kasan_track *track, depot_stack_handle_t stack) > { > #ifdef CONFIG_KASAN_EXTRA_INFO > u32 cpu = raw_smp_processor_id(); > @@ -58,8 +58,16 @@ void kasan_set_track(struct kasan_track *track, gfp_t flags) > track->timestamp = ts_nsec >> 3; > #endif /* CONFIG_KASAN_EXTRA_INFO */ > track->pid = current->pid; > - track->stack = kasan_save_stack(flags, > + track->stack = stack; > +} > + > +void kasan_save_track(struct kasan_track *track, gfp_t flags) > +{ > + depot_stack_handle_t stack; > + > + stack = kasan_save_stack(flags, > STACK_DEPOT_FLAG_CAN_ALLOC | STACK_DEPOT_FLAG_GET); > + kasan_set_track(track, stack); > } > > #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS) > diff --git a/mm/kasan/generic.c b/mm/kasan/generic.c > index 769e43e05d0b..11b575707b05 100644 > --- a/mm/kasan/generic.c > +++ b/mm/kasan/generic.c > @@ -553,7 +553,7 @@ void kasan_save_alloc_info(struct kmem_cache *cache, void *object, gfp_t flags) > stack_depot_put(alloc_meta->aux_stack[1]); > __memset(alloc_meta, 0, sizeof(*alloc_meta)); > > - kasan_set_track(&alloc_meta->alloc_track, flags); > + kasan_save_track(&alloc_meta->alloc_track, flags); > } > > void kasan_save_free_info(struct kmem_cache *cache, void *object) > @@ -564,7 +564,7 @@ void kasan_save_free_info(struct kmem_cache *cache, void *object) > if (!free_meta) > return; > > - kasan_set_track(&free_meta->free_track, 0); > + kasan_save_track(&free_meta->free_track, 0); > /* The object was freed and has free track set. */ > *(u8 *)kasan_mem_to_shadow(object) = KASAN_SLAB_FREETRACK; > } > diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h > index 9072ce4c1263..31fb6bb26fed 100644 > --- a/mm/kasan/kasan.h > +++ b/mm/kasan/kasan.h > @@ -372,7 +372,8 @@ static inline void kasan_init_object_meta(struct kmem_cache *cache, const void * > #endif > > depot_stack_handle_t kasan_save_stack(gfp_t flags, depot_flags_t depot_flags); > -void kasan_set_track(struct kasan_track *track, gfp_t flags); > +void kasan_set_track(struct kasan_track *track, depot_stack_handle_t stack); > +void kasan_save_track(struct kasan_track *track, gfp_t flags); > void kasan_save_alloc_info(struct kmem_cache *cache, void *object, gfp_t flags); > void kasan_save_free_info(struct kmem_cache *cache, void *object); > > diff --git a/mm/kasan/tags.c b/mm/kasan/tags.c > index c4d14dbf27c0..d65d48b85f90 100644 > --- a/mm/kasan/tags.c > +++ b/mm/kasan/tags.c > @@ -94,17 +94,6 @@ void __init kasan_init_tags(void) > } > } > > -#ifdef CONFIG_KASAN_EXTRA_INFO > -static void save_extra_info(struct kasan_stack_ring_entry *entry) > -{ > - u32 cpu = raw_smp_processor_id(); > - u64 ts_nsec = local_clock(); > - > - entry->track.cpu = cpu; > - entry->track.timestamp = ts_nsec >> 3; > -} > -#endif /* CONFIG_KASAN_EXTRA_INFO */ > - > static void save_stack_info(struct kmem_cache *cache, void *object, > gfp_t gfp_flags, bool is_free) > { > @@ -137,11 +126,7 @@ static void save_stack_info(struct kmem_cache *cache, void *object, > old_stack = entry->track.stack; > > entry->size = cache->object_size; > - entry->track.pid = current->pid; > - entry->track.stack = stack; > -#ifdef CONFIG_KASAN_EXTRA_INFO > - save_extra_info(entry); > -#endif /* CONFIG_KASAN_EXTRA_INFO */ > + kasan_set_track(&entry->track, stack); > entry->is_free = is_free; > > entry->ptr = object; > -- > 2.25.1 >