Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

genirq/matrix: Add tracepoints

Add tracepoints for the irq bitmap matrix allocator.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Tested-by: Juergen Gross <jgross@suse.com>
Tested-by: Yu Chen <yu.c.chen@intel.com>
Acked-by: Juergen Gross <jgross@suse.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: Tony Luck <tony.luck@intel.com>
Cc: Marc Zyngier <marc.zyngier@arm.com>
Cc: Alok Kataria <akataria@vmware.com>
Cc: Joerg Roedel <joro@8bytes.org>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Christoph Hellwig <hch@lst.de>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Paolo Bonzini <pbonzini@redhat.com>
Cc: Rui Zhang <rui.zhang@intel.com>
Cc: "K. Y. Srinivasan" <kys@microsoft.com>
Cc: Arjan van de Ven <arjan@linux.intel.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Len Brown <lenb@kernel.org>
Link: https://lkml.kernel.org/r/20170913213153.279468022@linutronix.de

+216
+201
include/trace/events/irq_matrix.h
··· 1 + #undef TRACE_SYSTEM 2 + #define TRACE_SYSTEM irq_matrix 3 + 4 + #if !defined(_TRACE_IRQ_MATRIX_H) || defined(TRACE_HEADER_MULTI_READ) 5 + #define _TRACE_IRQ_MATRIX_H 6 + 7 + #include <linux/tracepoint.h> 8 + 9 + struct irq_matrix; 10 + struct cpumap; 11 + 12 + DECLARE_EVENT_CLASS(irq_matrix_global, 13 + 14 + TP_PROTO(struct irq_matrix *matrix), 15 + 16 + TP_ARGS(matrix), 17 + 18 + TP_STRUCT__entry( 19 + __field( unsigned int, online_maps ) 20 + __field( unsigned int, global_available ) 21 + __field( unsigned int, global_reserved ) 22 + __field( unsigned int, total_allocated ) 23 + ), 24 + 25 + TP_fast_assign( 26 + __entry->online_maps = matrix->online_maps; 27 + __entry->global_available = matrix->global_available; 28 + __entry->global_reserved = matrix->global_reserved; 29 + __entry->total_allocated = matrix->total_allocated; 30 + ), 31 + 32 + TP_printk("online_maps=%d global_avl=%u, global_rsvd=%u, total_alloc=%u", 33 + __entry->online_maps, __entry->global_available, 34 + __entry->global_reserved, __entry->total_allocated) 35 + ); 36 + 37 + DECLARE_EVENT_CLASS(irq_matrix_global_update, 38 + 39 + TP_PROTO(int bit, struct irq_matrix *matrix), 40 + 41 + TP_ARGS(bit, matrix), 42 + 43 + TP_STRUCT__entry( 44 + __field( int, bit ) 45 + __field( unsigned int, online_maps ) 46 + __field( unsigned int, global_available ) 47 + __field( unsigned int, global_reserved ) 48 + __field( unsigned int, total_allocated ) 49 + ), 50 + 51 + TP_fast_assign( 52 + __entry->bit = bit; 53 + __entry->online_maps = matrix->online_maps; 54 + __entry->global_available = matrix->global_available; 55 + __entry->global_reserved = matrix->global_reserved; 56 + __entry->total_allocated = matrix->total_allocated; 57 + ), 58 + 59 + TP_printk("bit=%d online_maps=%d global_avl=%u, global_rsvd=%u, total_alloc=%u", 60 + __entry->bit, __entry->online_maps, 61 + __entry->global_available, __entry->global_reserved, 62 + __entry->total_allocated) 63 + ); 64 + 65 + DECLARE_EVENT_CLASS(irq_matrix_cpu, 66 + 67 + TP_PROTO(int bit, unsigned int cpu, struct irq_matrix *matrix, 68 + struct cpumap *cmap), 69 + 70 + TP_ARGS(bit, cpu, matrix, cmap), 71 + 72 + TP_STRUCT__entry( 73 + __field( int, bit ) 74 + __field( unsigned int, cpu ) 75 + __field( bool, online ) 76 + __field( unsigned int, available ) 77 + __field( unsigned int, allocated ) 78 + __field( unsigned int, managed ) 79 + __field( unsigned int, online_maps ) 80 + __field( unsigned int, global_available ) 81 + __field( unsigned int, global_reserved ) 82 + __field( unsigned int, total_allocated ) 83 + ), 84 + 85 + TP_fast_assign( 86 + __entry->bit = bit; 87 + __entry->cpu = cpu; 88 + __entry->online = cmap->online; 89 + __entry->available = cmap->available; 90 + __entry->allocated = cmap->allocated; 91 + __entry->managed = cmap->managed; 92 + __entry->online_maps = matrix->online_maps; 93 + __entry->global_available = matrix->global_available; 94 + __entry->global_reserved = matrix->global_reserved; 95 + __entry->total_allocated = matrix->total_allocated; 96 + ), 97 + 98 + TP_printk("bit=%d cpu=%u online=%d avl=%u alloc=%u managed=%u online_maps=%u global_avl=%u, global_rsvd=%u, total_alloc=%u", 99 + __entry->bit, __entry->cpu, __entry->online, 100 + __entry->available, __entry->allocated, 101 + __entry->managed, __entry->online_maps, 102 + __entry->global_available, __entry->global_reserved, 103 + __entry->total_allocated) 104 + ); 105 + 106 + DEFINE_EVENT(irq_matrix_global, irq_matrix_online, 107 + 108 + TP_PROTO(struct irq_matrix *matrix), 109 + 110 + TP_ARGS(matrix) 111 + ); 112 + 113 + DEFINE_EVENT(irq_matrix_global, irq_matrix_offline, 114 + 115 + TP_PROTO(struct irq_matrix *matrix), 116 + 117 + TP_ARGS(matrix) 118 + ); 119 + 120 + DEFINE_EVENT(irq_matrix_global, irq_matrix_reserve, 121 + 122 + TP_PROTO(struct irq_matrix *matrix), 123 + 124 + TP_ARGS(matrix) 125 + ); 126 + 127 + DEFINE_EVENT(irq_matrix_global, irq_matrix_remove_reserved, 128 + 129 + TP_PROTO(struct irq_matrix *matrix), 130 + 131 + TP_ARGS(matrix) 132 + ); 133 + 134 + DEFINE_EVENT(irq_matrix_global_update, irq_matrix_assign_system, 135 + 136 + TP_PROTO(int bit, struct irq_matrix *matrix), 137 + 138 + TP_ARGS(bit, matrix) 139 + ); 140 + 141 + DEFINE_EVENT(irq_matrix_cpu, irq_matrix_alloc_reserved, 142 + 143 + TP_PROTO(int bit, unsigned int cpu, 144 + struct irq_matrix *matrix, struct cpumap *cmap), 145 + 146 + TP_ARGS(bit, cpu, matrix, cmap) 147 + ); 148 + 149 + DEFINE_EVENT(irq_matrix_cpu, irq_matrix_reserve_managed, 150 + 151 + TP_PROTO(int bit, unsigned int cpu, 152 + struct irq_matrix *matrix, struct cpumap *cmap), 153 + 154 + TP_ARGS(bit, cpu, matrix, cmap) 155 + ); 156 + 157 + DEFINE_EVENT(irq_matrix_cpu, irq_matrix_remove_managed, 158 + 159 + TP_PROTO(int bit, unsigned int cpu, 160 + struct irq_matrix *matrix, struct cpumap *cmap), 161 + 162 + TP_ARGS(bit, cpu, matrix, cmap) 163 + ); 164 + 165 + DEFINE_EVENT(irq_matrix_cpu, irq_matrix_alloc_managed, 166 + 167 + TP_PROTO(int bit, unsigned int cpu, 168 + struct irq_matrix *matrix, struct cpumap *cmap), 169 + 170 + TP_ARGS(bit, cpu, matrix, cmap) 171 + ); 172 + 173 + DEFINE_EVENT(irq_matrix_cpu, irq_matrix_assign, 174 + 175 + TP_PROTO(int bit, unsigned int cpu, 176 + struct irq_matrix *matrix, struct cpumap *cmap), 177 + 178 + TP_ARGS(bit, cpu, matrix, cmap) 179 + ); 180 + 181 + DEFINE_EVENT(irq_matrix_cpu, irq_matrix_alloc, 182 + 183 + TP_PROTO(int bit, unsigned int cpu, 184 + struct irq_matrix *matrix, struct cpumap *cmap), 185 + 186 + TP_ARGS(bit, cpu, matrix, cmap) 187 + ); 188 + 189 + DEFINE_EVENT(irq_matrix_cpu, irq_matrix_free, 190 + 191 + TP_PROTO(int bit, unsigned int cpu, 192 + struct irq_matrix *matrix, struct cpumap *cmap), 193 + 194 + TP_ARGS(bit, cpu, matrix, cmap) 195 + ); 196 + 197 + 198 + #endif /* _TRACE_IRQ_H */ 199 + 200 + /* This part must be outside protection */ 201 + #include <trace/define_trace.h>
+15
kernel/irq/matrix.c
··· 36 36 unsigned long system_map[IRQ_MATRIX_SIZE]; 37 37 }; 38 38 39 + #define CREATE_TRACE_POINTS 40 + #include <trace/events/irq_matrix.h> 41 + 39 42 /** 40 43 * irq_alloc_matrix - Allocate a irq_matrix structure and initialize it 41 44 * @matrix_bits: Number of matrix bits must be <= IRQ_MATRIX_BITS ··· 87 84 m->global_available += cm->available; 88 85 cm->online = true; 89 86 m->online_maps++; 87 + trace_irq_matrix_online(m); 90 88 } 91 89 92 90 /** ··· 102 98 m->global_available -= cm->available; 103 99 cm->online = false; 104 100 m->online_maps--; 101 + trace_irq_matrix_offline(m); 105 102 } 106 103 107 104 static unsigned int matrix_alloc_area(struct irq_matrix *m, struct cpumap *cm, ··· 150 145 } 151 146 if (bit >= m->alloc_start && bit < m->alloc_end) 152 147 m->systembits_inalloc++; 148 + 149 + trace_irq_matrix_assign_system(bit, m); 153 150 } 154 151 155 152 /** ··· 179 172 cm->available--; 180 173 m->global_available--; 181 174 } 175 + trace_irq_matrix_reserve_managed(bit, cpu, m, cm); 182 176 } 183 177 return 0; 184 178 cleanup: ··· 229 221 cm->available++; 230 222 m->global_available++; 231 223 } 224 + trace_irq_matrix_remove_managed(bit, cpu, m, cm); 232 225 } 233 226 } 234 227 ··· 251 242 set_bit(bit, cm->alloc_map); 252 243 cm->allocated++; 253 244 m->total_allocated++; 245 + trace_irq_matrix_alloc_managed(bit, cpu, m, cm); 254 246 return bit; 255 247 } 256 248 ··· 274 264 m->total_allocated++; 275 265 cm->available--; 276 266 m->global_available--; 267 + trace_irq_matrix_assign(bit, smp_processor_id(), m, cm); 277 268 } 278 269 279 270 /** ··· 293 282 pr_warn("Interrupt reservation exceeds available resources\n"); 294 283 295 284 m->global_reserved++; 285 + trace_irq_matrix_reserve(m); 296 286 } 297 287 298 288 /** ··· 308 296 void irq_matrix_remove_reserved(struct irq_matrix *m) 309 297 { 310 298 m->global_reserved--; 299 + trace_irq_matrix_remove_reserved(m); 311 300 } 312 301 313 302 /** ··· 339 326 if (reserved) 340 327 m->global_reserved--; 341 328 *mapped_cpu = cpu; 329 + trace_irq_matrix_alloc(bit, cpu, m, cm); 342 330 return bit; 343 331 } 344 332 } ··· 371 357 m->global_available++; 372 358 } 373 359 } 360 + trace_irq_matrix_free(bit, cpu, m, cm); 374 361 } 375 362 376 363 /**