[PATCH 00/18] genirq: Remove setup_irq()

afzal mohammed
2020-02-12T08:01:40Z

While trying to understand internals of irq handling, came across a
thread [1] in which tglx was referring to avoid usage of setup_irq().
Existing callers of setup_irq() reached mostly via 'init_IRQ()' &
'time_init()', while memory allocators are ready by 'mm_init()'.

Hence instances of setup_irq() is replaced by request_irq() &
setup_irq() (along with remove_irq()) definition deleted in the last
patch.

Seldom remove_irq() usage has been observed coupled with setup_irq(),
wherever that has been found, it too has been replaced by free_irq().

Build & boot tested on ARM & x86_64 platforms (ensured that on the
machines used for testing there was an existing setup_irq()
invocation occuring at runtime)

Much of the changes were created using Coccinelle with an intention
to learn it. spatch command was directly run w/ semantic patch below.
But not everything could be automated.

Searching with 'git grep -n '\Wsetup_irq('' & avoiding the irrelevant
ones, 153 invocation's of setup_irq() were found. 112 could be replaced
w/ cocci, of which in a few files some desired hunks were missing or
not as expected, these were fixed up manually. Also the remaining 41
had to be done manually.

Although cocci could replace 112, because of line continue not
happening at paranthesis for request_irq(), around 80 had to be
manually aligned in the request_irq() statement. Problem was with my
below cocci snippet,

- setup_irq(E1,&act);
+ if (request_irq(E1,f_handler,f_flags,f_name,f_dev_id))
+ pr_err("request_irq() on %s failed\n", f_name);

Instead of the above, if below is used, line continue happens exactly
at paranthesis, but it lacks addition of printing on request_irq()
failure where existing setup_irq() failure was not doing it.

- setup_irq(E1,&act)
+ request_irq(E1,f_handler,f_flags,f_name,f_dev_id)

Above had an additional advantage of replacing instances of
if (setup_irq()) & BUG(setup_irq()), but luckily those instances were
very few.

So though many changes could be automated, there are a considerable
amount of manual changes, please review carefully especially mips &
alpha.

Usage of setup_percpu_irq() is untouched w/ this series.

There are 2 checkpatch warning about usage of BUG() [which was already
there w/ setup_irq()], they are left as is as it seems appropriate for
tick timer interrupt.

[1] https://lkml.kernel.org/r/alpine.DEB.2.20.1710191609480.1971@nanos

--->8---

@r1@
identifier ret;
@@

(
setup_irq(...);
|
ret = setup_irq(...);
)

@r2 depends on r1@
identifier act;
@@

static struct irqaction act = {
};

@r11 depends on r2@
identifier r2.act;
identifier f_handler;
@@

(
- act.handler = f_handler;
|
static struct irqaction act = {
.handler = f_handler,
};
)

@r12 depends on r2@
identifier r2.act;
expression f_name;
@@

(
- act.name = f_name;
|
static struct irqaction act = {
.name = f_name,
};
)

@r15 depends on r2@
identifier r2.act;
expression f_dev_id;
@@

(
- act.dev_id = f_dev_id;
|
static struct irqaction act = {
.dev_id = f_dev_id,
};
)

@r16 depends on r2@
identifier r2.act;
expression f_flags;
@@

(
- act.flags = f_flags;
|
static struct irqaction act = {
.flags = f_flags,
};
)

@r21 depends on r2@
identifier r2.act;
@@

- static struct irqaction act = {
- ...
- };

@r22 depends on r2 && r11 && r12 && r15 && r16@
identifier r2.act;
identifier r11.f_handler;
expression r12.f_name;
expression r15.f_dev_id;
expression r16.f_flags;
expression E1;
identifier ret;
@@

(
- setup_irq(E1,&act);
+ if (request_irq(E1,f_handler,f_flags,f_name,f_dev_id))
+ pr_err("request_irq() on %s failed\n", f_name);
|
- ret = setup_irq(E1,&act);
+ ret = request_irq(E1,f_handler,f_flags,f_name,f_dev_id);
)

@r23 depends on r2 && r11 && r12 && !r15 && r16@
identifier r2.act;
identifier r11.f_handler;
expression r12.f_name;
expression r16.f_flags;
expression E1;
identifier ret;
@@

(
- setup_irq(E1,&act);
+ if (request_irq(E1,f_handler,f_flags,f_name,NULL))
+ pr_err("request_irq() on %s failed\n", f_name);
|
- ret = setup_irq(E1,&act);
+ ret = request_irq(E1,f_handler,f_flags,f_name,NULL);
)

@r24 depends on r2 && r11 && r12 && r15 && !r16@
identifier r2.act;
identifier r11.f_handler;
expression r12.f_name;
expression r15.f_dev_id;
expression E1;
identifier ret;
@@

(
- setup_irq(E1,&act);
+ if (request_irq(E1,f_handler,0,f_name,f_dev_id))
+ pr_err("request_irq() on %s failed\n", f_name);
|
- ret = setup_irq(E1,&act);
+ ret = request_irq(E1,f_handler,0,f_name,f_dev_id);
)

@r25 depends on r2 && r11 && r12 && !r15 && !r16@
identifier r2.act;
identifier r11.f_handler;
expression r12.f_name;
expression E1;
identifier ret;
@@

(
- setup_irq(E1,&act);
+ if (request_irq(E1,f_handler,0,f_name,NULL))
+ pr_err("request_irq() on %s failed\n", f_name);
|
- ret = setup_irq(E1,&act);
+ ret = request_irq(E1,f_handler,0,f_name,NULL);
)

--->8---

afzal mohammed (18):
alpha: replace setup_irq() by request_irq()
ARM: replace setup_irq() by request_irq()
c6x: replace setup_irq() by request_irq()
hexagon: replace setup_irq() by request_irq()
ia64: replace setup_irq() by request_irq()
m68k: Replace setup_irq() by request_irq()
microblaze: Replace setup_irq() by request_irq()
MIPS: Replace setup_irq() by request_irq()
parisc: Replace setup_irq() by request_irq()
powerpc: Replace setup_irq() by request_irq()
s390: replace setup_irq() by request_irq()
sh: replace setup_irq() by request_irq()
unicore32: replace setup_irq() by request_irq()
x86: Replace setup_irq() by request_irq()
xtensa: replace setup_irq() by request_irq()
clocksource: Replace setup_irq() by request_irq()
irqchip: Replace setup_irq() by request_irq()
genirq: Remove setup_irq() and remove_irq()

arch/alpha/kernel/irq_alpha.c | 29 ++-------
arch/alpha/kernel/irq_i8259.c | 8 +--
arch/alpha/kernel/irq_impl.h | 7 +--
arch/alpha/kernel/irq_pyxis.c | 3 +-
arch/alpha/kernel/sys_alcor.c | 3 +-
arch/alpha/kernel/sys_cabriolet.c | 3 +-
arch/alpha/kernel/sys_eb64p.c | 3 +-
arch/alpha/kernel/sys_marvel.c | 2 +-
arch/alpha/kernel/sys_miata.c | 6 +-
arch/alpha/kernel/sys_ruffian.c | 3 +-
arch/alpha/kernel/sys_rx164.c | 3 +-
arch/alpha/kernel/sys_sx164.c | 3 +-
arch/alpha/kernel/sys_wildfire.c | 7 +--
arch/alpha/kernel/time.c | 6 +-
arch/arm/mach-cns3xxx/core.c | 10 +---
arch/arm/mach-ebsa110/core.c | 10 +---
arch/arm/mach-ep93xx/timer-ep93xx.c | 12 ++--
arch/arm/mach-footbridge/dc21285-timer.c | 11 +---
arch/arm/mach-footbridge/isa-irq.c | 8 +--
arch/arm/mach-footbridge/isa-timer.c | 11 +---
arch/arm/mach-iop32x/time.c | 12 ++--
arch/arm/mach-mmp/time.c | 11 +---
arch/arm/mach-omap1/pm.c | 22 ++++---
arch/arm/mach-omap1/time.c | 10 +---
arch/arm/mach-omap1/timer32k.c | 10 +---
arch/arm/mach-omap2/timer.c | 11 +---
arch/arm/mach-rpc/time.c | 8 +--
arch/arm/mach-spear/time.c | 9 +--
arch/arm/plat-orion/time.c | 10 +---
arch/c6x/platforms/timer64.c | 11 +---
arch/hexagon/kernel/smp.c | 17 +++---
arch/hexagon/kernel/time.c | 11 +---
arch/ia64/kernel/irq_ia64.c | 42 +++++--------
arch/ia64/kernel/mca.c | 51 +++++-----------
arch/m68k/68000/timers.c | 9 +--
arch/m68k/coldfire/pit.c | 9 +--
arch/m68k/coldfire/sltimers.c | 19 ++----
arch/m68k/coldfire/timers.c | 19 ++----
arch/microblaze/kernel/timer.c | 10 +---
arch/mips/alchemy/common/time.c | 11 +---
arch/mips/ar7/irq.c | 18 +++---
arch/mips/ath25/ar2315.c | 9 +--
arch/mips/ath25/ar5312.c | 9 +--
arch/mips/bcm63xx/irq.c | 38 +++++-------
arch/mips/cobalt/irq.c | 14 ++---
arch/mips/dec/setup.c | 59 ++++++++-----------
arch/mips/emma/markeins/irq.c | 20 +++----
arch/mips/include/asm/sni.h | 2 +-
arch/mips/jazz/irq.c | 12 +---
arch/mips/kernel/cevt-bcm1480.c | 11 +---
arch/mips/kernel/cevt-ds1287.c | 9 +--
arch/mips/kernel/cevt-gt641xx.c | 9 +--
arch/mips/kernel/cevt-r4k.c | 4 +-
arch/mips/kernel/cevt-sb1250.c | 11 +---
arch/mips/kernel/cevt-txx9.c | 11 +---
arch/mips/kernel/i8253.c | 10 +---
arch/mips/kernel/rtlx-mt.c | 8 +--
arch/mips/kernel/smp.c | 33 ++++-------
arch/mips/lasat/interrupt.c | 10 +---
arch/mips/loongson2ef/common/bonito-irq.c | 9 +--
.../loongson2ef/common/cs5536/cs5536_mfgpt.c | 10 +---
arch/mips/loongson2ef/fuloong-2e/irq.c | 14 ++---
arch/mips/loongson2ef/lemote-2f/irq.c | 20 ++-----
arch/mips/loongson32/common/irq.c | 21 ++++---
arch/mips/loongson32/common/time.c | 12 ++--
arch/mips/loongson64/hpet.c | 10 +---
arch/mips/mti-malta/malta-int.c | 10 +---
arch/mips/netlogic/xlr/fmn.c | 9 +--
arch/mips/pmcs-msp71xx/msp_irq.c | 28 ++++-----
arch/mips/pmcs-msp71xx/msp_smp.c | 22 ++-----
arch/mips/pmcs-msp71xx/msp_time.c | 7 ++-
arch/mips/ralink/cevt-rt3352.c | 17 +++---
arch/mips/sgi-ip22/ip22-eisa.c | 8 +--
arch/mips/sgi-ip22/ip22-int.c | 49 +++++----------
arch/mips/sgi-ip32/ip32-irq.c | 18 ++----
arch/mips/sni/a20r.c | 4 +-
arch/mips/sni/irq.c | 8 +--
arch/mips/sni/pcit.c | 8 ++-
arch/mips/sni/rm200.c | 23 +++-----
arch/mips/sni/time.c | 10 +---
arch/mips/vr41xx/common/irq.c | 9 +--
arch/parisc/kernel/irq.c | 21 ++-----
arch/powerpc/platforms/85xx/mpc85xx_cds.c | 10 +---
arch/powerpc/platforms/8xx/cpm1.c | 9 +--
arch/powerpc/platforms/8xx/m8xx_setup.c | 9 +--
arch/powerpc/platforms/chrp/setup.c | 14 ++---
arch/powerpc/platforms/powermac/pic.c | 31 ++++------
arch/powerpc/platforms/powermac/smp.c | 9 +--
arch/s390/kernel/irq.c | 8 +--
arch/sh/boards/mach-cayman/irq.c | 18 ++----
arch/sh/drivers/dma/dma-pvr2.c | 9 +--
arch/unicore32/kernel/time.c | 11 +---
arch/x86/kernel/irqinit.c | 18 +++---
arch/x86/kernel/time.c | 10 +---
arch/xtensa/kernel/smp.c | 8 +--
arch/xtensa/kernel/time.c | 10 +---
drivers/clocksource/bcm2835_timer.c | 8 +--
drivers/clocksource/bcm_kona_timer.c | 10 +---
drivers/clocksource/dw_apb_timer.c | 11 +---
drivers/clocksource/exynos_mct.c | 12 ++--
drivers/clocksource/mxs_timer.c | 10 +---
drivers/clocksource/nomadik-mtu.c | 11 +---
drivers/clocksource/samsung_pwm_timer.c | 12 ++--
drivers/clocksource/timer-atlas7.c | 50 ++++++++--------
drivers/clocksource/timer-cs5535.c | 10 +---
drivers/clocksource/timer-efm32.c | 10 +---
drivers/clocksource/timer-fsl-ftm.c | 10 +---
drivers/clocksource/timer-imx-gpt.c | 10 +---
drivers/clocksource/timer-integrator-ap.c | 11 +---
drivers/clocksource/timer-meson6.c | 11 +---
drivers/clocksource/timer-orion.c | 9 +--
drivers/clocksource/timer-prima2.c | 11 +---
drivers/clocksource/timer-pxa.c | 10 +---
drivers/clocksource/timer-sp804.c | 11 +---
drivers/clocksource/timer-u300.c | 9 +--
drivers/clocksource/timer-vf-pit.c | 10 +---
drivers/clocksource/timer-vt8500.c | 11 +---
drivers/clocksource/timer-zevio.c | 13 ++--
drivers/irqchip/irq-i8259.c | 9 +--
drivers/irqchip/irq-ingenic.c | 11 ++--
drivers/parisc/eisa.c | 8 +--
drivers/s390/cio/airq.c | 8 +--
drivers/s390/cio/cio.c | 8 +--
include/linux/dw_apb_timer.h | 1 -
include/linux/irq.h | 2 -
kernel/irq/manage.c | 44 --------------
126 files changed, 528 insertions(+), 1111 deletions(-)

base-commit: v5.6-rc1
--
2.24.1