26
26
#include <linux/cpuset.h>
27
27
#include <linux/mempolicy.h>
28
28
#include <linux/ctype.h>
29
- #include <linux/stackdepot.h>
30
29
#include <linux/debugobjects.h>
31
30
#include <linux/kallsyms.h>
32
31
#include <linux/kfence.h>
@@ -207,8 +206,8 @@ static inline bool kmem_cache_has_cpu_partial(struct kmem_cache *s)
207
206
#define TRACK_ADDRS_COUNT 16
208
207
struct track {
209
208
unsigned long addr ; /* Called from address */
210
- #ifdef CONFIG_STACKDEPOT
211
- depot_stack_handle_t handle ;
209
+ #ifdef CONFIG_STACKTRACE
210
+ unsigned long addrs [ TRACK_ADDRS_COUNT ]; /* Called from address */
212
211
#endif
213
212
int cpu ; /* Was running on cpu */
214
213
int pid ; /* Pid context */
@@ -612,27 +611,22 @@ static struct track *get_track(struct kmem_cache *s, void *object,
612
611
return kasan_reset_tag (p + alloc );
613
612
}
614
613
615
- #ifdef CONFIG_STACKDEPOT
616
- static depot_stack_handle_t save_stack_depot_trace (gfp_t flags )
617
- {
618
- unsigned long entries [TRACK_ADDRS_COUNT ];
619
- depot_stack_handle_t handle ;
620
- unsigned int nr_entries ;
621
-
622
- nr_entries = stack_trace_save (entries , ARRAY_SIZE (entries ), 4 );
623
- handle = stack_depot_save (entries , nr_entries , flags );
624
- return handle ;
625
- }
626
- #endif
627
-
628
614
static void set_track (struct kmem_cache * s , void * object ,
629
615
enum track_item alloc , unsigned long addr )
630
616
{
631
617
struct track * p = get_track (s , object , alloc );
632
618
633
619
if (addr ) {
634
- #ifdef CONFIG_STACKDEPOT
635
- p -> handle = save_stack_depot_trace (GFP_NOWAIT );
620
+ #ifdef CONFIG_STACKTRACE
621
+ unsigned int nr_entries ;
622
+
623
+ metadata_access_enable ();
624
+ nr_entries = stack_trace_save (kasan_reset_tag (p -> addrs ),
625
+ TRACK_ADDRS_COUNT , 3 );
626
+ metadata_access_disable ();
627
+
628
+ if (nr_entries < TRACK_ADDRS_COUNT )
629
+ p -> addrs [nr_entries ] = 0 ;
636
630
#endif
637
631
p -> addr = addr ;
638
632
p -> cpu = smp_processor_id ();
@@ -659,19 +653,14 @@ static void print_track(const char *s, struct track *t, unsigned long pr_time)
659
653
660
654
pr_err ("%s in %pS age=%lu cpu=%u pid=%d\n" ,
661
655
s , (void * )t -> addr , pr_time - t -> when , t -> cpu , t -> pid );
662
- #ifdef CONFIG_STACKDEPOT
656
+ #ifdef CONFIG_STACKTRACE
663
657
{
664
- depot_stack_handle_t handle ;
665
- unsigned long * entries ;
666
- unsigned int nr_entries ;
667
-
668
- handle = READ_ONCE (t -> handle );
669
- if (!handle ) {
670
- pr_err ("object allocation/free stack trace missing\n" );
671
- } else {
672
- nr_entries = stack_depot_fetch (handle , & entries );
673
- stack_trace_print (entries , nr_entries , 0 );
674
- }
658
+ int i ;
659
+ for (i = 0 ; i < TRACK_ADDRS_COUNT ; i ++ )
660
+ if (t -> addrs [i ])
661
+ pr_err ("\t%pS\n" , (void * )t -> addrs [i ]);
662
+ else
663
+ break ;
675
664
}
676
665
#endif
677
666
}
@@ -4045,26 +4034,18 @@ void kmem_obj_info(struct kmem_obj_info *kpp, void *object, struct page *page)
4045
4034
objp = fixup_red_left (s , objp );
4046
4035
trackp = get_track (s , objp , TRACK_ALLOC );
4047
4036
kpp -> kp_ret = (void * )trackp -> addr ;
4048
- #ifdef CONFIG_STACKDEPOT
4049
- {
4050
- depot_stack_handle_t handle ;
4051
- unsigned long * entries ;
4052
- unsigned int nr_entries ;
4053
-
4054
- handle = READ_ONCE (trackp -> handle );
4055
- if (handle ) {
4056
- nr_entries = stack_depot_fetch (handle , & entries );
4057
- for (i = 0 ; i < KS_ADDRS_COUNT && i < nr_entries ; i ++ )
4058
- kpp -> kp_stack [i ] = (void * )entries [i ];
4059
- }
4037
+ #ifdef CONFIG_STACKTRACE
4038
+ for (i = 0 ; i < KS_ADDRS_COUNT && i < TRACK_ADDRS_COUNT ; i ++ ) {
4039
+ kpp -> kp_stack [i ] = (void * )trackp -> addrs [i ];
4040
+ if (!kpp -> kp_stack [i ])
4041
+ break ;
4042
+ }
4060
4043
4061
- trackp = get_track (s , objp , TRACK_FREE );
4062
- handle = READ_ONCE (trackp -> handle );
4063
- if (handle ) {
4064
- nr_entries = stack_depot_fetch (handle , & entries );
4065
- for (i = 0 ; i < KS_ADDRS_COUNT && i < nr_entries ; i ++ )
4066
- kpp -> kp_free_stack [i ] = (void * )entries [i ];
4067
- }
4044
+ trackp = get_track (s , objp , TRACK_FREE );
4045
+ for (i = 0 ; i < KS_ADDRS_COUNT && i < TRACK_ADDRS_COUNT ; i ++ ) {
4046
+ kpp -> kp_free_stack [i ] = (void * )trackp -> addrs [i ];
4047
+ if (!kpp -> kp_free_stack [i ])
4048
+ break ;
4068
4049
}
4069
4050
#endif
4070
4051
#endif
0 commit comments