Messages in this thread Patch in this message | | | Date | Thu, 21 Apr 2022 11:36:17 +0800 | From | Pingfan Liu <> | Subject | Re: [PATCH 4/9] s390/irq: utilize RCU instead of irq_lock_sparse() in show_msi_interrupt() |
| |
On Wed, Apr 20, 2022 at 08:16:37PM +0200, Heiko Carstens wrote: > On Wed, Apr 20, 2022 at 10:05:16PM +0800, Pingfan Liu wrote: > > 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@gmail.com> > > Cc: Heiko Carstens <hca@linux.ibm.com> > > Cc: Vasily Gorbik <gor@linux.ibm.com> > > Cc: Alexander Gordeev <agordeev@linux.ibm.com> > > Cc: Christian Borntraeger <borntraeger@linux.ibm.com> > > Cc: Sven Schnelle <svens@linux.ibm.com> > > Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de> > > Cc: linux-kernel@vger.kernel.org > > To: linux-s390@vger.kernel.org > > --- > > 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); > > How is this supposed to work? desc get's initialized after its random > stack value has been used as a pointer to lock something...
Oops. You are right. What about using rcu_read_lock() directly?
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c index 3033f616e256..45393919fe61 100644 --- a/arch/s390/kernel/irq.c +++ b/arch/s390/kernel/irq.c @@ -205,7 +205,7 @@ static void show_msi_interrupt(struct seq_file *p, int irq) unsigned long flags; int cpu; - irq_lock_sparse(); + rcu_read_lock(); desc = irq_to_desc(irq); if (!desc) goto out; @@ -224,7 +224,7 @@ 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(); + rcu_read_unlock(); } /*
Thanks,
Pingfan
| |