Hi Sasha,

Julia forwarded the report (see below) to me.  Unless
IRQCHIP_ONESHOT_SAFE is set, requesting a threaded IRQ will always fail
when the primary handler is set to NULL.  In some cases there's a
potential to run into stack overflows.

I attached a patch that fixes the issue.

Kind regards,
 Valentin

---------- Forwarded message ----------
Date: Tue, 22 Sep 2015 21:42:18 +0800
From: kbuild test robot <[email protected]>
To: [email protected]
Cc: Julia Lawall <[email protected]>
Subject: drivers/power/wm831x_power.c:569:7-27: ERROR: Threaded IRQ with no
    primary handler requested without IRQF_ONESHOT

TO: Sasha Levin <[email protected]>
CC: [email protected]
CC: Andrew Morton <[email protected]>
CC: Linux Memory Management List <[email protected]>

Hi Sasha,

First bad commit (maybe != root cause):

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
master
head:   bcee19f424a0d8c26ecf2607b73c690802658b29
commit: 71458cfc782eafe4b27656e078d379a34e472adf kernel: add support for gcc 5
date:   11 months ago
:::::: branch date: 12 hours ago
:::::: commit date: 11 months ago

>> drivers/power/wm831x_power.c:569:7-27: ERROR: Threaded IRQ with no primary 
>> handler requested without IRQF_ONESHOT
   drivers/power/wm831x_power.c:579:7-27: ERROR: Threaded IRQ with no primary 
handler requested without IRQF_ONESHOT
   drivers/power/wm831x_power.c:592:8-28: ERROR: Threaded IRQ with no primary 
handler requested without IRQF_ONESHOT
--
>> drivers/power/88pm860x_battery.c:243:1-4: WARNING: end returns can be 
>> simpified if negative or 0 value

git remote add linus 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git remote update linus
git checkout 71458cfc782eafe4b27656e078d379a34e472adf
vim +569 drivers/power/wm831x_power.c

35c3ae5e Mark Brown 2011-08-16  553     if (ret < 0)
35c3ae5e Mark Brown 2011-08-16  554             goto err_wall;
35c3ae5e Mark Brown 2011-08-16  555     power->have_battery = ret & 
WM831X_CHG_ENA;
35c3ae5e Mark Brown 2011-08-16  556
35c3ae5e Mark Brown 2011-08-16  557     if (power->have_battery) {
35c3ae5e Mark Brown 2011-08-16  558                 battery->name = 
power->battery_name;
35c3ae5e Mark Brown 2011-08-16  559                 battery->properties = 
wm831x_bat_props;
35c3ae5e Mark Brown 2011-08-16  560                 battery->num_properties = 
ARRAY_SIZE(wm831x_bat_props);
35c3ae5e Mark Brown 2011-08-16  561                 battery->get_property = 
wm831x_bat_get_prop;
35c3ae5e Mark Brown 2011-08-16  562                 battery->use_for_apm = 1;
35c3ae5e Mark Brown 2011-08-16  563                 ret = 
power_supply_register(&pdev->dev, battery);
35c3ae5e Mark Brown 2011-08-16  564                 if (ret)
35c3ae5e Mark Brown 2011-08-16  565                         goto err_usb;
35c3ae5e Mark Brown 2011-08-16  566     }
3961f7c3 Mark Brown 2009-08-10  567
cd99758b Mark Brown 2012-05-14  568     irq = wm831x_irq(wm831x, 
platform_get_irq_byname(pdev, "SYSLO"));
b5874f33 Mark Brown 2010-03-10 @569     ret = request_threaded_irq(irq, NULL, 
wm831x_syslo_irq,
b5874f33 Mark Brown 2010-03-10  570                                
IRQF_TRIGGER_RISING, "System power low",
3961f7c3 Mark Brown 2009-08-10  571                                power);
3961f7c3 Mark Brown 2009-08-10  572     if (ret != 0) {
3961f7c3 Mark Brown 2009-08-10  573             dev_err(&pdev->dev, "Failed to 
request SYSLO IRQ %d: %d\n",
3961f7c3 Mark Brown 2009-08-10  574                     irq, ret);
35c3ae5e Mark Brown 2011-08-16  575             goto err_battery;
3961f7c3 Mark Brown 2009-08-10  576     }
3961f7c3 Mark Brown 2009-08-10  577

:::::: The code at line 569 was first introduced by commit
:::::: b5874f33bbaf00586d05de37706491ee37057e11 wm831x_power: Use genirq

:::::: TO: Mark Brown <[email protected]>
:::::: CC: Anton Vorontsov <[email protected]>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
>From bceb7cace76aba9212db56be939bfecaacb75bc2 Mon Sep 17 00:00:00 2001
From: Valentin Rothberg <[email protected]>
Date: Tue, 22 Sep 2015 19:00:40 +0200
Subject: [PATCH] wm831x_power: Use IRQF_ONESHOT to request threaded IRQs

Since commit 1c6c69525b40 ("genirq: Reject bogus threaded irq requests")
threaded IRQs without a primary handler need to be requested with
IRQF_ONESHOT, otherwise the request will fail.

scripts/coccinelle/misc/irqf_oneshot.cocci detected this issue.

Fixes: b5874f33bbaf ("wm831x_power: Use genirq")
Signed-off-by: Valentin Rothberg <[email protected]>
---
 drivers/power/wm831x_power.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/power/wm831x_power.c b/drivers/power/wm831x_power.c
index db11ae6599f3..25f8b3409935 100644
--- a/drivers/power/wm831x_power.c
+++ b/drivers/power/wm831x_power.c
@@ -572,7 +572,7 @@ static int wm831x_power_probe(struct platform_device *pdev)
 
 	irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "SYSLO"));
 	ret = request_threaded_irq(irq, NULL, wm831x_syslo_irq,
-				   IRQF_TRIGGER_RISING, "System power low",
+				   IRQF_TRIGGER_RISING | IRQF_ONESHOT, "System power low",
 				   power);
 	if (ret != 0) {
 		dev_err(&pdev->dev, "Failed to request SYSLO IRQ %d: %d\n",
@@ -582,7 +582,7 @@ static int wm831x_power_probe(struct platform_device *pdev)
 
 	irq = wm831x_irq(wm831x, platform_get_irq_byname(pdev, "PWR SRC"));
 	ret = request_threaded_irq(irq, NULL, wm831x_pwr_src_irq,
-				   IRQF_TRIGGER_RISING, "Power source",
+				   IRQF_TRIGGER_RISING | IRQF_ONESHOT, "Power source",
 				   power);
 	if (ret != 0) {
 		dev_err(&pdev->dev, "Failed to request PWR SRC IRQ %d: %d\n",
@@ -595,7 +595,7 @@ static int wm831x_power_probe(struct platform_device *pdev)
 				 platform_get_irq_byname(pdev,
 							 wm831x_bat_irqs[i]));
 		ret = request_threaded_irq(irq, NULL, wm831x_bat_irq,
-					   IRQF_TRIGGER_RISING,
+					   IRQF_TRIGGER_RISING | IRQF_ONESHOT,
 					   wm831x_bat_irqs[i],
 					   power);
 		if (ret != 0) {
-- 
1.9.1

Reply via email to