x86/hpet: do local APIC EOI after interrupt processing

The current logic in the HPET interrupt ->ack() hook will perform a local
APIC EOI ahead of enabling interrupts, possibly leading to recursion in the
interrupt handler.

Fix this by doing the local APIC EOI strictly after the window with
interrupt enabled, as that prevents the recursion, and would only allow for
interrupts with higher priority to be serviced.

Use the generic ack_nonmaskable_msi_irq() and end_nonmaskable_irq()
functions, removing the need for hpet_msi_ack().

Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
Fixes: 3ba523ff95 ('CPUIDLE: enable MSI capable HPET for timer broadcast')
Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
master commit: 1db7829e56
master date: 2025-08-06 10:47:16 +0200
This commit is contained in:
Roger Pau Monné authored and Jan Beulich committed 2025-09-03 13:54:21 +02:00
1 parent ea5025554e
commit 67fcd2d2e5
1 file changed
+2 -8
+2 -8
View File
@@ -299,13 +299,6 @@ static unsigned int cf_check hpet_msi_startup(struct irq_desc *desc)
#define hpet_msi_shutdown hpet_msi_mask
static void cf_check hpet_msi_ack(struct irq_desc *desc)
{
irq_complete_move(desc);
move_native_irq(desc);
ack_APIC_irq();
}
static void cf_check hpet_msi_set_affinity(
struct irq_desc *desc, const cpumask_t *mask)
{
@@ -333,7 +326,8 @@ static hw_irq_controller hpet_msi_type = {
.shutdown = hpet_msi_shutdown,
.enable = hpet_msi_unmask,
.disable = hpet_msi_mask,
.ack = hpet_msi_ack,
.ack = ack_nonmaskable_msi_irq,
.end = end_nonmaskable_irq,
.set_affinity = hpet_msi_set_affinity,
};
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.