gpiolib: fix line event timestamps for nested irqs
PATCH 1/1 gpiolib: fix line event timestamps for nested irqs
From: Bartosz Golaszewski <[email protected]>
Nested interrupts run inside the calling thread's context and the top half handler is never called which means that we never read the timestamp.
This issue came up when trying to read line events from a gpiochip using regmap_irq_chip for interrupts.
Fix it by reading the timestamp from the irq thread function if it's still 0 by the time the second handler is called.
--- drivers/gpio/gpiolib.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/gpio/gpiolib.c +7 -0
@@ -828,6 +828,13 @@ static irqreturn_t lineevent_irq_thread(int irq, void *p)/* Do not leak kernel stack to userspace */ memset (&ge,0 ,sizeof (ge)); +/* +* We may be running from a nested threaded interrupt in which case +* we didn't get the timestamp from lineevent_irq_handler(). +*/ +if (!le->timestamp) + le->timestamp =ktime_get_real_ns (); + ge.timestamp = le->timestamp; if (le->eflags & GPIOEVENT_REQUEST_RISING_EDGE
Signature · 1 line
2.19.1
Quoted 6 lines · Bartosz Golaszewski
From: Bartosz Golaszewski <[email protected]>
Nested interrupts run inside the calling thread's context and the top half handler is never called which means that we never read the timestamp.
Quoted 7 lines
This issue came up when trying to read line events from a gpiochip using
regmap_irq_chipfor interrupts.Fix it by reading the timestamp from the irq thread function if it's still 0 by the time the second handler is called.
Signed-off-by Bartosz Golaszewski <[email protected]>
Oh that's right. Should this not have Fixes: and Cc: stable?
drivers/gpio/gpiolib.c static irqreturn_t lineevent_irq_thread(int irq, void *p) · line 838
Quoted 8 lines
drivers/gpio/gpiolib.c +7
-0+/* +* We may be running from a nested threaded interrupt in which case +* we didn't get the timestamp from lineevent_irq_handler(). +*/ +if (!le->timestamp) + le->timestamp =ktime_get_real_ns (); + ge.timestamp = le->timestamp;
I would merge these:
if (!le->timestamp)
ge.timestamp = ktime_get_real_ns();
else
ge.timestamp = le->timestamp;Yours,
Linus Walleij
pt., 11 sty 2019 o 13:19 Linus Walleij <[email protected]> napisał(a):
Quoted 30 lines · Bartosz Golaszewski
Quoted 7 lines
From: Bartosz Golaszewski <[email protected]>
Nested interrupts run inside the calling thread's context and the top half handler is never called which means that we never read the timestamp.
Quoted 7 lines
This issue came up when trying to read line events from a gpiochip using
regmap_irq_chipfor interrupts.Fix it by reading the timestamp from the irq thread function if it's still 0 by the time the second handler is called.
Signed-off-by Bartosz Golaszewski <[email protected]>Oh that's right. Should this not have Fixes: and Cc: stable?
drivers/gpio/gpiolib.c static irqreturn_t lineevent_irq_thread(int irq, void *p) · line 838
Quoted 8 lines
drivers/gpio/gpiolib.c +7
-0+/* +* We may be running from a nested threaded interrupt in which case +* we didn't get the timestamp from lineevent_irq_handler(). +*/ +if (!le->timestamp) + le->timestamp =ktime_get_real_ns (); + ge.timestamp = le->timestamp;I would merge these:
Quoted 7 lines
if (!le->timestamp)
ge.timestamp = ktime_get_real_ns(); else ge.timestamp = le->timestamp;Yours,
Linus Walleij
I'll fix both issues and resend.
Bart