diff options
author | Thomas Gleixner <tglx@linutronix.de> | 2017-09-13 17:29:15 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@linutronix.de> | 2017-09-25 14:38:26 -0400 |
commit | ec0f7cd273dc41ab28bba703cac82690ea5f2863 (patch) | |
tree | 6343ee6052694a1a939f1b39ff992bbf707c0e66 | |
parent | 2f75d9e1c90511bff6d1ce4de94503cc28fec032 (diff) |
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
-rw-r--r-- | include/trace/events/irq_matrix.h | 201 | ||||
-rw-r--r-- | kernel/irq/matrix.c | 15 |
2 files changed, 216 insertions, 0 deletions
diff --git a/include/trace/events/irq_matrix.h b/include/trace/events/irq_matrix.h new file mode 100644 index 000000000000..267d4cbbf360 --- /dev/null +++ b/include/trace/events/irq_matrix.h | |||
@@ -0,0 +1,201 @@ | |||
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> | ||
diff --git a/kernel/irq/matrix.c b/kernel/irq/matrix.c index 7b2b4fbde1e2..a3cbbc8191c5 100644 --- a/kernel/irq/matrix.c +++ b/kernel/irq/matrix.c | |||
@@ -36,6 +36,9 @@ struct irq_matrix { | |||
36 | unsigned long system_map[IRQ_MATRIX_SIZE]; | 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 | * irq_alloc_matrix - Allocate a irq_matrix structure and initialize it | 43 | * irq_alloc_matrix - Allocate a irq_matrix structure and initialize it |
41 | * @matrix_bits: Number of matrix bits must be <= IRQ_MATRIX_BITS | 44 | * @matrix_bits: Number of matrix bits must be <= IRQ_MATRIX_BITS |
@@ -84,6 +87,7 @@ void irq_matrix_online(struct irq_matrix *m) | |||
84 | m->global_available += cm->available; | 87 | m->global_available += cm->available; |
85 | cm->online = true; | 88 | cm->online = true; |
86 | m->online_maps++; | 89 | m->online_maps++; |
90 | trace_irq_matrix_online(m); | ||
87 | } | 91 | } |
88 | 92 | ||
89 | /** | 93 | /** |
@@ -98,6 +102,7 @@ void irq_matrix_offline(struct irq_matrix *m) | |||
98 | m->global_available -= cm->available; | 102 | m->global_available -= cm->available; |
99 | cm->online = false; | 103 | cm->online = false; |
100 | m->online_maps--; | 104 | m->online_maps--; |
105 | trace_irq_matrix_offline(m); | ||
101 | } | 106 | } |
102 | 107 | ||
103 | static unsigned int matrix_alloc_area(struct irq_matrix *m, struct cpumap *cm, | 108 | static unsigned int matrix_alloc_area(struct irq_matrix *m, struct cpumap *cm, |
@@ -145,6 +150,8 @@ void irq_matrix_assign_system(struct irq_matrix *m, unsigned int bit, | |||
145 | } | 150 | } |
146 | if (bit >= m->alloc_start && bit < m->alloc_end) | 151 | if (bit >= m->alloc_start && bit < m->alloc_end) |
147 | m->systembits_inalloc++; | 152 | m->systembits_inalloc++; |
153 | |||
154 | trace_irq_matrix_assign_system(bit, m); | ||
148 | } | 155 | } |
149 | 156 | ||
150 | /** | 157 | /** |
@@ -172,6 +179,7 @@ int irq_matrix_reserve_managed(struct irq_matrix *m, const struct cpumask *msk) | |||
172 | cm->available--; | 179 | cm->available--; |
173 | m->global_available--; | 180 | m->global_available--; |
174 | } | 181 | } |
182 | trace_irq_matrix_reserve_managed(bit, cpu, m, cm); | ||
175 | } | 183 | } |
176 | return 0; | 184 | return 0; |
177 | cleanup: | 185 | cleanup: |
@@ -221,6 +229,7 @@ void irq_matrix_remove_managed(struct irq_matrix *m, const struct cpumask *msk) | |||
221 | cm->available++; | 229 | cm->available++; |
222 | m->global_available++; | 230 | m->global_available++; |
223 | } | 231 | } |
232 | trace_irq_matrix_remove_managed(bit, cpu, m, cm); | ||
224 | } | 233 | } |
225 | } | 234 | } |
226 | 235 | ||
@@ -242,6 +251,7 @@ int irq_matrix_alloc_managed(struct irq_matrix *m, unsigned int cpu) | |||
242 | set_bit(bit, cm->alloc_map); | 251 | set_bit(bit, cm->alloc_map); |
243 | cm->allocated++; | 252 | cm->allocated++; |
244 | m->total_allocated++; | 253 | m->total_allocated++; |
254 | trace_irq_matrix_alloc_managed(bit, cpu, m, cm); | ||
245 | return bit; | 255 | return bit; |
246 | } | 256 | } |
247 | 257 | ||
@@ -264,6 +274,7 @@ void irq_matrix_assign(struct irq_matrix *m, unsigned int bit) | |||
264 | m->total_allocated++; | 274 | m->total_allocated++; |
265 | cm->available--; | 275 | cm->available--; |
266 | m->global_available--; | 276 | m->global_available--; |
277 | trace_irq_matrix_assign(bit, smp_processor_id(), m, cm); | ||
267 | } | 278 | } |
268 | 279 | ||
269 | /** | 280 | /** |
@@ -282,6 +293,7 @@ void irq_matrix_reserve(struct irq_matrix *m) | |||
282 | pr_warn("Interrupt reservation exceeds available resources\n"); | 293 | pr_warn("Interrupt reservation exceeds available resources\n"); |
283 | 294 | ||
284 | m->global_reserved++; | 295 | m->global_reserved++; |
296 | trace_irq_matrix_reserve(m); | ||
285 | } | 297 | } |
286 | 298 | ||
287 | /** | 299 | /** |
@@ -296,6 +308,7 @@ void irq_matrix_reserve(struct irq_matrix *m) | |||
296 | void irq_matrix_remove_reserved(struct irq_matrix *m) | 308 | void irq_matrix_remove_reserved(struct irq_matrix *m) |
297 | { | 309 | { |
298 | m->global_reserved--; | 310 | m->global_reserved--; |
311 | trace_irq_matrix_remove_reserved(m); | ||
299 | } | 312 | } |
300 | 313 | ||
301 | /** | 314 | /** |
@@ -326,6 +339,7 @@ int irq_matrix_alloc(struct irq_matrix *m, const struct cpumask *msk, | |||
326 | if (reserved) | 339 | if (reserved) |
327 | m->global_reserved--; | 340 | m->global_reserved--; |
328 | *mapped_cpu = cpu; | 341 | *mapped_cpu = cpu; |
342 | trace_irq_matrix_alloc(bit, cpu, m, cm); | ||
329 | return bit; | 343 | return bit; |
330 | } | 344 | } |
331 | } | 345 | } |
@@ -357,6 +371,7 @@ void irq_matrix_free(struct irq_matrix *m, unsigned int cpu, | |||
357 | m->global_available++; | 371 | m->global_available++; |
358 | } | 372 | } |
359 | } | 373 | } |
374 | trace_irq_matrix_free(bit, cpu, m, cm); | ||
360 | } | 375 | } |
361 | 376 | ||
362 | /** | 377 | /** |