1 #undef TRACE_SYSTEM 2 #define TRACE_SYSTEM rcu 3 4 #if !defined(_TRACE_RCU_H) || defined(TRACE_HEADER_MULTI_READ) 5 #define _TRACE_RCU_H 6 7 #include <linux/tracepoint.h> 8 9 /* 10 * Tracepoint for start/end markers used for utilization calculations. 11 * By convention, the string is of the following forms: 12 * 13 * "Start <activity>" -- Mark the start of the specified activity, 14 * such as "context switch". Nesting is permitted. 15 * "End <activity>" -- Mark the end of the specified activity. 16 * 17 * An "@" character within "<activity>" is a comment character: Data 18 * reduction scripts will ignore the "@" and the remainder of the line. 19 */ 20 TRACE_EVENT(rcu_utilization, 21 22 TP_PROTO(char *s), 23 24 TP_ARGS(s), 25 26 TP_STRUCT__entry( 27 __field(char *, s) 28 ), 29 30 TP_fast_assign( 31 __entry->s = s; 32 ), 33 34 TP_printk("%s", __entry->s) 35 ); 36 37 #ifdef CONFIG_RCU_TRACE 38 39 #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU) 40 41 /* 42 * Tracepoint for grace-period events: starting and ending a grace 43 * period ("start" and "end", respectively), a CPU noting the start 44 * of a new grace period or the end of an old grace period ("cpustart" 45 * and "cpuend", respectively), a CPU passing through a quiescent 46 * state ("cpuqs"), a CPU coming online or going offline ("cpuonl" 47 * and "cpuofl", respectively), and a CPU being kicked for being too 48 * long in dyntick-idle mode ("kick"). 49 */ 50 TRACE_EVENT(rcu_grace_period, 51 52 TP_PROTO(char *rcuname, unsigned long gpnum, char *gpevent), 53 54 TP_ARGS(rcuname, gpnum, gpevent), 55 56 TP_STRUCT__entry( 57 __field(char *, rcuname) 58 __field(unsigned long, gpnum) 59 __field(char *, gpevent) 60 ), 61 62 TP_fast_assign( 63 __entry->rcuname = rcuname; 64 __entry->gpnum = gpnum; 65 __entry->gpevent = gpevent; 66 ), 67 68 TP_printk("%s %lu %s", 69 __entry->rcuname, __entry->gpnum, __entry->gpevent) 70 ); 71 72 /* 73 * Tracepoint for grace-period-initialization events. These are 74 * distinguished by the type of RCU, the new grace-period number, the 75 * rcu_node structure level, the starting and ending CPU covered by the 76 * rcu_node structure, and the mask of CPUs that will be waited for. 77 * All but the type of RCU are extracted from the rcu_node structure. 78 */ 79 TRACE_EVENT(rcu_grace_period_init, 80 81 TP_PROTO(char *rcuname, unsigned long gpnum, u8 level, 82 int grplo, int grphi, unsigned long qsmask), 83 84 TP_ARGS(rcuname, gpnum, level, grplo, grphi, qsmask), 85 86 TP_STRUCT__entry( 87 __field(char *, rcuname) 88 __field(unsigned long, gpnum) 89 __field(u8, level) 90 __field(int, grplo) 91 __field(int, grphi) 92 __field(unsigned long, qsmask) 93 ), 94 95 TP_fast_assign( 96 __entry->rcuname = rcuname; 97 __entry->gpnum = gpnum; 98 __entry->level = level; 99 __entry->grplo = grplo; 100 __entry->grphi = grphi; 101 __entry->qsmask = qsmask; 102 ), 103 104 TP_printk("%s %lu %u %d %d %lx", 105 __entry->rcuname, __entry->gpnum, __entry->level, 106 __entry->grplo, __entry->grphi, __entry->qsmask) 107 ); 108 109 /* 110 * Tracepoint for tasks blocking within preemptible-RCU read-side 111 * critical sections. Track the type of RCU (which one day might 112 * include SRCU), the grace-period number that the task is blocking 113 * (the current or the next), and the task's PID. 114 */ 115 TRACE_EVENT(rcu_preempt_task, 116 117 TP_PROTO(char *rcuname, int pid, unsigned long gpnum), 118 119 TP_ARGS(rcuname, pid, gpnum), 120 121 TP_STRUCT__entry( 122 __field(char *, rcuname) 123 __field(unsigned long, gpnum) 124 __field(int, pid) 125 ), 126 127 TP_fast_assign( 128 __entry->rcuname = rcuname; 129 __entry->gpnum = gpnum; 130 __entry->pid = pid; 131 ), 132 133 TP_printk("%s %lu %d", 134 __entry->rcuname, __entry->gpnum, __entry->pid) 135 ); 136 137 /* 138 * Tracepoint for tasks that blocked within a given preemptible-RCU 139 * read-side critical section exiting that critical section. Track the 140 * type of RCU (which one day might include SRCU) and the task's PID. 141 */ 142 TRACE_EVENT(rcu_unlock_preempted_task, 143 144 TP_PROTO(char *rcuname, unsigned long gpnum, int pid), 145 146 TP_ARGS(rcuname, gpnum, pid), 147 148 TP_STRUCT__entry( 149 __field(char *, rcuname) 150 __field(unsigned long, gpnum) 151 __field(int, pid) 152 ), 153 154 TP_fast_assign( 155 __entry->rcuname = rcuname; 156 __entry->gpnum = gpnum; 157 __entry->pid = pid; 158 ), 159 160 TP_printk("%s %lu %d", __entry->rcuname, __entry->gpnum, __entry->pid) 161 ); 162 163 /* 164 * Tracepoint for quiescent-state-reporting events. These are 165 * distinguished by the type of RCU, the grace-period number, the 166 * mask of quiescent lower-level entities, the rcu_node structure level, 167 * the starting and ending CPU covered by the rcu_node structure, and 168 * whether there are any blocked tasks blocking the current grace period. 169 * All but the type of RCU are extracted from the rcu_node structure. 170 */ 171 TRACE_EVENT(rcu_quiescent_state_report, 172 173 TP_PROTO(char *rcuname, unsigned long gpnum, 174 unsigned long mask, unsigned long qsmask, 175 u8 level, int grplo, int grphi, int gp_tasks), 176 177 TP_ARGS(rcuname, gpnum, mask, qsmask, level, grplo, grphi, gp_tasks), 178 179 TP_STRUCT__entry( 180 __field(char *, rcuname) 181 __field(unsigned long, gpnum) 182 __field(unsigned long, mask) 183 __field(unsigned long, qsmask) 184 __field(u8, level) 185 __field(int, grplo) 186 __field(int, grphi) 187 __field(u8, gp_tasks) 188 ), 189 190 TP_fast_assign( 191 __entry->rcuname = rcuname; 192 __entry->gpnum = gpnum; 193 __entry->mask = mask; 194 __entry->qsmask = qsmask; 195 __entry->level = level; 196 __entry->grplo = grplo; 197 __entry->grphi = grphi; 198 __entry->gp_tasks = gp_tasks; 199 ), 200 201 TP_printk("%s %lu %lx>%lx %u %d %d %u", 202 __entry->rcuname, __entry->gpnum, 203 __entry->mask, __entry->qsmask, __entry->level, 204 __entry->grplo, __entry->grphi, __entry->gp_tasks) 205 ); 206 207 /* 208 * Tracepoint for quiescent states detected by force_quiescent_state(). 209 * These trace events include the type of RCU, the grace-period number 210 * that was blocked by the CPU, the CPU itself, and the type of quiescent 211 * state, which can be "dti" for dyntick-idle mode, "ofl" for CPU offline, 212 * or "kick" when kicking a CPU that has been in dyntick-idle mode for 213 * too long. 214 */ 215 TRACE_EVENT(rcu_fqs, 216 217 TP_PROTO(char *rcuname, unsigned long gpnum, int cpu, char *qsevent), 218 219 TP_ARGS(rcuname, gpnum, cpu, qsevent), 220 221 TP_STRUCT__entry( 222 __field(char *, rcuname) 223 __field(unsigned long, gpnum) 224 __field(int, cpu) 225 __field(char *, qsevent) 226 ), 227 228 TP_fast_assign( 229 __entry->rcuname = rcuname; 230 __entry->gpnum = gpnum; 231 __entry->cpu = cpu; 232 __entry->qsevent = qsevent; 233 ), 234 235 TP_printk("%s %lu %d %s", 236 __entry->rcuname, __entry->gpnum, 237 __entry->cpu, __entry->qsevent) 238 ); 239 240 #endif /* #if defined(CONFIG_TREE_RCU) || defined(CONFIG_TREE_PREEMPT_RCU) */ 241 242 /* 243 * Tracepoint for dyntick-idle entry/exit events. These take a string 244 * as argument: "Start" for entering dyntick-idle mode and "End" for 245 * leaving it. 246 */ 247 TRACE_EVENT(rcu_dyntick, 248 249 TP_PROTO(char *polarity), 250 251 TP_ARGS(polarity), 252 253 TP_STRUCT__entry( 254 __field(char *, polarity) 255 ), 256 257 TP_fast_assign( 258 __entry->polarity = polarity; 259 ), 260 261 TP_printk("%s", __entry->polarity) 262 ); 263 264 /* 265 * Tracepoint for the registration of a single RCU callback function. 266 * The first argument is the type of RCU, the second argument is 267 * a pointer to the RCU callback itself, and the third element is the 268 * new RCU callback queue length for the current CPU. 269 */ 270 TRACE_EVENT(rcu_callback, 271 272 TP_PROTO(char *rcuname, struct rcu_head *rhp, long qlen), 273 274 TP_ARGS(rcuname, rhp, qlen), 275 276 TP_STRUCT__entry( 277 __field(char *, rcuname) 278 __field(void *, rhp) 279 __field(void *, func) 280 __field(long, qlen) 281 ), 282 283 TP_fast_assign( 284 __entry->rcuname = rcuname; 285 __entry->rhp = rhp; 286 __entry->func = rhp->func; 287 __entry->qlen = qlen; 288 ), 289 290 TP_printk("%s rhp=%p func=%pf %ld", 291 __entry->rcuname, __entry->rhp, __entry->func, __entry->qlen) 292 ); 293 294 /* 295 * Tracepoint for the registration of a single RCU callback of the special 296 * kfree() form. The first argument is the RCU type, the second argument 297 * is a pointer to the RCU callback, the third argument is the offset 298 * of the callback within the enclosing RCU-protected data structure, 299 * and the fourth argument is the new RCU callback queue length for the 300 * current CPU. 301 */ 302 TRACE_EVENT(rcu_kfree_callback, 303 304 TP_PROTO(char *rcuname, struct rcu_head *rhp, unsigned long offset, 305 long qlen), 306 307 TP_ARGS(rcuname, rhp, offset, qlen), 308 309 TP_STRUCT__entry( 310 __field(char *, rcuname) 311 __field(void *, rhp) 312 __field(unsigned long, offset) 313 __field(long, qlen) 314 ), 315 316 TP_fast_assign( 317 __entry->rcuname = rcuname; 318 __entry->rhp = rhp; 319 __entry->offset = offset; 320 __entry->qlen = qlen; 321 ), 322 323 TP_printk("%s rhp=%p func=%ld %ld", 324 __entry->rcuname, __entry->rhp, __entry->offset, 325 __entry->qlen) 326 ); 327 328 /* 329 * Tracepoint for marking the beginning rcu_do_batch, performed to start 330 * RCU callback invocation. The first argument is the RCU flavor, 331 * the second is the total number of callbacks (including those that 332 * are not yet ready to be invoked), and the third argument is the 333 * current RCU-callback batch limit. 334 */ 335 TRACE_EVENT(rcu_batch_start, 336 337 TP_PROTO(char *rcuname, long qlen, int blimit), 338 339 TP_ARGS(rcuname, qlen, blimit), 340 341 TP_STRUCT__entry( 342 __field(char *, rcuname) 343 __field(long, qlen) 344 __field(int, blimit) 345 ), 346 347 TP_fast_assign( 348 __entry->rcuname = rcuname; 349 __entry->qlen = qlen; 350 __entry->blimit = blimit; 351 ), 352 353 TP_printk("%s CBs=%ld bl=%d", 354 __entry->rcuname, __entry->qlen, __entry->blimit) 355 ); 356 357 /* 358 * Tracepoint for the invocation of a single RCU callback function. 359 * The first argument is the type of RCU, and the second argument is 360 * a pointer to the RCU callback itself. 361 */ 362 TRACE_EVENT(rcu_invoke_callback, 363 364 TP_PROTO(char *rcuname, struct rcu_head *rhp), 365 366 TP_ARGS(rcuname, rhp), 367 368 TP_STRUCT__entry( 369 __field(char *, rcuname) 370 __field(void *, rhp) 371 __field(void *, func) 372 ), 373 374 TP_fast_assign( 375 __entry->rcuname = rcuname; 376 __entry->rhp = rhp; 377 __entry->func = rhp->func; 378 ), 379 380 TP_printk("%s rhp=%p func=%pf", 381 __entry->rcuname, __entry->rhp, __entry->func) 382 ); 383 384 /* 385 * Tracepoint for the invocation of a single RCU callback of the special 386 * kfree() form. The first argument is the RCU flavor, the second 387 * argument is a pointer to the RCU callback, and the third argument 388 * is the offset of the callback within the enclosing RCU-protected 389 * data structure. 390 */ 391 TRACE_EVENT(rcu_invoke_kfree_callback, 392 393 TP_PROTO(char *rcuname, struct rcu_head *rhp, unsigned long offset), 394 395 TP_ARGS(rcuname, rhp, offset), 396 397 TP_STRUCT__entry( 398 __field(char *, rcuname) 399 __field(void *, rhp) 400 __field(unsigned long, offset) 401 ), 402 403 TP_fast_assign( 404 __entry->rcuname = rcuname; 405 __entry->rhp = rhp; 406 __entry->offset = offset; 407 ), 408 409 TP_printk("%s rhp=%p func=%ld", 410 __entry->rcuname, __entry->rhp, __entry->offset) 411 ); 412 413 /* 414 * Tracepoint for exiting rcu_do_batch after RCU callbacks have been 415 * invoked. The first argument is the name of the RCU flavor and 416 * the second argument is number of callbacks actually invoked. 417 */ 418 TRACE_EVENT(rcu_batch_end, 419 420 TP_PROTO(char *rcuname, int callbacks_invoked), 421 422 TP_ARGS(rcuname, callbacks_invoked), 423 424 TP_STRUCT__entry( 425 __field(char *, rcuname) 426 __field(int, callbacks_invoked) 427 ), 428 429 TP_fast_assign( 430 __entry->rcuname = rcuname; 431 __entry->callbacks_invoked = callbacks_invoked; 432 ), 433 434 TP_printk("%s CBs-invoked=%d", 435 __entry->rcuname, __entry->callbacks_invoked) 436 ); 437 438 #else /* #ifdef CONFIG_RCU_TRACE */ 439 440 #define trace_rcu_grace_period(rcuname, gpnum, gpevent) do { } while (0) 441 #define trace_rcu_grace_period_init(rcuname, gpnum, level, grplo, grphi, qsmask) do { } while (0) 442 #define trace_rcu_preempt_task(rcuname, pid, gpnum) do { } while (0) 443 #define trace_rcu_unlock_preempted_task(rcuname, gpnum, pid) do { } while (0) 444 #define trace_rcu_quiescent_state_report(rcuname, gpnum, mask, qsmask, level, grplo, grphi, gp_tasks) do { } while (0) 445 #define trace_rcu_fqs(rcuname, gpnum, cpu, qsevent) do { } while (0) 446 #define trace_rcu_dyntick(polarity) do { } while (0) 447 #define trace_rcu_callback(rcuname, rhp, qlen) do { } while (0) 448 #define trace_rcu_kfree_callback(rcuname, rhp, offset, qlen) do { } while (0) 449 #define trace_rcu_batch_start(rcuname, qlen, blimit) do { } while (0) 450 #define trace_rcu_invoke_callback(rcuname, rhp) do { } while (0) 451 #define trace_rcu_invoke_kfree_callback(rcuname, rhp, offset) do { } while (0) 452 #define trace_rcu_batch_end(rcuname, callbacks_invoked) do { } while (0) 453 454 #endif /* #else #ifdef CONFIG_RCU_TRACE */ 455 456 #endif /* _TRACE_RCU_H */ 457 458 /* This part must be outside protection */ 459 #include <trace/define_trace.h> 460