Skip to content

Commit ec0f7cd

Browse files
committed
genirq/matrix: Add tracepoints
Add tracepoints for the irq bitmap matrix allocator. Signed-off-by: Thomas Gleixner <[email protected]> Tested-by: Juergen Gross <[email protected]> Tested-by: Yu Chen <[email protected]> Acked-by: Juergen Gross <[email protected]> Cc: Boris Ostrovsky <[email protected]> Cc: Tony Luck <[email protected]> Cc: Marc Zyngier <[email protected]> Cc: Alok Kataria <[email protected]> Cc: Joerg Roedel <[email protected]> Cc: "Rafael J. Wysocki" <[email protected]> Cc: Steven Rostedt <[email protected]> Cc: Christoph Hellwig <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Paolo Bonzini <[email protected]> Cc: Rui Zhang <[email protected]> Cc: "K. Y. Srinivasan" <[email protected]> Cc: Arjan van de Ven <[email protected]> Cc: Dan Williams <[email protected]> Cc: Len Brown <[email protected]> Link: https://lkml.kernel.org/r/[email protected]
1 parent 2f75d9e commit ec0f7cd

File tree

2 files changed

+216
-0
lines changed

2 files changed

+216
-0
lines changed

include/trace/events/irq_matrix.h

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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>

kernel/irq/matrix.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ struct irq_matrix {
3636
unsigned long system_map[IRQ_MATRIX_SIZE];
3737
};
3838

39+
#define CREATE_TRACE_POINTS
40+
#include <trace/events/irq_matrix.h>
41+
3942
/**
4043
* irq_alloc_matrix - Allocate a irq_matrix structure and initialize it
4144
* @matrix_bits: Number of matrix bits must be <= IRQ_MATRIX_BITS
@@ -84,6 +87,7 @@ void irq_matrix_online(struct irq_matrix *m)
8487
m->global_available += cm->available;
8588
cm->online = true;
8689
m->online_maps++;
90+
trace_irq_matrix_online(m);
8791
}
8892

8993
/**
@@ -98,6 +102,7 @@ void irq_matrix_offline(struct irq_matrix *m)
98102
m->global_available -= cm->available;
99103
cm->online = false;
100104
m->online_maps--;
105+
trace_irq_matrix_offline(m);
101106
}
102107

103108
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,
145150
}
146151
if (bit >= m->alloc_start && bit < m->alloc_end)
147152
m->systembits_inalloc++;
153+
154+
trace_irq_matrix_assign_system(bit, m);
148155
}
149156

150157
/**
@@ -172,6 +179,7 @@ int irq_matrix_reserve_managed(struct irq_matrix *m, const struct cpumask *msk)
172179
cm->available--;
173180
m->global_available--;
174181
}
182+
trace_irq_matrix_reserve_managed(bit, cpu, m, cm);
175183
}
176184
return 0;
177185
cleanup:
@@ -221,6 +229,7 @@ void irq_matrix_remove_managed(struct irq_matrix *m, const struct cpumask *msk)
221229
cm->available++;
222230
m->global_available++;
223231
}
232+
trace_irq_matrix_remove_managed(bit, cpu, m, cm);
224233
}
225234
}
226235

@@ -242,6 +251,7 @@ int irq_matrix_alloc_managed(struct irq_matrix *m, unsigned int cpu)
242251
set_bit(bit, cm->alloc_map);
243252
cm->allocated++;
244253
m->total_allocated++;
254+
trace_irq_matrix_alloc_managed(bit, cpu, m, cm);
245255
return bit;
246256
}
247257

@@ -264,6 +274,7 @@ void irq_matrix_assign(struct irq_matrix *m, unsigned int bit)
264274
m->total_allocated++;
265275
cm->available--;
266276
m->global_available--;
277+
trace_irq_matrix_assign(bit, smp_processor_id(), m, cm);
267278
}
268279

269280
/**
@@ -282,6 +293,7 @@ void irq_matrix_reserve(struct irq_matrix *m)
282293
pr_warn("Interrupt reservation exceeds available resources\n");
283294

284295
m->global_reserved++;
296+
trace_irq_matrix_reserve(m);
285297
}
286298

287299
/**
@@ -296,6 +308,7 @@ void irq_matrix_reserve(struct irq_matrix *m)
296308
void irq_matrix_remove_reserved(struct irq_matrix *m)
297309
{
298310
m->global_reserved--;
311+
trace_irq_matrix_remove_reserved(m);
299312
}
300313

301314
/**
@@ -326,6 +339,7 @@ int irq_matrix_alloc(struct irq_matrix *m, const struct cpumask *msk,
326339
if (reserved)
327340
m->global_reserved--;
328341
*mapped_cpu = cpu;
342+
trace_irq_matrix_alloc(bit, cpu, m, cm);
329343
return bit;
330344
}
331345
}
@@ -357,6 +371,7 @@ void irq_matrix_free(struct irq_matrix *m, unsigned int cpu,
357371
m->global_available++;
358372
}
359373
}
374+
trace_irq_matrix_free(bit, cpu, m, cm);
360375
}
361376

362377
/**

0 commit comments

Comments
 (0)