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
This commit is contained in:
parent
81e4cb0fd4
commit
86d2a2f51f
|
@ -756,7 +756,7 @@ void __init arch_init_irq(void)
|
|||
NULL))
|
||||
pr_err("Failed to register fpu interrupt\n");
|
||||
desc_fpu = irq_to_desc(irq_fpu);
|
||||
fpu_kstat_irq = this_cpu_ptr(desc_fpu->kstat_irqs);
|
||||
fpu_kstat_irq = this_cpu_ptr(&desc_fpu->kstat_irqs->cnt);
|
||||
}
|
||||
if (dec_interrupt[DEC_IRQ_CASCADE] >= 0) {
|
||||
if (request_irq(dec_interrupt[DEC_IRQ_CASCADE], no_action,
|
||||
|
|
|
@ -344,7 +344,7 @@ static int smp_boot_one_cpu(int cpuid, struct task_struct *idle)
|
|||
struct irq_desc *desc = irq_to_desc(i);
|
||||
|
||||
if (desc && desc->kstat_irqs)
|
||||
*per_cpu_ptr(desc->kstat_irqs, cpuid) = 0;
|
||||
*per_cpu_ptr(desc->kstat_irqs, cpuid) = (struct irqstat) { };
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -837,7 +837,7 @@ static inline void this_cpu_inc_rm(unsigned int __percpu *addr)
|
|||
*/
|
||||
static void kvmppc_rm_handle_irq_desc(struct irq_desc *desc)
|
||||
{
|
||||
this_cpu_inc_rm(desc->kstat_irqs);
|
||||
this_cpu_inc_rm(&desc->kstat_irqs->cnt);
|
||||
__this_cpu_inc(kstat.irqs_sum);
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,14 @@ struct irq_desc;
|
|||
struct irq_domain;
|
||||
struct pt_regs;
|
||||
|
||||
/**
|
||||
* struct irqstat - interrupt statistics
|
||||
* @cnt: real-time interrupt count
|
||||
*/
|
||||
struct irqstat {
|
||||
unsigned int cnt;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct irq_desc - interrupt descriptor
|
||||
* @irq_common_data: per irq and chip data passed down to chip functions
|
||||
|
@ -55,7 +63,7 @@ struct pt_regs;
|
|||
struct irq_desc {
|
||||
struct irq_common_data irq_common_data;
|
||||
struct irq_data irq_data;
|
||||
unsigned int __percpu *kstat_irqs;
|
||||
struct irqstat __percpu *kstat_irqs;
|
||||
irq_flow_handler_t handle_irq;
|
||||
struct irqaction *action; /* IRQ action list */
|
||||
unsigned int status_use_accessors;
|
||||
|
@ -119,7 +127,7 @@ extern struct irq_desc irq_desc[NR_IRQS];
|
|||
static inline unsigned int irq_desc_kstat_cpu(struct irq_desc *desc,
|
||||
unsigned int cpu)
|
||||
{
|
||||
return desc->kstat_irqs ? *per_cpu_ptr(desc->kstat_irqs, cpu) : 0;
|
||||
return desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, cpu) : 0;
|
||||
}
|
||||
|
||||
static inline struct irq_desc *irq_data_to_desc(struct irq_data *data)
|
||||
|
|
|
@ -258,7 +258,7 @@ static inline void irq_state_set_masked(struct irq_desc *desc)
|
|||
|
||||
static inline void __kstat_incr_irqs_this_cpu(struct irq_desc *desc)
|
||||
{
|
||||
__this_cpu_inc(*desc->kstat_irqs);
|
||||
__this_cpu_inc(desc->kstat_irqs->cnt);
|
||||
__this_cpu_inc(kstat.irqs_sum);
|
||||
}
|
||||
|
||||
|
|
|
@ -134,7 +134,7 @@ static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node,
|
|||
desc->name = NULL;
|
||||
desc->owner = owner;
|
||||
for_each_possible_cpu(cpu)
|
||||
*per_cpu_ptr(desc->kstat_irqs, cpu) = 0;
|
||||
*per_cpu_ptr(desc->kstat_irqs, cpu) = (struct irqstat) { };
|
||||
desc_smp_init(desc, node, affinity);
|
||||
}
|
||||
|
||||
|
@ -186,7 +186,7 @@ static int init_desc(struct irq_desc *desc, int irq, int node,
|
|||
const struct cpumask *affinity,
|
||||
struct module *owner)
|
||||
{
|
||||
desc->kstat_irqs = alloc_percpu(unsigned int);
|
||||
desc->kstat_irqs = alloc_percpu(struct irqstat);
|
||||
if (!desc->kstat_irqs)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -968,8 +968,7 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
|
|||
{
|
||||
struct irq_desc *desc = irq_to_desc(irq);
|
||||
|
||||
return desc && desc->kstat_irqs ?
|
||||
*per_cpu_ptr(desc->kstat_irqs, cpu) : 0;
|
||||
return desc && desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, cpu) : 0;
|
||||
}
|
||||
|
||||
static bool irq_is_nmi(struct irq_desc *desc)
|
||||
|
@ -991,7 +990,7 @@ static unsigned int kstat_irqs(unsigned int irq)
|
|||
return data_race(desc->tot_count);
|
||||
|
||||
for_each_possible_cpu(cpu)
|
||||
sum += data_race(*per_cpu_ptr(desc->kstat_irqs, cpu));
|
||||
sum += data_race(per_cpu(desc->kstat_irqs->cnt, cpu));
|
||||
return sum;
|
||||
}
|
||||
|
||||
|
|
|
@ -490,7 +490,7 @@ int show_interrupts(struct seq_file *p, void *v)
|
|||
|
||||
if (desc->kstat_irqs) {
|
||||
for_each_online_cpu(j)
|
||||
any_count |= data_race(*per_cpu_ptr(desc->kstat_irqs, j));
|
||||
any_count |= data_race(per_cpu(desc->kstat_irqs->cnt, j));
|
||||
}
|
||||
|
||||
if ((!desc->action || irq_desc_is_chained(desc)) && !any_count)
|
||||
|
@ -498,8 +498,7 @@ int show_interrupts(struct seq_file *p, void *v)
|
|||
|
||||
seq_printf(p, "%*d: ", prec, i);
|
||||
for_each_online_cpu(j)
|
||||
seq_printf(p, "%10u ", desc->kstat_irqs ?
|
||||
*per_cpu_ptr(desc->kstat_irqs, j) : 0);
|
||||
seq_printf(p, "%10u ", desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, j) : 0);
|
||||
|
||||
raw_spin_lock_irqsave(&desc->lock, flags);
|
||||
if (desc->irq_data.chip) {
|
||||
|
|
|
@ -37,7 +37,7 @@ def show_irq_desc(prec, irq):
|
|||
any_count = 0
|
||||
if desc['kstat_irqs']:
|
||||
for cpu in cpus.each_online_cpu():
|
||||
any_count += cpus.per_cpu(desc['kstat_irqs'], cpu)
|
||||
any_count += cpus.per_cpu(desc['kstat_irqs'], cpu)['cnt']
|
||||
|
||||
if (desc['action'] == 0 or irq_desc_is_chained(desc)) and any_count == 0:
|
||||
return text;
|
||||
|
@ -45,7 +45,7 @@ def show_irq_desc(prec, irq):
|
|||
text += "%*d: " % (prec, irq)
|
||||
for cpu in cpus.each_online_cpu():
|
||||
if desc['kstat_irqs']:
|
||||
count = cpus.per_cpu(desc['kstat_irqs'], cpu)
|
||||
count = cpus.per_cpu(desc['kstat_irqs'], cpu)['cnt']
|
||||
else:
|
||||
count = 0
|
||||
text += "%10u" % (count)
|
||||
|
@ -177,7 +177,7 @@ def arm_common_show_interrupts(prec):
|
|||
if desc == 0:
|
||||
continue
|
||||
for cpu in cpus.each_online_cpu():
|
||||
text += "%10u" % (cpus.per_cpu(desc['kstat_irqs'], cpu))
|
||||
text += "%10u" % (cpus.per_cpu(desc['kstat_irqs'], cpu)['cnt'])
|
||||
text += " %s" % (ipi_types[ipi].string())
|
||||
text += "\n"
|
||||
return text
|
||||
|
|
Loading…
Reference in New Issue