This reverts commit b955aa70a3ac9f1dd5e26d4c7673ec3c28a8c2af. The function delete_object_part can use the return value of create_object to propagate flags from the old object to the new objects. Signed-off-by: George Prekas <george@xxxxxxxxxxxxx> --- mm/kmemleak.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/mm/kmemleak.c b/mm/kmemleak.c index b40735539abd..2b9c9ad68806 100644 --- a/mm/kmemleak.c +++ b/mm/kmemleak.c @@ -616,8 +616,9 @@ static noinline depot_stack_handle_t set_track_prepare(void) * memory block and add it to the object_list and object_tree_root (or * object_phys_tree_root). */ -static void __create_object(unsigned long ptr, size_t size, - int min_count, gfp_t gfp, bool is_phys) +static struct kmemleak_object *__create_object(unsigned long ptr, size_t size, + int min_count, gfp_t gfp, + bool is_phys) { unsigned long flags; struct kmemleak_object *object, *parent; @@ -629,7 +630,7 @@ static void __create_object(unsigned long ptr, size_t size, if (!object) { pr_warn("Cannot allocate a kmemleak_object structure\n"); kmemleak_disable(); - return; + return NULL; } INIT_LIST_HEAD(&object->object_list); @@ -698,6 +699,7 @@ static void __create_object(unsigned long ptr, size_t size, */ dump_object_info(parent); kmem_cache_free(object_cache, object); + object = NULL; goto out; } } @@ -707,20 +709,21 @@ static void __create_object(unsigned long ptr, size_t size, list_add_tail_rcu(&object->object_list, &object_list); out: raw_spin_unlock_irqrestore(&kmemleak_lock, flags); + return object; } /* Create kmemleak object which allocated with virtual address. */ -static void create_object(unsigned long ptr, size_t size, - int min_count, gfp_t gfp) +static struct kmemleak_object *create_object(unsigned long ptr, size_t size, + int min_count, gfp_t gfp) { - __create_object(ptr, size, min_count, gfp, false); + return __create_object(ptr, size, min_count, gfp, false); } /* Create kmemleak object which allocated with physical address. */ -static void create_object_phys(unsigned long ptr, size_t size, - int min_count, gfp_t gfp) +static struct kmemleak_object *create_object_phys(unsigned long ptr, size_t size, + int min_count, gfp_t gfp) { - __create_object(ptr, size, min_count, gfp, true); + return __create_object(ptr, size, min_count, gfp, true); } /* -- 2.37.1