@@ -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