All of lore.kernel.org
 help / color / mirror / Atom feed
From: Valentin Rothberg <valentinrothberg@gmail.com>
To: sasha.levin@oracle.com
Cc: broonie@opensource.wolfsonmicro.com,
	Julia Lawall <julia.lawall@lip6.fr>,
	linux-kernel@vger.kernel.org, fengguang.wu@intel.com
Subject: Re: drivers/power/wm831x_power.c:569:7-27: ERROR: Threaded IRQ with no primary handler requested without IRQF_ONESHOT
Date: Tue, 22 Sep 2015 19:28:23 +0200	[thread overview]
Message-ID: <20150922172823.GA13598@ubuntu-vm> (raw)

[-- Attachment #1: Type: text/PLAIN, Size: 3870 bytes --]

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 <fengguang.wu@intel.com>
To: kbuild@01.org
Cc: Julia Lawall <julia.lawall@lip6.fr>
Subject: drivers/power/wm831x_power.c:569:7-27: ERROR: Threaded IRQ with no
    primary handler requested without IRQF_ONESHOT

TO: Sasha Levin <sasha.levin@oracle.com>
CC: kbuild-all@01.org
CC: Andrew Morton <akpm@linux-foundation.org>
CC: Linux Memory Management List <linux-mm@kvack.org>

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 <broonie@opensource.wolfsonmicro.com>
:::::: CC: Anton Vorontsov <cbouatmailru@gmail.com>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: 0001-wm831x_power-Use-IRQF_ONESHOT-to-request-threaded-IR.patch --]
[-- Type: text/x-diff, Size: 2067 bytes --]

>From bceb7cace76aba9212db56be939bfecaacb75bc2 Mon Sep 17 00:00:00 2001
From: Valentin Rothberg <valentinrothberg@gmail.com>
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 <valentinrothberg@gmail.com>
---
 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	other threads:[~2015-09-22 17:28 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-09-22 17:28 Valentin Rothberg [this message]
2015-09-22 19:41 ` drivers/power/wm831x_power.c:569:7-27: ERROR: Threaded IRQ with no primary handler requested without IRQF_ONESHOT Sasha Levin
2015-09-22 20:01   ` Valentin Rothberg
2015-09-26 16:52     ` Sebastian Reichel
2015-09-26 17:21 ` Sebastian Reichel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150922172823.GA13598@ubuntu-vm \
    --to=valentinrothberg@gmail.com \
    --cc=broonie@opensource.wolfsonmicro.com \
    --cc=fengguang.wu@intel.com \
    --cc=julia.lawall@lip6.fr \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sasha.levin@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.