Commit 86d2a2f5 authored by Bitao Hu's avatar Bitao Hu Committed by Thomas Gleixner
Browse files

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: default avatarThomas Gleixner <tglx@linutronix.de>
Signed-off-by: default avatarBitao Hu <yaoma@linux.alibaba.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20240411074134.30922-2-yaoma@linux.alibaba.com
parent 81e4cb0f
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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,
+1 −1
Original line number Diff line number Diff line
@@ -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

+1 −1
Original line number Diff line number Diff line
@@ -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);
}

+10 −2
Original line number Diff line number Diff line
@@ -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)
+1 −1
Original line number Diff line number Diff line
@@ -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);
}

Loading