aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorValentin Rothberg <valentinrothberg@gmail.com>2015-03-05 09:23:08 -0500
committerIngo Molnar <mingo@kernel.org>2015-03-05 14:53:06 -0500
commitd8bf368d0631d4bc2612d8bf2e4e8e74e620d0cc (patch)
treea4f35064af9e579d5b20ee440c1a14ff390b31c2
parent33ca8a53f262b4af40611bea331b8c87d133af72 (diff)
genirq: Remove the deprecated 'IRQF_DISABLED' request_irq() flag entirely
The IRQF_DISABLED flag is a NOOP and has been scheduled for removal since Linux v2.6.36 by commit 6932bf37bed4 ("genirq: Remove IRQF_DISABLED from core code"). According to commit e58aa3d2d0cc ("genirq: Run irq handlers with interrupts disabled"), running IRQ handlers with interrupts enabled can cause stack overflows when the interrupt line of the issuing device is still active. This patch ends the grace period for IRQF_DISABLED (i.e., SA_INTERRUPT in older versions of Linux) and removes the definition and all remaining usages of this flag. There's still a few non-functional references left in the kernel source: - The bigger hunk in Documentation/scsi/ncr53c8xx.txt is removed entirely as IRQF_DISABLED is gone now; the usage in older kernel versions (including the old SA_INTERRUPT flag) should be discouraged. The trouble of using IRQF_SHARED is a general problem and not specific to any driver. - I left the reference in Documentation/PCI/MSI-HOWTO.txt untouched since it has already been removed in linux-next. - All remaining references are changelogs that I suggest to keep. Signed-off-by: Valentin Rothberg <valentinrothberg@gmail.com> Cc: Afzal Mohammed <afzal@ti.com> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Brian Norris <computersforpeace@gmail.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Dan Carpenter <dan.carpenter@oracle.com> Cc: David Woodhouse <dwmw2@infradead.org> Cc: Ewan Milne <emilne@redhat.com> Cc: Eyal Perry <eyalpe@mellanox.com> Cc: Felipe Balbi <balbi@ti.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Hannes Reinecke <hare@suse.de> Cc: Hongliang Tao <taohl@lemote.com> Cc: Huacai Chen <chenhc@lemote.com> Cc: Jiri Kosina <jkosina@suse.cz> Cc: Jonathan Corbet <corbet@lwn.net> Cc: Keerthy <j-keerthy@ti.com> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Nishanth Menon <nm@ti.com> Cc: Paul Bolle <pebolle@tiscali.nl> Cc: Peter Ujfalusi <peter.ujfalusi@ti.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Quentin Lambert <lambert.quentin@gmail.com> Cc: Rajendra Nayak <rnayak@ti.com> Cc: Ralf Baechle <ralf@linux-mips.org> Cc: Santosh Shilimkar <santosh.shilimkar@ti.com> Cc: Sricharan R <r.sricharan@ti.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Tony Lindgren <tony@atomide.com> Cc: Zhou Wang <wangzhou1@hisilicon.com> Cc: iss_storagedev@hp.com Cc: linux-mips@linux-mips.org Cc: linux-mtd@lists.infradead.org Link: http://lkml.kernel.org/r/1425565425-12604-1-git-send-email-valentinrothberg@gmail.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--Documentation/scsi/ncr53c8xx.txt25
-rw-r--r--Documentation/scsi/tmscsim.txt4
-rw-r--r--arch/mips/loongson/loongson-3/hpet.c2
-rw-r--r--drivers/block/cpqarray.c4
-rw-r--r--drivers/bus/omap_l3_noc.c4
-rw-r--r--drivers/bus/omap_l3_smx.c10
-rw-r--r--drivers/mtd/nand/hisi504_nand.c3
-rw-r--r--drivers/usb/isp1760/isp1760-core.c3
-rw-r--r--drivers/usb/isp1760/isp1760-udc.c4
-rw-r--r--include/linux/interrupt.h3
10 files changed, 13 insertions, 49 deletions
diff --git a/Documentation/scsi/ncr53c8xx.txt b/Documentation/scsi/ncr53c8xx.txt
index 1d508dcbf859..8586efff1e99 100644
--- a/Documentation/scsi/ncr53c8xx.txt
+++ b/Documentation/scsi/ncr53c8xx.txt
@@ -786,7 +786,6 @@ port address 0x1400.
786 irqm:1 same as initial settings (assumed BIOS settings) 786 irqm:1 same as initial settings (assumed BIOS settings)
787 irqm:2 always totem pole 787 irqm:2 always totem pole
788 irqm:0x10 driver will not use IRQF_SHARED flag when requesting irq 788 irqm:0x10 driver will not use IRQF_SHARED flag when requesting irq
789 irqm:0x20 driver will not use IRQF_DISABLED flag when requesting irq
790 789
791 (Bits 0x10 and 0x20 can be combined with hardware irq mode option) 790 (Bits 0x10 and 0x20 can be combined with hardware irq mode option)
792 791
@@ -1231,30 +1230,6 @@ they only refer to system buffers that are well aligned. So, a work around
1231may only be needed under Linux when a scatter/gather list is not used and 1230may only be needed under Linux when a scatter/gather list is not used and
1232when the SCSI DATA IN phase is reentered after a phase mismatch. 1231when the SCSI DATA IN phase is reentered after a phase mismatch.
1233 1232
123414.5 IRQ sharing problems
1235
1236When an IRQ is shared by devices that are handled by different drivers, it
1237may happen that one driver complains about the request of the IRQ having
1238failed. Inder Linux-2.0, this may be due to one driver having requested the
1239IRQ using the IRQF_DISABLED flag but some other having requested the same IRQ
1240without this flag. Under both Linux-2.0 and linux-2.2, this may be caused by
1241one driver not having requested the IRQ with the IRQF_SHARED flag.
1242
1243By default, the ncr53c8xx and sym53c8xx drivers request IRQs with both the
1244IRQF_DISABLED and the IRQF_SHARED flag under Linux-2.0 and with only the IRQF_SHARED
1245flag under Linux-2.2.
1246
1247Under Linux-2.0, you can disable use of IRQF_DISABLED flag from the boot
1248command line by using the following option:
1249
1250 ncr53c8xx=irqm:0x20 (for the generic ncr53c8xx driver)
1251 sym53c8xx=irqm:0x20 (for the sym53c8xx driver)
1252
1253If this does not fix the problem, then you may want to check how all other
1254drivers are requesting the IRQ and report the problem. Note that if at least
1255a single driver does not request the IRQ with the IRQF_SHARED flag (share IRQ),
1256then the request of the IRQ obviously will not succeed for all the drivers.
1257
125815. SCSI problem troubleshooting 123315. SCSI problem troubleshooting
1259 1234
126015.1 Problem tracking 123515.1 Problem tracking
diff --git a/Documentation/scsi/tmscsim.txt b/Documentation/scsi/tmscsim.txt
index 0810132772a8..0e0322bf0020 100644
--- a/Documentation/scsi/tmscsim.txt
+++ b/Documentation/scsi/tmscsim.txt
@@ -107,10 +107,6 @@ produced errors and started to corrupt my disks. So don't do that! A 37.50
107MHz PCI bus works for me, though, but I don't recommend using higher clocks 107MHz PCI bus works for me, though, but I don't recommend using higher clocks
108than the 33.33 MHz being in the PCI spec. 108than the 33.33 MHz being in the PCI spec.
109 109
110If you want to share the IRQ with another device and the driver refuses to
111do so, you might succeed with changing the DC390_IRQ type in tmscsim.c to
112IRQF_SHARED | IRQF_DISABLED.
113
114 110
1153.Features 1113.Features
116---------- 112----------
diff --git a/arch/mips/loongson/loongson-3/hpet.c b/arch/mips/loongson/loongson-3/hpet.c
index e898d68668a9..5c21cd3bd339 100644
--- a/arch/mips/loongson/loongson-3/hpet.c
+++ b/arch/mips/loongson/loongson-3/hpet.c
@@ -162,7 +162,7 @@ static irqreturn_t hpet_irq_handler(int irq, void *data)
162 162
163static struct irqaction hpet_irq = { 163static struct irqaction hpet_irq = {
164 .handler = hpet_irq_handler, 164 .handler = hpet_irq_handler,
165 .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_TIMER, 165 .flags = IRQF_NOBALANCING | IRQF_TIMER,
166 .name = "hpet", 166 .name = "hpet",
167}; 167};
168 168
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c
index 2b9440384536..f749df9e15cd 100644
--- a/drivers/block/cpqarray.c
+++ b/drivers/block/cpqarray.c
@@ -405,8 +405,8 @@ static int cpqarray_register_ctlr(int i, struct pci_dev *pdev)
405 goto Enomem4; 405 goto Enomem4;
406 } 406 }
407 hba[i]->access.set_intr_mask(hba[i], 0); 407 hba[i]->access.set_intr_mask(hba[i], 0);
408 if (request_irq(hba[i]->intr, do_ida_intr, 408 if (request_irq(hba[i]->intr, do_ida_intr, IRQF_SHARED,
409 IRQF_DISABLED|IRQF_SHARED, hba[i]->devname, hba[i])) 409 hba[i]->devname, hba[i]))
410 { 410 {
411 printk(KERN_ERR "cpqarray: Unable to get irq %d for %s\n", 411 printk(KERN_ERR "cpqarray: Unable to get irq %d for %s\n",
412 hba[i]->intr, hba[i]->devname); 412 hba[i]->intr, hba[i]->devname);
diff --git a/drivers/bus/omap_l3_noc.c b/drivers/bus/omap_l3_noc.c
index 029bc73de001..11f7982cbdb3 100644
--- a/drivers/bus/omap_l3_noc.c
+++ b/drivers/bus/omap_l3_noc.c
@@ -284,7 +284,7 @@ static int omap_l3_probe(struct platform_device *pdev)
284 */ 284 */
285 l3->debug_irq = platform_get_irq(pdev, 0); 285 l3->debug_irq = platform_get_irq(pdev, 0);
286 ret = devm_request_irq(l3->dev, l3->debug_irq, l3_interrupt_handler, 286 ret = devm_request_irq(l3->dev, l3->debug_irq, l3_interrupt_handler,
287 IRQF_DISABLED, "l3-dbg-irq", l3); 287 0x0, "l3-dbg-irq", l3);
288 if (ret) { 288 if (ret) {
289 dev_err(l3->dev, "request_irq failed for %d\n", 289 dev_err(l3->dev, "request_irq failed for %d\n",
290 l3->debug_irq); 290 l3->debug_irq);
@@ -293,7 +293,7 @@ static int omap_l3_probe(struct platform_device *pdev)
293 293
294 l3->app_irq = platform_get_irq(pdev, 1); 294 l3->app_irq = platform_get_irq(pdev, 1);
295 ret = devm_request_irq(l3->dev, l3->app_irq, l3_interrupt_handler, 295 ret = devm_request_irq(l3->dev, l3->app_irq, l3_interrupt_handler,
296 IRQF_DISABLED, "l3-app-irq", l3); 296 0x0, "l3-app-irq", l3);
297 if (ret) 297 if (ret)
298 dev_err(l3->dev, "request_irq failed for %d\n", l3->app_irq); 298 dev_err(l3->dev, "request_irq failed for %d\n", l3->app_irq);
299 299
diff --git a/drivers/bus/omap_l3_smx.c b/drivers/bus/omap_l3_smx.c
index 597fdaee7315..360a5c0a4ee0 100644
--- a/drivers/bus/omap_l3_smx.c
+++ b/drivers/bus/omap_l3_smx.c
@@ -251,18 +251,16 @@ static int omap3_l3_probe(struct platform_device *pdev)
251 } 251 }
252 252
253 l3->debug_irq = platform_get_irq(pdev, 0); 253 l3->debug_irq = platform_get_irq(pdev, 0);
254 ret = request_irq(l3->debug_irq, omap3_l3_app_irq, 254 ret = request_irq(l3->debug_irq, omap3_l3_app_irq, IRQF_TRIGGER_RISING,
255 IRQF_DISABLED | IRQF_TRIGGER_RISING, 255 "l3-debug-irq", l3);
256 "l3-debug-irq", l3);
257 if (ret) { 256 if (ret) {
258 dev_err(&pdev->dev, "couldn't request debug irq\n"); 257 dev_err(&pdev->dev, "couldn't request debug irq\n");
259 goto err1; 258 goto err1;
260 } 259 }
261 260
262 l3->app_irq = platform_get_irq(pdev, 1); 261 l3->app_irq = platform_get_irq(pdev, 1);
263 ret = request_irq(l3->app_irq, omap3_l3_app_irq, 262 ret = request_irq(l3->app_irq, omap3_l3_app_irq, IRQF_TRIGGER_RISING,
264 IRQF_DISABLED | IRQF_TRIGGER_RISING, 263 "l3-app-irq", l3);
265 "l3-app-irq", l3);
266 if (ret) { 264 if (ret) {
267 dev_err(&pdev->dev, "couldn't request app irq\n"); 265 dev_err(&pdev->dev, "couldn't request app irq\n");
268 goto err2; 266 goto err2;
diff --git a/drivers/mtd/nand/hisi504_nand.c b/drivers/mtd/nand/hisi504_nand.c
index 289ad3ac3e80..8dcc7b8fee40 100644
--- a/drivers/mtd/nand/hisi504_nand.c
+++ b/drivers/mtd/nand/hisi504_nand.c
@@ -758,8 +758,7 @@ static int hisi_nfc_probe(struct platform_device *pdev)
758 758
759 hisi_nfc_host_init(host); 759 hisi_nfc_host_init(host);
760 760
761 ret = devm_request_irq(dev, irq, hinfc_irq_handle, IRQF_DISABLED, 761 ret = devm_request_irq(dev, irq, hinfc_irq_handle, 0x0, "nandc", host);
762 "nandc", host);
763 if (ret) { 762 if (ret) {
764 dev_err(dev, "failed to request IRQ\n"); 763 dev_err(dev, "failed to request IRQ\n");
765 goto err_res; 764 goto err_res;
diff --git a/drivers/usb/isp1760/isp1760-core.c b/drivers/usb/isp1760/isp1760-core.c
index b9827556455f..5c37f40f6122 100644
--- a/drivers/usb/isp1760/isp1760-core.c
+++ b/drivers/usb/isp1760/isp1760-core.c
@@ -151,8 +151,7 @@ int isp1760_register(struct resource *mem, int irq, unsigned long irqflags,
151 } 151 }
152 152
153 if (IS_ENABLED(CONFIG_USB_ISP1761_UDC) && !udc_disabled) { 153 if (IS_ENABLED(CONFIG_USB_ISP1761_UDC) && !udc_disabled) {
154 ret = isp1760_udc_register(isp, irq, irqflags | IRQF_SHARED | 154 ret = isp1760_udc_register(isp, irq, irqflags | IRQF_SHARED);
155 IRQF_DISABLED);
156 if (ret < 0) { 155 if (ret < 0) {
157 isp1760_hcd_unregister(&isp->hcd); 156 isp1760_hcd_unregister(&isp->hcd);
158 return ret; 157 return ret;
diff --git a/drivers/usb/isp1760/isp1760-udc.c b/drivers/usb/isp1760/isp1760-udc.c
index 9612d7990565..0b46ff01299f 100644
--- a/drivers/usb/isp1760/isp1760-udc.c
+++ b/drivers/usb/isp1760/isp1760-udc.c
@@ -1451,8 +1451,8 @@ int isp1760_udc_register(struct isp1760_device *isp, int irq,
1451 1451
1452 sprintf(udc->irqname, "%s (udc)", devname); 1452 sprintf(udc->irqname, "%s (udc)", devname);
1453 1453
1454 ret = request_irq(irq, isp1760_udc_irq, IRQF_SHARED | IRQF_DISABLED | 1454 ret = request_irq(irq, isp1760_udc_irq, IRQF_SHARED | irqflags,
1455 irqflags, udc->irqname, udc); 1455 udc->irqname, udc);
1456 if (ret < 0) 1456 if (ret < 0)
1457 goto error; 1457 goto error;
1458 1458
diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
index 3bb01b9a379c..2cee1761c77d 100644
--- a/include/linux/interrupt.h
+++ b/include/linux/interrupt.h
@@ -39,8 +39,6 @@
39 * These flags used only by the kernel as part of the 39 * These flags used only by the kernel as part of the
40 * irq handling routines. 40 * irq handling routines.
41 * 41 *
42 * IRQF_DISABLED - keep irqs disabled when calling the action handler.
43 * DEPRECATED. This flag is a NOOP and scheduled to be removed
44 * IRQF_SHARED - allow sharing the irq among several devices 42 * IRQF_SHARED - allow sharing the irq among several devices
45 * IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur 43 * IRQF_PROBE_SHARED - set by callers when they expect sharing mismatches to occur
46 * IRQF_TIMER - Flag to mark this interrupt as timer interrupt 44 * IRQF_TIMER - Flag to mark this interrupt as timer interrupt
@@ -58,7 +56,6 @@
58 * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device 56 * IRQF_EARLY_RESUME - Resume IRQ early during syscore instead of at device
59 * resume time. 57 * resume time.
60 */ 58 */
61#define IRQF_DISABLED 0x00000020
62#define IRQF_SHARED 0x00000080 59#define IRQF_SHARED 0x00000080
63#define IRQF_PROBE_SHARED 0x00000100 60#define IRQF_PROBE_SHARED 0x00000100
64#define __IRQF_TIMER 0x00000200 61#define __IRQF_TIMER 0x00000200