static unsigned long object_map[BITS_TO_LONGS(MAX_OBJS_PER_PAGE)];
 static DEFINE_SPINLOCK(object_map_lock);
 
+static void __fill_map(unsigned long *obj_map, struct kmem_cache *s,
+                      struct page *page)
+{
+       void *addr = page_address(page);
+       void *p;
+
+       bitmap_zero(obj_map, page->objects);
+
+       for (p = page->freelist; p; p = get_freepointer(s, p))
+               set_bit(__obj_to_index(s, addr, p), obj_map);
+}
+
 #if IS_ENABLED(CONFIG_KUNIT)
 static bool slab_add_kunit_errors(void)
 {
 static unsigned long *get_map(struct kmem_cache *s, struct page *page)
        __acquires(&object_map_lock)
 {
-       void *p;
-       void *addr = page_address(page);
-
        VM_BUG_ON(!irqs_disabled());
 
        spin_lock(&object_map_lock);
 
-       bitmap_zero(object_map, page->objects);
-
-       for (p = page->freelist; p; p = get_freepointer(s, p))
-               set_bit(__obj_to_index(s, addr, p), object_map);
+       __fill_map(object_map, s, page);
 
        return object_map;
 }
 }
 
 static void process_slab(struct loc_track *t, struct kmem_cache *s,
-               struct page *page, enum track_item alloc)
+               struct page *page, enum track_item alloc,
+               unsigned long *obj_map)
 {
        void *addr = page_address(page);
        void *p;
-       unsigned long *map;
 
-       map = get_map(s, page);
+       __fill_map(obj_map, s, page);
+
        for_each_object(p, s, addr, page->objects)
-               if (!test_bit(__obj_to_index(s, addr, p), map))
+               if (!test_bit(__obj_to_index(s, addr, p), obj_map))
                        add_location(t, s, get_track(s, p, alloc));
-       put_map(map);
 }
 #endif  /* CONFIG_DEBUG_FS   */
 #endif /* CONFIG_SLUB_DEBUG */
        struct loc_track *t = __seq_open_private(filep, &slab_debugfs_sops,
                                                sizeof(struct loc_track));
        struct kmem_cache *s = file_inode(filep)->i_private;
+       unsigned long *obj_map;
+
+       obj_map = bitmap_alloc(oo_objects(s->oo), GFP_KERNEL);
+       if (!obj_map)
+               return -ENOMEM;
 
        if (strcmp(filep->f_path.dentry->d_name.name, "alloc_traces") == 0)
                alloc = TRACK_ALLOC;
        else
                alloc = TRACK_FREE;
 
-       if (!alloc_loc_track(t, PAGE_SIZE / sizeof(struct location), GFP_KERNEL))
+       if (!alloc_loc_track(t, PAGE_SIZE / sizeof(struct location), GFP_KERNEL)) {
+               bitmap_free(obj_map);
                return -ENOMEM;
+       }
 
        for_each_kmem_cache_node(s, node, n) {
                unsigned long flags;
 
                spin_lock_irqsave(&n->list_lock, flags);
                list_for_each_entry(page, &n->partial, slab_list)
-                       process_slab(t, s, page, alloc);
+                       process_slab(t, s, page, alloc, obj_map);
                list_for_each_entry(page, &n->full, slab_list)
-                       process_slab(t, s, page, alloc);
+                       process_slab(t, s, page, alloc, obj_map);
                spin_unlock_irqrestore(&n->list_lock, flags);
        }
 
+       bitmap_free(obj_map);
        return 0;
 }