]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
irqchip/gic-v3-its: Don't enable interrupts in its_irq_set_vcpu_affinity()
authorTomas Krcka <krckatom@amazon.de>
Mon, 30 Dec 2024 15:08:25 +0000 (15:08 +0000)
committerThomas Gleixner <tglx@linutronix.de>
Wed, 15 Jan 2025 08:42:45 +0000 (09:42 +0100)
The following call-chain leads to enabling interrupts in a nested interrupt
disabled section:

irq_set_vcpu_affinity()
  irq_get_desc_lock()
     raw_spin_lock_irqsave()   <--- Disable interrupts
  its_irq_set_vcpu_affinity()
     guard(raw_spinlock_irq)   <--- Enables interrupts when leaving the guard()
  irq_put_desc_unlock()        <--- Warns because interrupts are enabled

This was broken in commit b97e8a2f7130, which replaced the original
raw_spin_[un]lock() pair with guard(raw_spinlock_irq).

Fix the issue by using guard(raw_spinlock).

[ tglx: Massaged change log ]

Fixes: b97e8a2f7130 ("irqchip/gic-v3-its: Fix potential race condition in its_vlpi_prop_update()")
Signed-off-by: Tomas Krcka <krckatom@amazon.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Marc Zyngier <maz@kernel.org>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/all/20241230150825.62894-1-krckatom@amazon.de
drivers/irqchip/irq-gic-v3-its.c

index 92244cfa04647b48ea4521cc6cb9304b1a7e27b4..8c3ec5734f1ef47decdf231e50e5d06fe49cb9eb 100644 (file)
@@ -2045,7 +2045,7 @@ static int its_irq_set_vcpu_affinity(struct irq_data *d, void *vcpu_info)
        if (!is_v4(its_dev->its))
                return -EINVAL;
 
-       guard(raw_spinlock_irq)(&its_dev->event_map.vlpi_lock);
+       guard(raw_spinlock)(&its_dev->event_map.vlpi_lock);
 
        /* Unmap request? */
        if (!info)