Patch "regmap: irq: Set lockdep class for hierarchical IRQ domains" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    regmap: irq: Set lockdep class for hierarchical IRQ domains

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     regmap-irq-set-lockdep-class-for-hierarchical-irq-do.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit cfa206aeefd2c2f878d0c61717050910f93caadf
Author: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
Date:   Fri Nov 1 18:55:53 2024 +0200

    regmap: irq: Set lockdep class for hierarchical IRQ domains
    
    [ Upstream commit 953e549471cabc9d4980f1da2e9fa79f4c23da06 ]
    
    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: 4af8be67fd99 ("regmap: Convert regmap_irq to use irq_domain")
    Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx>
    Link: https://patch.msgid.link/20241101165553.4055617-1-andriy.shevchenko@xxxxxxxxxxxxxxx
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/base/regmap/regmap-irq.c b/drivers/base/regmap/regmap-irq.c
index 18fc1c4360817..db19e9c76e4f1 100644
--- a/drivers/base/regmap/regmap-irq.c
+++ b/drivers/base/regmap/regmap-irq.c
@@ -591,12 +591,16 @@ static irqreturn_t regmap_irq_thread(int irq, void *d)
 		return IRQ_NONE;
 }
 
+static struct lock_class_key regmap_irq_lock_class;
+static struct lock_class_key regmap_irq_request_class;
+
 static int regmap_irq_map(struct irq_domain *h, unsigned int virq,
 			  irq_hw_number_t hw)
 {
 	struct regmap_irq_chip_data *data = h->host_data;
 
 	irq_set_chip_data(virq, data);
+	irq_set_lockdep_class(virq, &regmap_irq_lock_class, &regmap_irq_request_class);
 	irq_set_chip(virq, &data->irq_chip);
 	irq_set_nested_thread(virq, 1);
 	irq_set_parent(virq, data->irq);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux