Skip to content

Commit a579b05

Browse files
committed
mm/slub: move free_debug_processing() further
In the following patch, the function free_debug_processing() will be calling add_partial(), remove_partial() and discard_slab(), se move it below their definitions to avoid forward declarations. To make review easier, separate the move from functional changes. Signed-off-by: Vlastimil Babka <vbabka@suse.cz> Reviewed-by: Hyeonggon Yoo <42.hyeyoo@gmail.com> Acked-by: David Rientjes <rientjes@google.com>
1 parent 1c23f9e commit a579b05

File tree

1 file changed

+57
-57
lines changed

1 file changed

+57
-57
lines changed

mm/slub.c

Lines changed: 57 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1385,63 +1385,6 @@ static inline int free_consistency_checks(struct kmem_cache *s,
13851385
return 1;
13861386
}
13871387

1388-
/* Supports checking bulk free of a constructed freelist */
1389-
static noinline int free_debug_processing(
1390-
struct kmem_cache *s, struct slab *slab,
1391-
void *head, void *tail, int bulk_cnt,
1392-
unsigned long addr)
1393-
{
1394-
struct kmem_cache_node *n = get_node(s, slab_nid(slab));
1395-
void *object = head;
1396-
int cnt = 0;
1397-
unsigned long flags, flags2;
1398-
int ret = 0;
1399-
depot_stack_handle_t handle = 0;
1400-
1401-
if (s->flags & SLAB_STORE_USER)
1402-
handle = set_track_prepare();
1403-
1404-
spin_lock_irqsave(&n->list_lock, flags);
1405-
slab_lock(slab, &flags2);
1406-
1407-
if (s->flags & SLAB_CONSISTENCY_CHECKS) {
1408-
if (!check_slab(s, slab))
1409-
goto out;
1410-
}
1411-
1412-
next_object:
1413-
cnt++;
1414-
1415-
if (s->flags & SLAB_CONSISTENCY_CHECKS) {
1416-
if (!free_consistency_checks(s, slab, object, addr))
1417-
goto out;
1418-
}
1419-
1420-
if (s->flags & SLAB_STORE_USER)
1421-
set_track_update(s, object, TRACK_FREE, addr, handle);
1422-
trace(s, slab, object, 0);
1423-
/* Freepointer not overwritten by init_object(), SLAB_POISON moved it */
1424-
init_object(s, object, SLUB_RED_INACTIVE);
1425-
1426-
/* Reached end of constructed freelist yet? */
1427-
if (object != tail) {
1428-
object = get_freepointer(s, object);
1429-
goto next_object;
1430-
}
1431-
ret = 1;
1432-
1433-
out:
1434-
if (cnt != bulk_cnt)
1435-
slab_err(s, slab, "Bulk freelist count(%d) invalid(%d)\n",
1436-
bulk_cnt, cnt);
1437-
1438-
slab_unlock(slab, &flags2);
1439-
spin_unlock_irqrestore(&n->list_lock, flags);
1440-
if (!ret)
1441-
slab_fix(s, "Object at 0x%p not freed", object);
1442-
return ret;
1443-
}
1444-
14451388
/*
14461389
* Parse a block of slub_debug options. Blocks are delimited by ';'
14471390
*
@@ -2788,6 +2731,63 @@ static inline unsigned long node_nr_objs(struct kmem_cache_node *n)
27882731
{
27892732
return atomic_long_read(&n->total_objects);
27902733
}
2734+
2735+
/* Supports checking bulk free of a constructed freelist */
2736+
static noinline int free_debug_processing(
2737+
struct kmem_cache *s, struct slab *slab,
2738+
void *head, void *tail, int bulk_cnt,
2739+
unsigned long addr)
2740+
{
2741+
struct kmem_cache_node *n = get_node(s, slab_nid(slab));
2742+
void *object = head;
2743+
int cnt = 0;
2744+
unsigned long flags, flags2;
2745+
int ret = 0;
2746+
depot_stack_handle_t handle = 0;
2747+
2748+
if (s->flags & SLAB_STORE_USER)
2749+
handle = set_track_prepare();
2750+
2751+
spin_lock_irqsave(&n->list_lock, flags);
2752+
slab_lock(slab, &flags2);
2753+
2754+
if (s->flags & SLAB_CONSISTENCY_CHECKS) {
2755+
if (!check_slab(s, slab))
2756+
goto out;
2757+
}
2758+
2759+
next_object:
2760+
cnt++;
2761+
2762+
if (s->flags & SLAB_CONSISTENCY_CHECKS) {
2763+
if (!free_consistency_checks(s, slab, object, addr))
2764+
goto out;
2765+
}
2766+
2767+
if (s->flags & SLAB_STORE_USER)
2768+
set_track_update(s, object, TRACK_FREE, addr, handle);
2769+
trace(s, slab, object, 0);
2770+
/* Freepointer not overwritten by init_object(), SLAB_POISON moved it */
2771+
init_object(s, object, SLUB_RED_INACTIVE);
2772+
2773+
/* Reached end of constructed freelist yet? */
2774+
if (object != tail) {
2775+
object = get_freepointer(s, object);
2776+
goto next_object;
2777+
}
2778+
ret = 1;
2779+
2780+
out:
2781+
if (cnt != bulk_cnt)
2782+
slab_err(s, slab, "Bulk freelist count(%d) invalid(%d)\n",
2783+
bulk_cnt, cnt);
2784+
2785+
slab_unlock(slab, &flags2);
2786+
spin_unlock_irqrestore(&n->list_lock, flags);
2787+
if (!ret)
2788+
slab_fix(s, "Object at 0x%p not freed", object);
2789+
return ret;
2790+
}
27912791
#endif /* CONFIG_SLUB_DEBUG */
27922792

27932793
#if defined(CONFIG_SLUB_DEBUG) || defined(CONFIG_SYSFS)

0 commit comments

Comments
 (0)