linux/drivers/base/regmap
Andy Shevchenko 46cb2dc1b0 regmap: irq: Set lockdep class for hierarchical IRQ domains
[ Upstream commit 953e549471 ]

Lockdep gives a false positive splat as it can't distinguish the lock
which is taken by different IRQ descriptors from different IRQ chips
that are organized in a way of a hierarchy:

   ======================================================
   WARNING: possible circular locking dependency detected
   6.12.0-rc5-next-20241101-00148-g9fabf8160b53 #562 Tainted: G        W
   ------------------------------------------------------
   modprobe/141 is trying to acquire lock:
   ffff899446947868 (intel_soc_pmic_bxtwc:502:(&bxtwc_regmap_config)->lock){+.+.}-{4:4}, at: regmap_update_bits_base+0x33/0x90

   but task is already holding lock:
   ffff899446947c68 (&d->lock){+.+.}-{4:4}, at: __setup_irq+0x682/0x790

   which lock already depends on the new lock.

   -> #3 (&d->lock){+.+.}-{4:4}:
   -> #2 (&desc->request_mutex){+.+.}-{4:4}:
   -> #1 (ipclock){+.+.}-{4:4}:
   -> #0 (intel_soc_pmic_bxtwc:502:(&bxtwc_regmap_config)->lock){+.+.}-{4:4}:

   Chain exists of:
     intel_soc_pmic_bxtwc:502:(&bxtwc_regmap_config)->lock --> &desc->request_mutex --> &d->lock

    Possible unsafe locking scenario:

          CPU0                    CPU1
          ----                    ----
     lock(&d->lock);
                                  lock(&desc->request_mutex);
                                  lock(&d->lock);
     lock(intel_soc_pmic_bxtwc:502:(&bxtwc_regmap_config)->lock);

    *** DEADLOCK ***

   3 locks held by modprobe/141:
    #0: ffff8994419368f8 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xf6/0x250
    #1: ffff89944690b250 (&desc->request_mutex){+.+.}-{4:4}, at: __setup_irq+0x1a2/0x790
    #2: ffff899446947c68 (&d->lock){+.+.}-{4:4}, at: __setup_irq+0x682/0x790

Set a lockdep class when we map the IRQ so that it doesn't warn about
a lockdep bug that doesn't exist.

Fixes: 4af8be67fd ("regmap: Convert regmap_irq to use irq_domain")
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://patch.msgid.link/20241101165553.4055617-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2024-12-14 19:53:23 +01:00
..
internal.h regmap: Add bulk read/write callbacks into regmap_config 2022-05-05 13:22:34 +01:00
Kconfig regmap: Add MDIO bus support 2021-05-19 14:19:10 +01:00
Makefile regmap: Add MDIO bus support 2021-05-19 14:19:10 +01:00
regcache-flat.c regmap: add proper SPDX identifiers on files that did not have them. 2019-04-25 20:22:15 +01:00
regcache-lzo.c regmap: lzo: Switch to bitmap_zalloc() 2019-06-17 15:18:44 +01:00
regcache-rbtree.c regmap: rbtree: Fix wrong register marked as in-cache when creating new node 2023-10-10 22:00:41 +02:00
regcache.c regmap: fix bogus error on regcache_sync success 2023-12-13 18:39:20 +01:00
regmap-ac97.c regmap: add proper SPDX identifiers on files that did not have them. 2019-04-25 20:22:15 +01:00
regmap-debugfs.c regmap: debugfs: Fix a erroneous check after snprintf() 2023-11-20 11:51:55 +01:00
regmap-i2c.c regmap-i2c: Subtract reg size from max_write 2024-07-11 12:47:17 +02:00
regmap-i3c.c regmap: Constify static regmap_bus structs 2022-04-04 08:41:50 +01:00
regmap-irq.c regmap: irq: Set lockdep class for hierarchical IRQ domains 2024-12-14 19:53:23 +01:00
regmap-mdio.c net: Convert more users of mdiobus_* to mdiodev_* 2021-10-24 13:40:33 +01:00
regmap-mmio.c regmap: mmio: replace return 0 with break in switch statement 2022-09-22 12:33:18 +01:00
regmap-sccb.c regmap: Constify static regmap_bus structs 2022-04-04 08:41:50 +01:00
regmap-sdw-mbq.c regmap: Constify static regmap_bus structs 2022-04-04 08:41:50 +01:00
regmap-sdw.c regmap: Constify static regmap_bus structs 2022-04-04 08:41:50 +01:00
regmap-slimbus.c regmap: Constify static regmap_bus structs 2022-04-04 08:41:50 +01:00
regmap-spi-avmm.c regmap: Drop initial version of maximum transfer length fixes 2023-07-27 08:50:26 +02:00
regmap-spi.c regmap: spi: Fix potential off-by-one when calculating reserved size 2024-09-08 07:53:10 +02:00
regmap-spmi.c regmap: add proper SPDX identifiers on files that did not have them. 2019-04-25 20:22:15 +01:00
regmap-w1.c regmap: Constify static regmap_bus structs 2022-04-04 08:41:50 +01:00
regmap.c regmap: prevent noinc writes from clobbering cache 2023-11-20 11:52:15 +01:00
trace.h regmap: trace: Remove unneeded blank lines 2022-09-05 13:09:45 +01:00