[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen master] x86/hpet: do local APIC EOI after interrupt processing



commit 1db7829e56578970c1037c4dd1c27f939be4c054
Author:     Roger Pau Monne <roger.pau@xxxxxxxxxx>
AuthorDate: Tue Aug 5 11:25:15 2025 +0200
Commit:     Roger Pau Monne <roger.pau@xxxxxxxxxx>
CommitDate: Wed Aug 6 10:47:16 2025 +0200

    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@xxxxxxxxxx>
    Fixes: 3ba523ff957c ('CPUIDLE: enable MSI capable HPET for timer broadcast')
    Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
    Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
---
 xen/arch/x86/hpet.c | 10 ++--------
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/xen/arch/x86/hpet.c b/xen/arch/x86/hpet.c
index 192de433cf..d05b5eb136 100644
--- a/xen/arch/x86/hpet.c
+++ b/xen/arch/x86/hpet.c
@@ -303,13 +303,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)
 {
@@ -337,7 +330,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,
 };
 
--
generated by git-patchbot for /home/xen/git/xen.git#master



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.