irq_desc can be accessed safely in RCU read section as demonstrated by kstat_irqs_usr(). And raw_spin_lock_irqsave() context can provide a rcu read section, which can be utilized to get rid of irq_lock_sparse(). Signed-off-by: Pingfan Liu <kernelfans@xxxxxxxxx> Cc: Heiko Carstens <hca@xxxxxxxxxxxxx> Cc: Vasily Gorbik <gor@xxxxxxxxxxxxx> Cc: Alexander Gordeev <agordeev@xxxxxxxxxxxxx> Cc: Christian Borntraeger <borntraeger@xxxxxxxxxxxxx> Cc: Sven Schnelle <svens@xxxxxxxxxxxxx> Cc: Sebastian Andrzej Siewior <bigeasy@xxxxxxxxxxxxx> Cc: linux-kernel@xxxxxxxxxxxxxxx To: linux-s390@xxxxxxxxxxxxxxx --- arch/s390/kernel/irq.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index 3033f616e256..6302dc7874cf 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c @@ -205,12 +205,13 @@ static void show_msi_interrupt(struct seq_file *p, int irq) unsigned long flags; int cpu; - irq_lock_sparse(); + raw_spin_lock_irqsave(&desc->lock, flags); desc = irq_to_desc(irq); - if (!desc) - goto out; + if (!desc) { + raw_spin_unlock_irqrestore(&desc->lock, flags); + return; + } - raw_spin_lock_irqsave(&desc->lock, flags); seq_printf(p, "%3d: ", irq); for_each_online_cpu(cpu) seq_printf(p, "%10u ", irq_desc_kstat_cpu(desc, cpu)); @@ -223,8 +224,6 @@ static void show_msi_interrupt(struct seq_file *p, int irq) seq_putc(p, '\n'); raw_spin_unlock_irqrestore(&desc->lock, flags); -out: - irq_unlock_sparse(); } /* -- 2.31.1