@@ -3112,13 +3112,16 @@ ftrace_allocate_pages(unsigned long num_to_init)
3112
3112
struct ftrace_iterator {
3113
3113
loff_t pos ;
3114
3114
loff_t func_pos ;
3115
+ loff_t mod_pos ;
3115
3116
struct ftrace_page * pg ;
3116
3117
struct dyn_ftrace * func ;
3117
3118
struct ftrace_func_probe * probe ;
3118
3119
struct ftrace_func_entry * probe_entry ;
3119
3120
struct trace_parser parser ;
3120
3121
struct ftrace_hash * hash ;
3121
3122
struct ftrace_ops * ops ;
3123
+ struct trace_array * tr ;
3124
+ struct list_head * mod_list ;
3122
3125
int pidx ;
3123
3126
int idx ;
3124
3127
unsigned flags ;
@@ -3203,13 +3206,13 @@ static void *t_probe_start(struct seq_file *m, loff_t *pos)
3203
3206
if (!(iter -> flags & FTRACE_ITER_DO_PROBES ))
3204
3207
return NULL ;
3205
3208
3206
- if (iter -> func_pos > * pos )
3209
+ if (iter -> mod_pos > * pos )
3207
3210
return NULL ;
3208
3211
3209
3212
iter -> probe = NULL ;
3210
3213
iter -> probe_entry = NULL ;
3211
3214
iter -> pidx = 0 ;
3212
- for (l = 0 ; l <= (* pos - iter -> func_pos ); ) {
3215
+ for (l = 0 ; l <= (* pos - iter -> mod_pos ); ) {
3213
3216
p = t_probe_next (m , & l );
3214
3217
if (!p )
3215
3218
break ;
@@ -3247,6 +3250,82 @@ t_probe_show(struct seq_file *m, struct ftrace_iterator *iter)
3247
3250
return 0 ;
3248
3251
}
3249
3252
3253
+ static void *
3254
+ t_mod_next (struct seq_file * m , loff_t * pos )
3255
+ {
3256
+ struct ftrace_iterator * iter = m -> private ;
3257
+ struct trace_array * tr = iter -> tr ;
3258
+
3259
+ (* pos )++ ;
3260
+ iter -> pos = * pos ;
3261
+
3262
+ iter -> mod_list = iter -> mod_list -> next ;
3263
+
3264
+ if (iter -> mod_list == & tr -> mod_trace ||
3265
+ iter -> mod_list == & tr -> mod_notrace ) {
3266
+ iter -> flags &= ~FTRACE_ITER_MOD ;
3267
+ return NULL ;
3268
+ }
3269
+
3270
+ iter -> mod_pos = * pos ;
3271
+
3272
+ return iter ;
3273
+ }
3274
+
3275
+ static void * t_mod_start (struct seq_file * m , loff_t * pos )
3276
+ {
3277
+ struct ftrace_iterator * iter = m -> private ;
3278
+ void * p = NULL ;
3279
+ loff_t l ;
3280
+
3281
+ if (iter -> func_pos > * pos )
3282
+ return NULL ;
3283
+
3284
+ iter -> mod_pos = iter -> func_pos ;
3285
+
3286
+ /* probes are only available if tr is set */
3287
+ if (!iter -> tr )
3288
+ return NULL ;
3289
+
3290
+ for (l = 0 ; l <= (* pos - iter -> func_pos ); ) {
3291
+ p = t_mod_next (m , & l );
3292
+ if (!p )
3293
+ break ;
3294
+ }
3295
+ if (!p ) {
3296
+ iter -> flags &= ~FTRACE_ITER_MOD ;
3297
+ return t_probe_start (m , pos );
3298
+ }
3299
+
3300
+ /* Only set this if we have an item */
3301
+ iter -> flags |= FTRACE_ITER_MOD ;
3302
+
3303
+ return iter ;
3304
+ }
3305
+
3306
+ static int
3307
+ t_mod_show (struct seq_file * m , struct ftrace_iterator * iter )
3308
+ {
3309
+ struct ftrace_mod_load * ftrace_mod ;
3310
+ struct trace_array * tr = iter -> tr ;
3311
+
3312
+ if (WARN_ON_ONCE (!iter -> mod_list ) ||
3313
+ iter -> mod_list == & tr -> mod_trace ||
3314
+ iter -> mod_list == & tr -> mod_notrace )
3315
+ return - EIO ;
3316
+
3317
+ ftrace_mod = list_entry (iter -> mod_list , struct ftrace_mod_load , list );
3318
+
3319
+ if (ftrace_mod -> func )
3320
+ seq_printf (m , "%s" , ftrace_mod -> func );
3321
+ else
3322
+ seq_putc (m , '*' );
3323
+
3324
+ seq_printf (m , ":mod:%s\n" , ftrace_mod -> module );
3325
+
3326
+ return 0 ;
3327
+ }
3328
+
3250
3329
static void *
3251
3330
t_func_next (struct seq_file * m , loff_t * pos )
3252
3331
{
@@ -3288,7 +3367,7 @@ static void *
3288
3367
t_next (struct seq_file * m , void * v , loff_t * pos )
3289
3368
{
3290
3369
struct ftrace_iterator * iter = m -> private ;
3291
- loff_t l = * pos ; /* t_hash_start () must use original pos */
3370
+ loff_t l = * pos ; /* t_probe_start () must use original pos */
3292
3371
void * ret ;
3293
3372
3294
3373
if (unlikely (ftrace_disabled ))
@@ -3297,16 +3376,19 @@ t_next(struct seq_file *m, void *v, loff_t *pos)
3297
3376
if (iter -> flags & FTRACE_ITER_PROBE )
3298
3377
return t_probe_next (m , pos );
3299
3378
3379
+ if (iter -> flags & FTRACE_ITER_MOD )
3380
+ return t_mod_next (m , pos );
3381
+
3300
3382
if (iter -> flags & FTRACE_ITER_PRINTALL ) {
3301
3383
/* next must increment pos, and t_probe_start does not */
3302
3384
(* pos )++ ;
3303
- return t_probe_start (m , & l );
3385
+ return t_mod_start (m , & l );
3304
3386
}
3305
3387
3306
3388
ret = t_func_next (m , pos );
3307
3389
3308
3390
if (!ret )
3309
- return t_probe_start (m , & l );
3391
+ return t_mod_start (m , & l );
3310
3392
3311
3393
return ret ;
3312
3394
}
@@ -3315,7 +3397,7 @@ static void reset_iter_read(struct ftrace_iterator *iter)
3315
3397
{
3316
3398
iter -> pos = 0 ;
3317
3399
iter -> func_pos = 0 ;
3318
- iter -> flags &= ~(FTRACE_ITER_PRINTALL | FTRACE_ITER_PROBE );
3400
+ iter -> flags &= ~(FTRACE_ITER_PRINTALL | FTRACE_ITER_PROBE | FTRACE_ITER_MOD );
3319
3401
}
3320
3402
3321
3403
static void * t_start (struct seq_file * m , loff_t * pos )
@@ -3344,15 +3426,15 @@ static void *t_start(struct seq_file *m, loff_t *pos)
3344
3426
ftrace_hash_empty (iter -> hash )) {
3345
3427
iter -> func_pos = 1 ; /* Account for the message */
3346
3428
if (* pos > 0 )
3347
- return t_probe_start (m , pos );
3429
+ return t_mod_start (m , pos );
3348
3430
iter -> flags |= FTRACE_ITER_PRINTALL ;
3349
3431
/* reset in case of seek/pread */
3350
3432
iter -> flags &= ~FTRACE_ITER_PROBE ;
3351
3433
return iter ;
3352
3434
}
3353
3435
3354
- if (iter -> flags & FTRACE_ITER_PROBE )
3355
- return t_probe_start (m , pos );
3436
+ if (iter -> flags & FTRACE_ITER_MOD )
3437
+ return t_mod_start (m , pos );
3356
3438
3357
3439
/*
3358
3440
* Unfortunately, we need to restart at ftrace_pages_start
@@ -3368,7 +3450,7 @@ static void *t_start(struct seq_file *m, loff_t *pos)
3368
3450
}
3369
3451
3370
3452
if (!p )
3371
- return t_probe_start (m , pos );
3453
+ return t_mod_start (m , pos );
3372
3454
3373
3455
return iter ;
3374
3456
}
@@ -3402,6 +3484,9 @@ static int t_show(struct seq_file *m, void *v)
3402
3484
if (iter -> flags & FTRACE_ITER_PROBE )
3403
3485
return t_probe_show (m , iter );
3404
3486
3487
+ if (iter -> flags & FTRACE_ITER_MOD )
3488
+ return t_mod_show (m , iter );
3489
+
3405
3490
if (iter -> flags & FTRACE_ITER_PRINTALL ) {
3406
3491
if (iter -> flags & FTRACE_ITER_NOTRACE )
3407
3492
seq_puts (m , "#### no functions disabled ####\n" );
@@ -3528,17 +3613,20 @@ ftrace_regex_open(struct ftrace_ops *ops, int flag,
3528
3613
3529
3614
iter -> ops = ops ;
3530
3615
iter -> flags = flag ;
3616
+ iter -> tr = tr ;
3531
3617
3532
3618
mutex_lock (& ops -> func_hash -> regex_lock );
3533
3619
3534
3620
if (flag & FTRACE_ITER_NOTRACE ) {
3535
3621
hash = ops -> func_hash -> notrace_hash ;
3536
- mod_head = tr ? & tr -> mod_trace : NULL ;
3622
+ mod_head = tr ? & tr -> mod_notrace : NULL ;
3537
3623
} else {
3538
3624
hash = ops -> func_hash -> filter_hash ;
3539
- mod_head = tr ? & tr -> mod_notrace : NULL ;
3625
+ mod_head = tr ? & tr -> mod_trace : NULL ;
3540
3626
}
3541
3627
3628
+ iter -> mod_list = mod_head ;
3629
+
3542
3630
if (file -> f_mode & FMODE_WRITE ) {
3543
3631
const int size_bits = FTRACE_HASH_DEFAULT_BITS ;
3544
3632
0 commit comments