mm/kasan: get rid of ->alloc_size in struct kasan_alloc_meta
authorAndrey Ryabinin <aryabinin@virtuozzo.com>
Tue, 2 Aug 2016 21:02:49 +0000 (14:02 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 2 Aug 2016 21:31:41 +0000 (17:31 -0400)
Size of slab object already stored in cache->object_size.

Note, that kmalloc() internally rounds up size of allocation, so
object_size may be not equal to alloc_size, but, usually we don't need
to know the exact size of allocated object.  In case if we need that
information, we still can figure it out from the report.  The dump of
shadow memory allows to identify the end of allocated memory, and
thereby the exact allocation size.

Link: http://lkml.kernel.org/r/1470062715-14077-4-git-send-email-aryabinin@virtuozzo.com
Signed-off-by: Andrey Ryabinin <aryabinin@virtuozzo.com>
Cc: Alexander Potapenko <glider@google.com>
Cc: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/kasan/kasan.c
mm/kasan/kasan.h
mm/kasan/report.c

index c99ef40ebdfa4cb6d56fef9e1d740a8c49da9dce..388e812ccaca3ceccfbfa31eb9fe92c95407535d 100644 (file)
@@ -584,7 +584,6 @@ void kasan_kmalloc(struct kmem_cache *cache, const void *object, size_t size,
                        get_alloc_info(cache, object);
 
                alloc_info->state = KASAN_STATE_ALLOC;
-               alloc_info->alloc_size = size;
                set_track(&alloc_info->track, flags);
        }
 }
index 31972cdba433a97f114147ecf2a823ac91cdc5bc..aa175460c8f9f3e1e5a34f0d0b8868222172d6d7 100644 (file)
@@ -75,8 +75,7 @@ struct kasan_track {
 
 struct kasan_alloc_meta {
        struct kasan_track track;
-       u32 state : 2;  /* enum kasan_state */
-       u32 alloc_size : 30;
+       u32 state;
 };
 
 struct qlist_node {
index 861b9776841a94ee69f485fa91e13cdeebc0d8be..d67a7e020905e0cac4629de5258d9d3081695dba 100644 (file)
@@ -136,7 +136,9 @@ static void kasan_object_err(struct kmem_cache *cache, struct page *page,
        struct kasan_free_meta *free_info;
 
        dump_stack();
-       pr_err("Object at %p, in cache %s\n", object, cache->name);
+       pr_err("Object at %p, in cache %s size: %d\n", object, cache->name,
+               cache->object_size);
+
        if (!(cache->flags & SLAB_KASAN))
                return;
        switch (alloc_info->state) {
@@ -144,15 +146,11 @@ static void kasan_object_err(struct kmem_cache *cache, struct page *page,
                pr_err("Object not allocated yet\n");
                break;
        case KASAN_STATE_ALLOC:
-               pr_err("Object allocated with size %u bytes.\n",
-                      alloc_info->alloc_size);
                pr_err("Allocation:\n");
                print_track(&alloc_info->track);
                break;
        case KASAN_STATE_FREE:
        case KASAN_STATE_QUARANTINE:
-               pr_err("Object freed, allocated with size %u bytes\n",
-                      alloc_info->alloc_size);
                free_info = get_free_info(cache, object);
                pr_err("Allocation:\n");
                print_track(&alloc_info->track);