0001
0002 #undef TRACE_SYSTEM
0003 #define TRACE_SYSTEM rcu
0004
0005 #if !defined(_TRACE_RCU_H) || defined(TRACE_HEADER_MULTI_READ)
0006 #define _TRACE_RCU_H
0007
0008 #include <linux/tracepoint.h>
0009
0010 #ifdef CONFIG_RCU_TRACE
0011 #define TRACE_EVENT_RCU TRACE_EVENT
0012 #else
0013 #define TRACE_EVENT_RCU TRACE_EVENT_NOP
0014 #endif
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 TRACE_EVENT(rcu_utilization,
0028
0029 TP_PROTO(const char *s),
0030
0031 TP_ARGS(s),
0032
0033 TP_STRUCT__entry(
0034 __field(const char *, s)
0035 ),
0036
0037 TP_fast_assign(
0038 __entry->s = s;
0039 ),
0040
0041 TP_printk("%s", __entry->s)
0042 );
0043
0044 #if defined(CONFIG_TREE_RCU)
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069 TRACE_EVENT_RCU(rcu_grace_period,
0070
0071 TP_PROTO(const char *rcuname, unsigned long gp_seq, const char *gpevent),
0072
0073 TP_ARGS(rcuname, gp_seq, gpevent),
0074
0075 TP_STRUCT__entry(
0076 __field(const char *, rcuname)
0077 __field(long, gp_seq)
0078 __field(const char *, gpevent)
0079 ),
0080
0081 TP_fast_assign(
0082 __entry->rcuname = rcuname;
0083 __entry->gp_seq = (long)gp_seq;
0084 __entry->gpevent = gpevent;
0085 ),
0086
0087 TP_printk("%s %ld %s",
0088 __entry->rcuname, __entry->gp_seq, __entry->gpevent)
0089 );
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 TRACE_EVENT_RCU(rcu_future_grace_period,
0108
0109 TP_PROTO(const char *rcuname, unsigned long gp_seq,
0110 unsigned long gp_seq_req, u8 level, int grplo, int grphi,
0111 const char *gpevent),
0112
0113 TP_ARGS(rcuname, gp_seq, gp_seq_req, level, grplo, grphi, gpevent),
0114
0115 TP_STRUCT__entry(
0116 __field(const char *, rcuname)
0117 __field(long, gp_seq)
0118 __field(long, gp_seq_req)
0119 __field(u8, level)
0120 __field(int, grplo)
0121 __field(int, grphi)
0122 __field(const char *, gpevent)
0123 ),
0124
0125 TP_fast_assign(
0126 __entry->rcuname = rcuname;
0127 __entry->gp_seq = (long)gp_seq;
0128 __entry->gp_seq_req = (long)gp_seq_req;
0129 __entry->level = level;
0130 __entry->grplo = grplo;
0131 __entry->grphi = grphi;
0132 __entry->gpevent = gpevent;
0133 ),
0134
0135 TP_printk("%s %ld %ld %u %d %d %s",
0136 __entry->rcuname, (long)__entry->gp_seq, (long)__entry->gp_seq_req, __entry->level,
0137 __entry->grplo, __entry->grphi, __entry->gpevent)
0138 );
0139
0140
0141
0142
0143
0144
0145
0146
0147 TRACE_EVENT_RCU(rcu_grace_period_init,
0148
0149 TP_PROTO(const char *rcuname, unsigned long gp_seq, u8 level,
0150 int grplo, int grphi, unsigned long qsmask),
0151
0152 TP_ARGS(rcuname, gp_seq, level, grplo, grphi, qsmask),
0153
0154 TP_STRUCT__entry(
0155 __field(const char *, rcuname)
0156 __field(long, gp_seq)
0157 __field(u8, level)
0158 __field(int, grplo)
0159 __field(int, grphi)
0160 __field(unsigned long, qsmask)
0161 ),
0162
0163 TP_fast_assign(
0164 __entry->rcuname = rcuname;
0165 __entry->gp_seq = (long)gp_seq;
0166 __entry->level = level;
0167 __entry->grplo = grplo;
0168 __entry->grphi = grphi;
0169 __entry->qsmask = qsmask;
0170 ),
0171
0172 TP_printk("%s %ld %u %d %d %lx",
0173 __entry->rcuname, __entry->gp_seq, __entry->level,
0174 __entry->grplo, __entry->grphi, __entry->qsmask)
0175 );
0176
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192 TRACE_EVENT_RCU(rcu_exp_grace_period,
0193
0194 TP_PROTO(const char *rcuname, unsigned long gpseq, const char *gpevent),
0195
0196 TP_ARGS(rcuname, gpseq, gpevent),
0197
0198 TP_STRUCT__entry(
0199 __field(const char *, rcuname)
0200 __field(long, gpseq)
0201 __field(const char *, gpevent)
0202 ),
0203
0204 TP_fast_assign(
0205 __entry->rcuname = rcuname;
0206 __entry->gpseq = (long)gpseq;
0207 __entry->gpevent = gpevent;
0208 ),
0209
0210 TP_printk("%s %ld %s",
0211 __entry->rcuname, __entry->gpseq, __entry->gpevent)
0212 );
0213
0214
0215
0216
0217
0218
0219
0220
0221
0222
0223
0224 TRACE_EVENT_RCU(rcu_exp_funnel_lock,
0225
0226 TP_PROTO(const char *rcuname, u8 level, int grplo, int grphi,
0227 const char *gpevent),
0228
0229 TP_ARGS(rcuname, level, grplo, grphi, gpevent),
0230
0231 TP_STRUCT__entry(
0232 __field(const char *, rcuname)
0233 __field(u8, level)
0234 __field(int, grplo)
0235 __field(int, grphi)
0236 __field(const char *, gpevent)
0237 ),
0238
0239 TP_fast_assign(
0240 __entry->rcuname = rcuname;
0241 __entry->level = level;
0242 __entry->grplo = grplo;
0243 __entry->grphi = grphi;
0244 __entry->gpevent = gpevent;
0245 ),
0246
0247 TP_printk("%s %d %d %d %s",
0248 __entry->rcuname, __entry->level, __entry->grplo,
0249 __entry->grphi, __entry->gpevent)
0250 );
0251
0252 #ifdef CONFIG_RCU_NOCB_CPU
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280
0281
0282
0283
0284 TRACE_EVENT_RCU(rcu_nocb_wake,
0285
0286 TP_PROTO(const char *rcuname, int cpu, const char *reason),
0287
0288 TP_ARGS(rcuname, cpu, reason),
0289
0290 TP_STRUCT__entry(
0291 __field(const char *, rcuname)
0292 __field(int, cpu)
0293 __field(const char *, reason)
0294 ),
0295
0296 TP_fast_assign(
0297 __entry->rcuname = rcuname;
0298 __entry->cpu = cpu;
0299 __entry->reason = reason;
0300 ),
0301
0302 TP_printk("%s %d %s", __entry->rcuname, __entry->cpu, __entry->reason)
0303 );
0304 #endif
0305
0306
0307
0308
0309
0310
0311
0312 TRACE_EVENT_RCU(rcu_preempt_task,
0313
0314 TP_PROTO(const char *rcuname, int pid, unsigned long gp_seq),
0315
0316 TP_ARGS(rcuname, pid, gp_seq),
0317
0318 TP_STRUCT__entry(
0319 __field(const char *, rcuname)
0320 __field(long, gp_seq)
0321 __field(int, pid)
0322 ),
0323
0324 TP_fast_assign(
0325 __entry->rcuname = rcuname;
0326 __entry->gp_seq = (long)gp_seq;
0327 __entry->pid = pid;
0328 ),
0329
0330 TP_printk("%s %ld %d",
0331 __entry->rcuname, __entry->gp_seq, __entry->pid)
0332 );
0333
0334
0335
0336
0337
0338
0339 TRACE_EVENT_RCU(rcu_unlock_preempted_task,
0340
0341 TP_PROTO(const char *rcuname, unsigned long gp_seq, int pid),
0342
0343 TP_ARGS(rcuname, gp_seq, pid),
0344
0345 TP_STRUCT__entry(
0346 __field(const char *, rcuname)
0347 __field(long, gp_seq)
0348 __field(int, pid)
0349 ),
0350
0351 TP_fast_assign(
0352 __entry->rcuname = rcuname;
0353 __entry->gp_seq = (long)gp_seq;
0354 __entry->pid = pid;
0355 ),
0356
0357 TP_printk("%s %ld %d", __entry->rcuname, __entry->gp_seq, __entry->pid)
0358 );
0359
0360
0361
0362
0363
0364
0365
0366
0367
0368 TRACE_EVENT_RCU(rcu_quiescent_state_report,
0369
0370 TP_PROTO(const char *rcuname, unsigned long gp_seq,
0371 unsigned long mask, unsigned long qsmask,
0372 u8 level, int grplo, int grphi, int gp_tasks),
0373
0374 TP_ARGS(rcuname, gp_seq, mask, qsmask, level, grplo, grphi, gp_tasks),
0375
0376 TP_STRUCT__entry(
0377 __field(const char *, rcuname)
0378 __field(long, gp_seq)
0379 __field(unsigned long, mask)
0380 __field(unsigned long, qsmask)
0381 __field(u8, level)
0382 __field(int, grplo)
0383 __field(int, grphi)
0384 __field(u8, gp_tasks)
0385 ),
0386
0387 TP_fast_assign(
0388 __entry->rcuname = rcuname;
0389 __entry->gp_seq = (long)gp_seq;
0390 __entry->mask = mask;
0391 __entry->qsmask = qsmask;
0392 __entry->level = level;
0393 __entry->grplo = grplo;
0394 __entry->grphi = grphi;
0395 __entry->gp_tasks = gp_tasks;
0396 ),
0397
0398 TP_printk("%s %ld %lx>%lx %u %d %d %u",
0399 __entry->rcuname, __entry->gp_seq,
0400 __entry->mask, __entry->qsmask, __entry->level,
0401 __entry->grplo, __entry->grphi, __entry->gp_tasks)
0402 );
0403
0404
0405
0406
0407
0408
0409
0410
0411 TRACE_EVENT_RCU(rcu_fqs,
0412
0413 TP_PROTO(const char *rcuname, unsigned long gp_seq, int cpu, const char *qsevent),
0414
0415 TP_ARGS(rcuname, gp_seq, cpu, qsevent),
0416
0417 TP_STRUCT__entry(
0418 __field(const char *, rcuname)
0419 __field(long, gp_seq)
0420 __field(int, cpu)
0421 __field(const char *, qsevent)
0422 ),
0423
0424 TP_fast_assign(
0425 __entry->rcuname = rcuname;
0426 __entry->gp_seq = (long)gp_seq;
0427 __entry->cpu = cpu;
0428 __entry->qsevent = qsevent;
0429 ),
0430
0431 TP_printk("%s %ld %d %s",
0432 __entry->rcuname, __entry->gp_seq,
0433 __entry->cpu, __entry->qsevent)
0434 );
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444 TRACE_EVENT(rcu_stall_warning,
0445
0446 TP_PROTO(const char *rcuname, const char *msg),
0447
0448 TP_ARGS(rcuname, msg),
0449
0450 TP_STRUCT__entry(
0451 __field(const char *, rcuname)
0452 __field(const char *, msg)
0453 ),
0454
0455 TP_fast_assign(
0456 __entry->rcuname = rcuname;
0457 __entry->msg = msg;
0458 ),
0459
0460 TP_printk("%s %s",
0461 __entry->rcuname, __entry->msg)
0462 );
0463
0464 #endif
0465
0466
0467
0468
0469
0470
0471
0472
0473
0474
0475
0476
0477
0478
0479
0480 TRACE_EVENT_RCU(rcu_dyntick,
0481
0482 TP_PROTO(const char *polarity, long oldnesting, long newnesting, int dynticks),
0483
0484 TP_ARGS(polarity, oldnesting, newnesting, dynticks),
0485
0486 TP_STRUCT__entry(
0487 __field(const char *, polarity)
0488 __field(long, oldnesting)
0489 __field(long, newnesting)
0490 __field(int, dynticks)
0491 ),
0492
0493 TP_fast_assign(
0494 __entry->polarity = polarity;
0495 __entry->oldnesting = oldnesting;
0496 __entry->newnesting = newnesting;
0497 __entry->dynticks = dynticks;
0498 ),
0499
0500 TP_printk("%s %lx %lx %#3x", __entry->polarity,
0501 __entry->oldnesting, __entry->newnesting,
0502 __entry->dynticks & 0xfff)
0503 );
0504
0505
0506
0507
0508
0509
0510
0511
0512 TRACE_EVENT_RCU(rcu_callback,
0513
0514 TP_PROTO(const char *rcuname, struct rcu_head *rhp, long qlen),
0515
0516 TP_ARGS(rcuname, rhp, qlen),
0517
0518 TP_STRUCT__entry(
0519 __field(const char *, rcuname)
0520 __field(void *, rhp)
0521 __field(void *, func)
0522 __field(long, qlen)
0523 ),
0524
0525 TP_fast_assign(
0526 __entry->rcuname = rcuname;
0527 __entry->rhp = rhp;
0528 __entry->func = rhp->func;
0529 __entry->qlen = qlen;
0530 ),
0531
0532 TP_printk("%s rhp=%p func=%ps %ld",
0533 __entry->rcuname, __entry->rhp, __entry->func,
0534 __entry->qlen)
0535 );
0536
0537 TRACE_EVENT_RCU(rcu_segcb_stats,
0538
0539 TP_PROTO(struct rcu_segcblist *rs, const char *ctx),
0540
0541 TP_ARGS(rs, ctx),
0542
0543 TP_STRUCT__entry(
0544 __field(const char *, ctx)
0545 __array(unsigned long, gp_seq, RCU_CBLIST_NSEGS)
0546 __array(long, seglen, RCU_CBLIST_NSEGS)
0547 ),
0548
0549 TP_fast_assign(
0550 __entry->ctx = ctx;
0551 memcpy(__entry->seglen, rs->seglen, RCU_CBLIST_NSEGS * sizeof(long));
0552 memcpy(__entry->gp_seq, rs->gp_seq, RCU_CBLIST_NSEGS * sizeof(unsigned long));
0553
0554 ),
0555
0556 TP_printk("%s seglen: (DONE=%ld, WAIT=%ld, NEXT_READY=%ld, NEXT=%ld) "
0557 "gp_seq: (DONE=%lu, WAIT=%lu, NEXT_READY=%lu, NEXT=%lu)", __entry->ctx,
0558 __entry->seglen[0], __entry->seglen[1], __entry->seglen[2], __entry->seglen[3],
0559 __entry->gp_seq[0], __entry->gp_seq[1], __entry->gp_seq[2], __entry->gp_seq[3])
0560
0561 );
0562
0563
0564
0565
0566
0567
0568
0569
0570
0571 TRACE_EVENT_RCU(rcu_kvfree_callback,
0572
0573 TP_PROTO(const char *rcuname, struct rcu_head *rhp, unsigned long offset,
0574 long qlen),
0575
0576 TP_ARGS(rcuname, rhp, offset, qlen),
0577
0578 TP_STRUCT__entry(
0579 __field(const char *, rcuname)
0580 __field(void *, rhp)
0581 __field(unsigned long, offset)
0582 __field(long, qlen)
0583 ),
0584
0585 TP_fast_assign(
0586 __entry->rcuname = rcuname;
0587 __entry->rhp = rhp;
0588 __entry->offset = offset;
0589 __entry->qlen = qlen;
0590 ),
0591
0592 TP_printk("%s rhp=%p func=%ld %ld",
0593 __entry->rcuname, __entry->rhp, __entry->offset,
0594 __entry->qlen)
0595 );
0596
0597
0598
0599
0600
0601
0602
0603
0604 TRACE_EVENT_RCU(rcu_batch_start,
0605
0606 TP_PROTO(const char *rcuname, long qlen, long blimit),
0607
0608 TP_ARGS(rcuname, qlen, blimit),
0609
0610 TP_STRUCT__entry(
0611 __field(const char *, rcuname)
0612 __field(long, qlen)
0613 __field(long, blimit)
0614 ),
0615
0616 TP_fast_assign(
0617 __entry->rcuname = rcuname;
0618 __entry->qlen = qlen;
0619 __entry->blimit = blimit;
0620 ),
0621
0622 TP_printk("%s CBs=%ld bl=%ld",
0623 __entry->rcuname, __entry->qlen, __entry->blimit)
0624 );
0625
0626
0627
0628
0629
0630
0631 TRACE_EVENT_RCU(rcu_invoke_callback,
0632
0633 TP_PROTO(const char *rcuname, struct rcu_head *rhp),
0634
0635 TP_ARGS(rcuname, rhp),
0636
0637 TP_STRUCT__entry(
0638 __field(const char *, rcuname)
0639 __field(void *, rhp)
0640 __field(void *, func)
0641 ),
0642
0643 TP_fast_assign(
0644 __entry->rcuname = rcuname;
0645 __entry->rhp = rhp;
0646 __entry->func = rhp->func;
0647 ),
0648
0649 TP_printk("%s rhp=%p func=%ps",
0650 __entry->rcuname, __entry->rhp, __entry->func)
0651 );
0652
0653
0654
0655
0656
0657
0658
0659
0660 TRACE_EVENT_RCU(rcu_invoke_kvfree_callback,
0661
0662 TP_PROTO(const char *rcuname, struct rcu_head *rhp, unsigned long offset),
0663
0664 TP_ARGS(rcuname, rhp, offset),
0665
0666 TP_STRUCT__entry(
0667 __field(const char *, rcuname)
0668 __field(void *, rhp)
0669 __field(unsigned long, offset)
0670 ),
0671
0672 TP_fast_assign(
0673 __entry->rcuname = rcuname;
0674 __entry->rhp = rhp;
0675 __entry->offset = offset;
0676 ),
0677
0678 TP_printk("%s rhp=%p func=%ld",
0679 __entry->rcuname, __entry->rhp, __entry->offset)
0680 );
0681
0682
0683
0684
0685
0686
0687
0688 TRACE_EVENT_RCU(rcu_invoke_kfree_bulk_callback,
0689
0690 TP_PROTO(const char *rcuname, unsigned long nr_records, void **p),
0691
0692 TP_ARGS(rcuname, nr_records, p),
0693
0694 TP_STRUCT__entry(
0695 __field(const char *, rcuname)
0696 __field(unsigned long, nr_records)
0697 __field(void **, p)
0698 ),
0699
0700 TP_fast_assign(
0701 __entry->rcuname = rcuname;
0702 __entry->nr_records = nr_records;
0703 __entry->p = p;
0704 ),
0705
0706 TP_printk("%s bulk=0x%p nr_records=%lu",
0707 __entry->rcuname, __entry->p, __entry->nr_records)
0708 );
0709
0710
0711
0712
0713
0714
0715
0716
0717
0718
0719
0720
0721 TRACE_EVENT_RCU(rcu_batch_end,
0722
0723 TP_PROTO(const char *rcuname, int callbacks_invoked,
0724 char cb, char nr, char iit, char risk),
0725
0726 TP_ARGS(rcuname, callbacks_invoked, cb, nr, iit, risk),
0727
0728 TP_STRUCT__entry(
0729 __field(const char *, rcuname)
0730 __field(int, callbacks_invoked)
0731 __field(char, cb)
0732 __field(char, nr)
0733 __field(char, iit)
0734 __field(char, risk)
0735 ),
0736
0737 TP_fast_assign(
0738 __entry->rcuname = rcuname;
0739 __entry->callbacks_invoked = callbacks_invoked;
0740 __entry->cb = cb;
0741 __entry->nr = nr;
0742 __entry->iit = iit;
0743 __entry->risk = risk;
0744 ),
0745
0746 TP_printk("%s CBs-invoked=%d idle=%c%c%c%c",
0747 __entry->rcuname, __entry->callbacks_invoked,
0748 __entry->cb ? 'C' : '.',
0749 __entry->nr ? 'S' : '.',
0750 __entry->iit ? 'I' : '.',
0751 __entry->risk ? 'R' : '.')
0752 );
0753
0754
0755
0756
0757
0758
0759
0760
0761
0762 #define RCUTORTURENAME_LEN 8
0763 TRACE_EVENT_RCU(rcu_torture_read,
0764
0765 TP_PROTO(const char *rcutorturename, struct rcu_head *rhp,
0766 unsigned long secs, unsigned long c_old, unsigned long c),
0767
0768 TP_ARGS(rcutorturename, rhp, secs, c_old, c),
0769
0770 TP_STRUCT__entry(
0771 __field(char, rcutorturename[RCUTORTURENAME_LEN])
0772 __field(struct rcu_head *, rhp)
0773 __field(unsigned long, secs)
0774 __field(unsigned long, c_old)
0775 __field(unsigned long, c)
0776 ),
0777
0778 TP_fast_assign(
0779 strncpy(__entry->rcutorturename, rcutorturename,
0780 RCUTORTURENAME_LEN);
0781 __entry->rcutorturename[RCUTORTURENAME_LEN - 1] = 0;
0782 __entry->rhp = rhp;
0783 __entry->secs = secs;
0784 __entry->c_old = c_old;
0785 __entry->c = c;
0786 ),
0787
0788 TP_printk("%s torture read %p %luus c: %lu %lu",
0789 __entry->rcutorturename, __entry->rhp,
0790 __entry->secs, __entry->c_old, __entry->c)
0791 );
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803
0804
0805
0806
0807
0808
0809 TRACE_EVENT_RCU(rcu_barrier,
0810
0811 TP_PROTO(const char *rcuname, const char *s, int cpu, int cnt, unsigned long done),
0812
0813 TP_ARGS(rcuname, s, cpu, cnt, done),
0814
0815 TP_STRUCT__entry(
0816 __field(const char *, rcuname)
0817 __field(const char *, s)
0818 __field(int, cpu)
0819 __field(int, cnt)
0820 __field(unsigned long, done)
0821 ),
0822
0823 TP_fast_assign(
0824 __entry->rcuname = rcuname;
0825 __entry->s = s;
0826 __entry->cpu = cpu;
0827 __entry->cnt = cnt;
0828 __entry->done = done;
0829 ),
0830
0831 TP_printk("%s %s cpu %d remaining %d # %lu",
0832 __entry->rcuname, __entry->s, __entry->cpu, __entry->cnt,
0833 __entry->done)
0834 );
0835
0836 #endif
0837
0838
0839 #include <trace/define_trace.h>