Message ID | 20231221183540.168428-3-andrey.konovalov@linux.dev (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [mm,1/4] kasan: clean up kasan_cache_create | expand |
On Thu, 21 Dec 2023 at 19:35, <andrey.konovalov@linux.dev> wrote: > > From: Andrey Konovalov <andreyknvl@google.com> > > 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@google.com> Reviewed-by: Marco Elver <elver@google.com> > --- > 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 >
On Thu, Dec 21, 2023 at 9:12 PM Marco Elver <elver@google.com> wrote: > > On Thu, 21 Dec 2023 at 19:35, <andrey.konovalov@linux.dev> wrote: > > > > From: Andrey Konovalov <andreyknvl@google.com> > > > > 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? Yeah, maybe it's not needed in these 3 patches. The original patch works, these are just clean-ups.
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;