https://github.com/torvalds/linux
Revision 0a66d6f90cf7d704c6a0f663f7058099eb8c97b0 authored by Marc Zyngier on 06 April 2020, 07:52:07 UTC, committed by Marc Zyngier on 17 April 2020, 07:59:29 UTC
Running a lockedp-enabled kernel on a vim3l board (Amlogic SM1) leads to the following splat: [ 13.557138] WARNING: HARDIRQ-safe -> HARDIRQ-unsafe lock order detected [ 13.587485] ip/456 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire: [ 13.625922] ffff000059908cf0 (&irq_desc_lock_class){-.-.}-{2:2}, at: __setup_irq+0xf8/0x8d8 [ 13.632273] which would create a new lock dependency: [ 13.637272] (&irq_desc_lock_class){-.-.}-{2:2} -> (&ctl->lock){+.+.}-{2:2} [ 13.644209] [ 13.644209] but this new dependency connects a HARDIRQ-irq-safe lock: [ 13.654122] (&irq_desc_lock_class){-.-.}-{2:2} [ 13.654125] [ 13.654125] ... which became HARDIRQ-irq-safe at: [ 13.664759] lock_acquire+0xec/0x368 [ 13.666926] _raw_spin_lock+0x60/0x88 [ 13.669979] handle_fasteoi_irq+0x30/0x178 [ 13.674082] generic_handle_irq+0x38/0x50 [ 13.678098] __handle_domain_irq+0x6c/0xc8 [ 13.682209] gic_handle_irq+0x5c/0xb0 [ 13.685872] el1_irq+0xd0/0x180 [ 13.689010] arch_cpu_idle+0x40/0x220 [ 13.692732] default_idle_call+0x54/0x60 [ 13.696677] do_idle+0x23c/0x2e8 [ 13.699903] cpu_startup_entry+0x30/0x50 [ 13.703852] rest_init+0x1e0/0x2b4 [ 13.707301] arch_call_rest_init+0x18/0x24 [ 13.711449] start_kernel+0x4ec/0x51c [ 13.715167] [ 13.715167] to a HARDIRQ-irq-unsafe lock: [ 13.722426] (&ctl->lock){+.+.}-{2:2} [ 13.722430] [ 13.722430] ... which became HARDIRQ-irq-unsafe at: [ 13.732319] ... [ 13.732324] lock_acquire+0xec/0x368 [ 13.735985] _raw_spin_lock+0x60/0x88 [ 13.739452] meson_gpio_irq_domain_alloc+0xcc/0x290 [ 13.744392] irq_domain_alloc_irqs_hierarchy+0x24/0x60 [ 13.749586] __irq_domain_alloc_irqs+0x160/0x2f0 [ 13.754254] irq_create_fwspec_mapping+0x118/0x320 [ 13.759073] irq_create_of_mapping+0x78/0xa0 [ 13.763360] of_irq_get+0x6c/0x80 [ 13.766701] of_mdiobus_register_phy+0x10c/0x238 [of_mdio] [ 13.772227] of_mdiobus_register+0x158/0x380 [of_mdio] [ 13.777388] mdio_mux_init+0x180/0x2e8 [mdio_mux] [ 13.782128] g12a_mdio_mux_probe+0x290/0x398 [mdio_mux_meson_g12a] [ 13.788349] platform_drv_probe+0x5c/0xb0 [ 13.792379] really_probe+0xe4/0x448 [ 13.795979] driver_probe_device+0xe8/0x140 [ 13.800189] __device_attach_driver+0x94/0x120 [ 13.804639] bus_for_each_drv+0x84/0xd8 [ 13.808474] __device_attach+0xe4/0x168 [ 13.812361] device_initial_probe+0x1c/0x28 [ 13.816592] bus_probe_device+0xa4/0xb0 [ 13.820430] deferred_probe_work_func+0xa8/0x100 [ 13.825064] process_one_work+0x264/0x688 [ 13.829088] worker_thread+0x4c/0x458 [ 13.832768] kthread+0x154/0x158 [ 13.836018] ret_from_fork+0x10/0x18 [ 13.839612] [ 13.839612] other info that might help us debug this: [ 13.839612] [ 13.850354] Possible interrupt unsafe locking scenario: [ 13.850354] [ 13.855720] CPU0 CPU1 [ 13.858774] ---- ---- [ 13.863242] lock(&ctl->lock); [ 13.866330] local_irq_disable(); [ 13.872233] lock(&irq_desc_lock_class); [ 13.878705] lock(&ctl->lock); [ 13.884297] <Interrupt> [ 13.886857] lock(&irq_desc_lock_class); [ 13.891014] [ 13.891014] *** DEADLOCK *** The issue can occur when CPU1 is doing something like irq_set_type() and CPU0 performing an interrupt allocation, for example. Taking an interrupt (like the one being reconfigured) would lead to a deadlock. A solution to this is: - Reorder the locking so that meson_gpio_irq_update_bits takes the lock itself at all times, instead of relying on the caller to lock or not, hence making the RMW sequence atomic, - Rework the critical section in meson_gpio_irq_request_channel to only cover the allocation itself, and let the gpio_irq_sel_pin callback deal with its own locking if required, - Take the private spin-lock with interrupts disabled at all times Reviewed-by: Jerome Brunet <jbrunet@baylibre.com> Signed-off-by: Marc Zyngier <maz@kernel.org>
1 parent d727be7
Tip revision: 0a66d6f90cf7d704c6a0f663f7058099eb8c97b0 authored by Marc Zyngier on 06 April 2020, 07:52:07 UTC
irqchip/meson-gpio: Fix HARDIRQ-safe -> HARDIRQ-unsafe lock order
irqchip/meson-gpio: Fix HARDIRQ-safe -> HARDIRQ-unsafe lock order
Tip revision: 0a66d6f
File | Mode | Size |
---|---|---|
Kconfig | -rw-r--r-- | 55.8 KB |
Makefile | -rw-r--r-- | 7.9 KB |
class.c | -rw-r--r-- | 12.2 KB |
dev.c | -rw-r--r-- | 11.6 KB |
interface.c | -rw-r--r-- | 26.2 KB |
lib.c | -rw-r--r-- | 3.3 KB |
nvmem.c | -rw-r--r-- | 2.3 KB |
proc.c | -rw-r--r-- | 2.1 KB |
rtc-88pm80x.c | -rw-r--r-- | 9.2 KB |
rtc-88pm860x.c | -rw-r--r-- | 10.6 KB |
rtc-ab-b5ze-s3.c | -rw-r--r-- | 28.3 KB |
rtc-ab-eoz9.c | -rw-r--r-- | 10.9 KB |
rtc-ab3100.c | -rw-r--r-- | 6.5 KB |
rtc-ab8500.c | -rw-r--r-- | 10.9 KB |
rtc-abx80x.c | -rw-r--r-- | 21.3 KB |
rtc-ac100.c | -rw-r--r-- | 16.9 KB |
rtc-armada38x.c | -rw-r--r-- | 15.8 KB |
rtc-as3722.c | -rw-r--r-- | 6.6 KB |
rtc-asm9260.c | -rw-r--r-- | 9.0 KB |
rtc-aspeed.c | -rw-r--r-- | 3.1 KB |
rtc-at91rm9200.c | -rw-r--r-- | 14.8 KB |
rtc-at91sam9.c | -rw-r--r-- | 13.2 KB |
rtc-au1xxx.c | -rw-r--r-- | 3.1 KB |
rtc-bd70528.c | -rw-r--r-- | 15.1 KB |
rtc-bq32k.c | -rw-r--r-- | 7.7 KB |
rtc-bq4802.c | -rw-r--r-- | 4.2 KB |
rtc-brcmstb-waketimer.c | -rw-r--r-- | 7.4 KB |
rtc-cadence.c | -rw-r--r-- | 10.4 KB |
rtc-cmos.c | -rw-r--r-- | 36.6 KB |
rtc-coh901331.c | -rw-r--r-- | 7.2 KB |
rtc-core.h | -rw-r--r-- | 866 bytes |
rtc-cpcap.c | -rw-r--r-- | 8.0 KB |
rtc-cros-ec.c | -rw-r--r-- | 9.8 KB |
rtc-da9052.c | -rw-r--r-- | 7.7 KB |
rtc-da9055.c | -rw-r--r-- | 9.1 KB |
rtc-da9063.c | -rw-r--r-- | 14.6 KB |
rtc-davinci.c | -rw-r--r-- | 13.3 KB |
rtc-digicolor.c | -rw-r--r-- | 5.1 KB |
rtc-dm355evm.c | -rw-r--r-- | 3.5 KB |
rtc-ds1216.c | -rw-r--r-- | 3.8 KB |
rtc-ds1286.c | -rw-r--r-- | 9.0 KB |
rtc-ds1302.c | -rw-r--r-- | 5.7 KB |
rtc-ds1305.c | -rw-r--r-- | 19.5 KB |
rtc-ds1307.c | -rw-r--r-- | 49.2 KB |
rtc-ds1343.c | -rw-r--r-- | 11.2 KB |
rtc-ds1347.c | -rw-r--r-- | 4.2 KB |
rtc-ds1374.c | -rw-r--r-- | 16.8 KB |
rtc-ds1390.c | -rw-r--r-- | 5.8 KB |
rtc-ds1511.c | -rw-r--r-- | 11.9 KB |
rtc-ds1553.c | -rw-r--r-- | 9.2 KB |
rtc-ds1672.c | -rw-r--r-- | 3.6 KB |
rtc-ds1685.c | -rw-r--r-- | 41.2 KB |
rtc-ds1742.c | -rw-r--r-- | 5.9 KB |
rtc-ds2404.c | -rw-r--r-- | 5.8 KB |
rtc-ds3232.c | -rw-r--r-- | 17.1 KB |
rtc-efi.c | -rw-r--r-- | 6.3 KB |
rtc-em3027.c | -rw-r--r-- | 3.7 KB |
rtc-ep93xx.c | -rw-r--r-- | 4.0 KB |
rtc-fm3130.c | -rw-r--r-- | 15.1 KB |
rtc-fsl-ftm-alarm.c | -rw-r--r-- | 8.0 KB |
rtc-ftrtc010.c | -rw-r--r-- | 5.3 KB |
rtc-generic.c | -rw-r--r-- | 952 bytes |
rtc-goldfish.c | -rw-r--r-- | 4.9 KB |
rtc-hid-sensor-time.c | -rw-r--r-- | 9.0 KB |
rtc-hym8563.c | -rw-r--r-- | 13.8 KB |
rtc-imx-sc.c | -rw-r--r-- | 4.5 KB |
rtc-imxdi.c | -rw-r--r-- | 24.1 KB |
rtc-isl12022.c | -rw-r--r-- | 6.8 KB |
rtc-isl12026.c | -rw-r--r-- | 11.0 KB |
rtc-isl1208.c | -rw-r--r-- | 23.0 KB |
rtc-jz4740.c | -rw-r--r-- | 10.1 KB |
rtc-lp8788.c | -rw-r--r-- | 7.6 KB |
rtc-lpc24xx.c | -rw-r--r-- | 8.1 KB |
rtc-lpc32xx.c | -rw-r--r-- | 8.6 KB |
rtc-ls1x.c | -rw-r--r-- | 5.0 KB |
rtc-m41t80.c | -rw-r--r-- | 25.5 KB |
rtc-m41t93.c | -rw-r--r-- | 5.3 KB |
rtc-m41t94.c | -rw-r--r-- | 3.7 KB |
rtc-m48t35.c | -rw-r--r-- | 4.4 KB |
rtc-m48t59.c | -rw-r--r-- | 12.5 KB |
rtc-m48t86.c | -rw-r--r-- | 7.4 KB |
rtc-max6900.c | -rw-r--r-- | 6.2 KB |
rtc-max6902.c | -rw-r--r-- | 3.7 KB |
rtc-max6916.c | -rw-r--r-- | 4.0 KB |
rtc-max77686.c | -rw-r--r-- | 21.0 KB |
rtc-max8907.c | -rw-r--r-- | 5.1 KB |
rtc-max8925.c | -rw-r--r-- | 8.0 KB |
rtc-max8997.c | -rw-r--r-- | 12.2 KB |
rtc-max8998.c | -rw-r--r-- | 7.6 KB |
rtc-mc13xxx.c | -rw-r--r-- | 7.9 KB |
rtc-mc146818-lib.c | -rw-r--r-- | 5.0 KB |
rtc-mcp795.c | -rw-r--r-- | 11.0 KB |
rtc-meson-vrtc.c | -rw-r--r-- | 3.5 KB |
rtc-meson.c | -rw-r--r-- | 10.3 KB |
rtc-moxart.c | -rw-r--r-- | 8.6 KB |
rtc-mpc5121.c | -rw-r--r-- | 10.3 KB |
rtc-mrst.c | -rw-r--r-- | 12.0 KB |
rtc-msm6242.c | -rw-r--r-- | 6.6 KB |
rtc-mt2712.c | -rw-r--r-- | 11.3 KB |
rtc-mt6397.c | -rw-r--r-- | 8.7 KB |
rtc-mt7622.c | -rw-r--r-- | 9.8 KB |
rtc-mv.c | -rw-r--r-- | 8.5 KB |
rtc-mxc.c | -rw-r--r-- | 11.4 KB |
rtc-mxc_v2.c | -rw-r--r-- | 9.9 KB |
rtc-omap.c | -rw-r--r-- | 26.7 KB |
rtc-opal.c | -rw-r--r-- | 6.7 KB |
rtc-palmas.c | -rw-r--r-- | 10.2 KB |
rtc-pcap.c | -rw-r--r-- | 4.5 KB |
rtc-pcf2123.c | -rw-r--r-- | 12.3 KB |
rtc-pcf2127.c | -rw-r--r-- | 19.4 KB |
rtc-pcf50633.c | -rw-r--r-- | 7.2 KB |
rtc-pcf85063.c | -rw-r--r-- | 15.9 KB |
rtc-pcf8523.c | -rw-r--r-- | 8.4 KB |
rtc-pcf85363.c | -rw-r--r-- | 10.5 KB |
rtc-pcf8563.c | -rw-r--r-- | 15.8 KB |
rtc-pcf8583.c | -rw-r--r-- | 6.5 KB |
rtc-pic32.c | -rw-r--r-- | 9.6 KB |
rtc-pl030.c | -rw-r--r-- | 3.5 KB |
rtc-pl031.c | -rw-r--r-- | 12.1 KB |
rtc-pm8xxx.c | -rw-r--r-- | 13.7 KB |
rtc-ps3.c | -rw-r--r-- | 1.4 KB |
rtc-puv3.c | -rw-r--r-- | 6.2 KB |
rtc-pxa.c | -rw-r--r-- | 10.5 KB |
rtc-r7301.c | -rw-r--r-- | 11.0 KB |
rtc-r9701.c | -rw-r--r-- | 4.3 KB |
rtc-rc5t583.c | -rw-r--r-- | 7.9 KB |
rtc-rc5t619.c | -rw-r--r-- | 9.9 KB |
rtc-rk808.c | -rw-r--r-- | 13.0 KB |
rtc-rp5c01.c | -rw-r--r-- | 7.4 KB |
rtc-rs5c313.c | -rw-r--r-- | 10.5 KB |
rtc-rs5c348.c | -rw-r--r-- | 6.1 KB |
rtc-rs5c372.c | -rw-r--r-- | 18.3 KB |
rtc-rtd119x.c | -rw-r--r-- | 5.6 KB |
rtc-rv3028.c | -rw-r--r-- | 20.4 KB |
rtc-rv3029c2.c | -rw-r--r-- | 22.3 KB |
rtc-rv8803.c | -rw-r--r-- | 15.0 KB |
rtc-rx4581.c | -rw-r--r-- | 7.6 KB |
rtc-rx6110.c | -rw-r--r-- | 9.7 KB |
rtc-rx8010.c | -rw-r--r-- | 11.8 KB |
rtc-rx8025.c | -rw-r--r-- | 13.9 KB |
rtc-rx8581.c | -rw-r--r-- | 8.9 KB |
rtc-s35390a.c | -rw-r--r-- | 12.8 KB |
rtc-s3c.c | -rw-r--r-- | 19.8 KB |
rtc-s3c.h | -rw-r--r-- | 2.1 KB |
rtc-s5m.c | -rw-r--r-- | 20.6 KB |
rtc-sa1100.c | -rw-r--r-- | 9.7 KB |
rtc-sa1100.h | -rw-r--r-- | 447 bytes |
rtc-sc27xx.c | -rw-r--r-- | 17.5 KB |
rtc-sd3078.c | -rw-r--r-- | 5.8 KB |
rtc-sh.c | -rw-r--r-- | 17.0 KB |
rtc-sirfsoc.c | -rw-r--r-- | 11.2 KB |
rtc-snvs.c | -rw-r--r-- | 9.8 KB |
rtc-spear.c | -rw-r--r-- | 12.6 KB |
rtc-st-lpc.c | -rw-r--r-- | 7.4 KB |
rtc-starfire.c | -rw-r--r-- | 1.2 KB |
rtc-stk17ta8.c | -rw-r--r-- | 9.2 KB |
rtc-stm32.c | -rw-r--r-- | 24.4 KB |
rtc-stmp3xxx.c | -rw-r--r-- | 12.3 KB |
rtc-sun4v.c | -rw-r--r-- | 1.9 KB |
rtc-sun6i.c | -rw-r--r-- | 19.8 KB |
rtc-sunxi.c | -rw-r--r-- | 12.5 KB |
rtc-tegra.c | -rw-r--r-- | 10.7 KB |
rtc-test.c | -rw-r--r-- | 4.2 KB |
rtc-tps6586x.c | -rw-r--r-- | 8.3 KB |
rtc-tps65910.c | -rw-r--r-- | 12.0 KB |
rtc-tps80031.c | -rw-r--r-- | 8.8 KB |
rtc-twl.c | -rw-r--r-- | 16.8 KB |
rtc-tx4939.c | -rw-r--r-- | 7.9 KB |
rtc-v3020.c | -rw-r--r-- | 8.8 KB |
rtc-vr41xx.c | -rw-r--r-- | 8.0 KB |
rtc-vt8500.c | -rw-r--r-- | 7.4 KB |
rtc-wilco-ec.c | -rw-r--r-- | 4.6 KB |
rtc-wm831x.c | -rw-r--r-- | 12.3 KB |
rtc-wm8350.c | -rw-r--r-- | 11.3 KB |
rtc-x1205.c | -rw-r--r-- | 15.9 KB |
rtc-xgene.c | -rw-r--r-- | 6.6 KB |
rtc-zynqmp.c | -rw-r--r-- | 8.2 KB |
sysfs.c | -rw-r--r-- | 8.3 KB |
systohc.c | -rw-r--r-- | 1.6 KB |
Computing file changes ...