Re: [patch v2 04/14] x86/irq: Make irqstats array based
From: Thomas Gleixner
Date: Tue Mar 24 2026 - 16:24:27 EST
On Tue, Mar 24 2026 at 20:54, Thomas Gleixner wrote:
> On Mon, Mar 23 2026 at 15:24, Radu Rendec wrote:
>> On Fri, 2026-03-20 at 14:21 +0100, Thomas Gleixner wrote:
>>> arch/x86/include/asm/hardirq.h | 69 +++++-----
>>
>> I believe this breaks scripts/gdb/linux/interrupts.py, particularly the
>> x86_show_irqstat() function, which still expects individual members in
>> struct irq_cpustat_t.
>
> Uurg. I did not even know this exists. Let me try to polish the snake.
Something like the below should work, now I have to figure out how to
test it.
----
--- a/scripts/gdb/linux/interrupts.py
+++ b/scripts/gdb/linux/interrupts.py
@@ -97,8 +97,8 @@ irq_desc_type = utils.CachedType("struct
text += "%*s: %10u\n" % (prec, "ERR", cnt['counter'])
return text
-def x86_show_irqstat(prec, pfx, field, desc):
- irq_stat = gdb.parse_and_eval("&irq_stat")
+def x86_show_irqstat(prec, pfx, idx, desc):
+ irq_stat = gdb.parse_and_eval("&irq_stat.counts[IRQ_COUNT_%s]" %idx)
text = "%*s: " % (prec, pfx)
for cpu in cpus.each_online_cpu():
stat = cpus.per_cpu(irq_stat, cpu)
@@ -118,32 +118,51 @@ irq_desc_type = utils.CachedType("struct
text = x86_show_irqstat(prec, "NMI", '__nmi_count', 'Non-maskable interrupts')
if constants.LX_CONFIG_X86_LOCAL_APIC:
- text += x86_show_irqstat(prec, "LOC", 'apic_timer_irqs', "Local timer interrupts")
- text += x86_show_irqstat(prec, "SPU", 'irq_spurious_count', "Spurious interrupts")
- text += x86_show_irqstat(prec, "PMI", 'apic_perf_irqs', "Performance monitoring interrupts")
- text += x86_show_irqstat(prec, "IWI", 'apic_irq_work_irqs', "IRQ work interrupts")
- text += x86_show_irqstat(prec, "RTR", 'icr_read_retry_count', "APIC ICR read retries")
+ text += x86_show_irqstat(prec, "LOC", 'APIC_TIMER', "Local timer interrupts")
+ text += x86_show_irqstat(prec, "SPU", 'SPURIOUS', "Spurious interrupts")
+ text += x86_show_irqstat(prec, "PMI", 'APIC_PERF', "Performance monitoring interrupts")
+ text += x86_show_irqstat(prec, "IWI", 'IRQ_WORK', "IRQ work interrupts")
+ text += x86_show_irqstat(prec, "RTR", 'ICR_READ_RETRY', "APIC ICR read retries")
if utils.gdb_eval_or_none("x86_platform_ipi_callback") is not None:
- text += x86_show_irqstat(prec, "PLT", 'x86_platform_ipis', "Platform interrupts")
+ text += x86_show_irqstat(prec, "PLT", 'X86_PLATFORM_IPI', "Platform interrupts")
if constants.LX_CONFIG_SMP:
- text += x86_show_irqstat(prec, "RES", 'irq_resched_count', "Rescheduling interrupts")
- text += x86_show_irqstat(prec, "CAL", 'irq_call_count', "Function call interrupts")
- text += x86_show_irqstat(prec, "TLB", 'irq_tlb_count', "TLB shootdowns")
+ text += x86_show_irqstat(prec, "RES", 'RESCHEDULE', "Rescheduling interrupts")
+ text += x86_show_irqstat(prec, "CAL", 'CALL_FUNCTION', "Function call interrupts")
+
+ text += x86_show_irqstat(prec, "TLB", 'TLB', "TLB shootdowns")
if constants.LX_CONFIG_X86_THERMAL_VECTOR:
- text += x86_show_irqstat(prec, "TRM", 'irq_thermal_count', "Thermal events interrupts")
+ text += x86_show_irqstat(prec, "TRM", 'THERMAL_APIC', "Thermal events interrupts")
if constants.LX_CONFIG_X86_MCE_THRESHOLD:
- text += x86_show_irqstat(prec, "THR", 'irq_threshold_count', "Threshold APIC interrupts")
+ text += x86_show_irqstat(prec, "THR", 'THRESHOLD_APIC', "Threshold APIC interrupts")
if constants.LX_CONFIG_X86_MCE_AMD:
- text += x86_show_irqstat(prec, "DFR", 'irq_deferred_error_count', "Deferred Error APIC interrupts")
+ text += x86_show_irqstat(prec, "DFR", 'DEFERRED_ERROR', "Deferred Error APIC interrupts")
if constants.LX_CONFIG_X86_MCE:
text += x86_show_mce(prec, "&mce_exception_count", "MCE", "Machine check exceptions")
text += x86_show_mce(prec, "&mce_poll_count", "MCP", "Machine check polls")
+ if constants.LX_CONFIG_X86_HV_CALLBACK_VECTOR:
+ text += x86_show_irqstat(prec, 'HYP', 'HYPERVISOR_CALLBACK', 'Hypervisor callback interrupts')
+
+ if constants.LX_CONFIG_HYPERV:
+ text += x86_show_irqstat(prec, 'HRE', 'HYPERV_REENLIGHTENMENT', 'Hyper-V reenlightenment interrupts')
+ text += x86_show_irqstat(prec, 'HVS', 'HYPERV_STIMER0', 'Hyper-V stimer0 interrupts')
+
+ if constants.LX_CONFIG_KVM:
+ text += x86_show_irqstat(prec, "PIN", 'POSTED_INTR', 'Posted-interrupt notification event')
+ text += x86_show_irqstat(prec, "NPI", 'POSTED_INTR_NESTED', 'Nested posted-interrupt event')
+ text += x86_show_irqstat(prec, "PIW", 'POSTED_INTR_WAKEUP', 'Posted-interrupt wakeup event')
+
+ if constants.LX_CONFIG_GUEST_PERF_EVENTS:
+ text += x86_show_irqstat(prec, "VPMI", 'PERF_GUEST_MEDIATED_PMI', 'Perf Guest Mediated PMI')
+
+ if constants.LX_CONFIG_X86_POSTED_MSI:
+ text += x86_show_irqstat(prec, "PIN", 'POSTED_MSI_NOTIFICATION', 'Posted MSI notification event')
+
text += show_irq_err_count(prec)
if constants.LX_CONFIG_X86_IO_APIC:
@@ -151,11 +170,6 @@ irq_desc_type = utils.CachedType("struct
if cnt is not None:
text += "%*s: %10u\n" % (prec, "MIS", cnt['counter'])
- if constants.LX_CONFIG_KVM:
- text += x86_show_irqstat(prec, "PIN", 'kvm_posted_intr_ipis', 'Posted-interrupt notification event')
- text += x86_show_irqstat(prec, "NPI", 'kvm_posted_intr_nested_ipis', 'Nested posted-interrupt event')
- text += x86_show_irqstat(prec, "PIW", 'kvm_posted_intr_wakeup_ipis', 'Posted-interrupt wakeup event')
-
return text
def arm_common_show_interrupts(prec):