Skip to content

Commit 86d2a2f

Browse files
hubitao-yaomaKAGA-KOKO
authored andcommitted
genirq: Convert kstat_irqs to a struct
The irq_desc::kstat_irqs member is a per-CPU variable of type int, which is only capable of counting. A snapshot mechanism for interrupt statistics will be added soon, which requires an additional variable to store the snapshot. To facilitate expansion, convert kstat_irqs here to a struct containing only the count. Originally-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Bitao Hu <yaoma@linux.alibaba.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20240411074134.30922-2-yaoma@linux.alibaba.com
1 parent 81e4cb0 commit 86d2a2f

8 files changed

Lines changed: 23 additions & 17 deletions

File tree

arch/mips/dec/setup.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ void __init arch_init_irq(void)
756756
NULL))
757757
pr_err("Failed to register fpu interrupt\n");
758758
desc_fpu = irq_to_desc(irq_fpu);
759-
fpu_kstat_irq = this_cpu_ptr(desc_fpu->kstat_irqs);
759+
fpu_kstat_irq = this_cpu_ptr(&desc_fpu->kstat_irqs->cnt);
760760
}
761761
if (dec_interrupt[DEC_IRQ_CASCADE] >= 0) {
762762
if (request_irq(dec_interrupt[DEC_IRQ_CASCADE], no_action,

arch/parisc/kernel/smp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ static int smp_boot_one_cpu(int cpuid, struct task_struct *idle)
344344
struct irq_desc *desc = irq_to_desc(i);
345345

346346
if (desc && desc->kstat_irqs)
347-
*per_cpu_ptr(desc->kstat_irqs, cpuid) = 0;
347+
*per_cpu_ptr(desc->kstat_irqs, cpuid) = (struct irqstat) { };
348348
}
349349
#endif
350350

arch/powerpc/kvm/book3s_hv_rm_xics.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -837,7 +837,7 @@ static inline void this_cpu_inc_rm(unsigned int __percpu *addr)
837837
*/
838838
static void kvmppc_rm_handle_irq_desc(struct irq_desc *desc)
839839
{
840-
this_cpu_inc_rm(desc->kstat_irqs);
840+
this_cpu_inc_rm(&desc->kstat_irqs->cnt);
841841
__this_cpu_inc(kstat.irqs_sum);
842842
}
843843

include/linux/irqdesc.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ struct irq_desc;
1717
struct irq_domain;
1818
struct pt_regs;
1919

20+
/**
21+
* struct irqstat - interrupt statistics
22+
* @cnt: real-time interrupt count
23+
*/
24+
struct irqstat {
25+
unsigned int cnt;
26+
};
27+
2028
/**
2129
* struct irq_desc - interrupt descriptor
2230
* @irq_common_data: per irq and chip data passed down to chip functions
@@ -55,7 +63,7 @@ struct pt_regs;
5563
struct irq_desc {
5664
struct irq_common_data irq_common_data;
5765
struct irq_data irq_data;
58-
unsigned int __percpu *kstat_irqs;
66+
struct irqstat __percpu *kstat_irqs;
5967
irq_flow_handler_t handle_irq;
6068
struct irqaction *action; /* IRQ action list */
6169
unsigned int status_use_accessors;
@@ -119,7 +127,7 @@ extern struct irq_desc irq_desc[NR_IRQS];
119127
static inline unsigned int irq_desc_kstat_cpu(struct irq_desc *desc,
120128
unsigned int cpu)
121129
{
122-
return desc->kstat_irqs ? *per_cpu_ptr(desc->kstat_irqs, cpu) : 0;
130+
return desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, cpu) : 0;
123131
}
124132

125133
static inline struct irq_desc *irq_data_to_desc(struct irq_data *data)

kernel/irq/internals.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ static inline void irq_state_set_masked(struct irq_desc *desc)
258258

259259
static inline void __kstat_incr_irqs_this_cpu(struct irq_desc *desc)
260260
{
261-
__this_cpu_inc(*desc->kstat_irqs);
261+
__this_cpu_inc(desc->kstat_irqs->cnt);
262262
__this_cpu_inc(kstat.irqs_sum);
263263
}
264264

kernel/irq/irqdesc.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node,
134134
desc->name = NULL;
135135
desc->owner = owner;
136136
for_each_possible_cpu(cpu)
137-
*per_cpu_ptr(desc->kstat_irqs, cpu) = 0;
137+
*per_cpu_ptr(desc->kstat_irqs, cpu) = (struct irqstat) { };
138138
desc_smp_init(desc, node, affinity);
139139
}
140140

@@ -186,7 +186,7 @@ static int init_desc(struct irq_desc *desc, int irq, int node,
186186
const struct cpumask *affinity,
187187
struct module *owner)
188188
{
189-
desc->kstat_irqs = alloc_percpu(unsigned int);
189+
desc->kstat_irqs = alloc_percpu(struct irqstat);
190190
if (!desc->kstat_irqs)
191191
return -ENOMEM;
192192

@@ -968,8 +968,7 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
968968
{
969969
struct irq_desc *desc = irq_to_desc(irq);
970970

971-
return desc && desc->kstat_irqs ?
972-
*per_cpu_ptr(desc->kstat_irqs, cpu) : 0;
971+
return desc && desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, cpu) : 0;
973972
}
974973

975974
static bool irq_is_nmi(struct irq_desc *desc)
@@ -991,7 +990,7 @@ static unsigned int kstat_irqs(unsigned int irq)
991990
return data_race(desc->tot_count);
992991

993992
for_each_possible_cpu(cpu)
994-
sum += data_race(*per_cpu_ptr(desc->kstat_irqs, cpu));
993+
sum += data_race(per_cpu(desc->kstat_irqs->cnt, cpu));
995994
return sum;
996995
}
997996

kernel/irq/proc.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -490,16 +490,15 @@ int show_interrupts(struct seq_file *p, void *v)
490490

491491
if (desc->kstat_irqs) {
492492
for_each_online_cpu(j)
493-
any_count |= data_race(*per_cpu_ptr(desc->kstat_irqs, j));
493+
any_count |= data_race(per_cpu(desc->kstat_irqs->cnt, j));
494494
}
495495

496496
if ((!desc->action || irq_desc_is_chained(desc)) && !any_count)
497497
goto outsparse;
498498

499499
seq_printf(p, "%*d: ", prec, i);
500500
for_each_online_cpu(j)
501-
seq_printf(p, "%10u ", desc->kstat_irqs ?
502-
*per_cpu_ptr(desc->kstat_irqs, j) : 0);
501+
seq_printf(p, "%10u ", desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, j) : 0);
503502

504503
raw_spin_lock_irqsave(&desc->lock, flags);
505504
if (desc->irq_data.chip) {

scripts/gdb/linux/interrupts.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ def show_irq_desc(prec, irq):
3737
any_count = 0
3838
if desc['kstat_irqs']:
3939
for cpu in cpus.each_online_cpu():
40-
any_count += cpus.per_cpu(desc['kstat_irqs'], cpu)
40+
any_count += cpus.per_cpu(desc['kstat_irqs'], cpu)['cnt']
4141

4242
if (desc['action'] == 0 or irq_desc_is_chained(desc)) and any_count == 0:
4343
return text;
4444

4545
text += "%*d: " % (prec, irq)
4646
for cpu in cpus.each_online_cpu():
4747
if desc['kstat_irqs']:
48-
count = cpus.per_cpu(desc['kstat_irqs'], cpu)
48+
count = cpus.per_cpu(desc['kstat_irqs'], cpu)['cnt']
4949
else:
5050
count = 0
5151
text += "%10u" % (count)
@@ -177,7 +177,7 @@ def arm_common_show_interrupts(prec):
177177
if desc == 0:
178178
continue
179179
for cpu in cpus.each_online_cpu():
180-
text += "%10u" % (cpus.per_cpu(desc['kstat_irqs'], cpu))
180+
text += "%10u" % (cpus.per_cpu(desc['kstat_irqs'], cpu)['cnt'])
181181
text += " %s" % (ipi_types[ipi].string())
182182
text += "\n"
183183
return text

0 commit comments

Comments
 (0)