diff mbox

gpio: pcf875x: Revert "gpio: pcf857x: Propagate wake-up setting to parent irq controller"

Message ID 1431353601-21295-1-git-send-email-rogerq@ti.com
State New
Headers show

Commit Message

Roger Quadros May 11, 2015, 2:13 p.m. UTC
commit b80eef95beb0 ('gpio: pcf857x: Propagate wake-up setting to parent irq controller')
introduces the following recursive locking warning while suspending dra7-evm.

The issue addressed by that commit has been already resolved by
commit 10a50f1ab5f0 ('genirq: Set IRQCHIP_SKIP_SET_WAKE flag for dummy_irq_chip')
and so let's revert commit b80eef95beb0 ('gpio: pcf857x: Propagate wake-up setting to parent irq controller')

At least the recursive locking message no longer appears after the revert.

[   30.591905] PM: Syncing filesystems ... done.
[   30.623060] Freezing user space processes ... (elapsed 0.003 seconds) done.
[   30.634470] Freezing remaining freezable tasks ... (elapsed 0.002 seconds) done.
[   30.658288] sd 0:0:0:0: [sda] Synchronizing SCSI cache
[   30.663678]
[   30.663681] =============================================
[   30.663683] [ INFO: possible recursive locking detected ]
[   30.663688] 4.1.0-rc3 #1115 Not tainted
[   30.663693] ---------------------------------------------
[   30.663697] suspend.sh/2319 is trying to acquire lock:
[   30.663719]  (class){......}, at: [<c0096ebc>] __irq_get_desc_lock+0x48/0x88
[   30.663722]
[   30.663722] but task is already holding lock:
[   30.663734]  (class){......}, at: [<c0096ebc>] __irq_get_desc_lock+0x48/0x88
[   30.663736]
[   30.663736] other info that might help us debug this:
[   30.663739]  Possible unsafe locking scenario:
[   30.663739]
[   30.663740]        CPU0
[   30.663743]        ----
[   30.663747]   lock(class);
[   30.663752]   lock(class);
[   30.663755]
[   30.663755]  *** DEADLOCK ***
[   30.663755]
[   30.663757]  May be due to missing lock nesting notation
[   30.663757]
[   30.663761] 6 locks held by suspend.sh/2319:
[   30.663778]  #0:  (sb_writers#7){.+.+.+}, at: [<c015fb1c>] vfs_write+0x130/0x14c
[   30.663793]  #1:  (&of->mutex){+.+.+.}, at: [<c01cdbb0>] kernfs_fop_write+0x4c/0x198
[   30.663807]  #2:  (s_active#37){.+.+.+}, at: [<c01cdbb8>] kernfs_fop_write+0x54/0x198
[   30.663820]  #3:  (pm_mutex){+.+.+.}, at: [<c0092ef8>] pm_suspend+0x240/0x4b8
[   30.663834]  #4:  (&dev->mutex){......}, at: [<c03dc918>] __device_suspend+0xd0/0x378
[   30.663847]  #5:  (class){......}, at: [<c0096ebc>] __irq_get_desc_lock+0x48/0x88
[   30.663849]
[   30.663849] stack backtrace:
[   30.663856] CPU: 0 PID: 2319 Comm: suspend.sh Not tainted 4.1.0-rc3 #1115
[   30.663859] Hardware name: Generic DRA74X (Flattened Device Tree)
[   30.663873] [<c00163bc>] (unwind_backtrace) from [<c0012930>] (show_stack+0x10/0x14)
[   30.663884] [<c0012930>] (show_stack) from [<c05f9ee8>] (dump_stack+0x80/0x9c)
[   30.663896] [<c05f9ee8>] (dump_stack) from [<c008bba4>] (__lock_acquire+0x13f0/0x1c14)
[   30.663905] [<c008bba4>] (__lock_acquire) from [<c008c940>] (lock_acquire+0x9c/0x114)
[   30.663914] [<c008c940>] (lock_acquire) from [<c0600214>] (_raw_spin_lock_irqsave+0x38/0x4c)
[   30.663922] [<c0600214>] (_raw_spin_lock_irqsave) from [<c0096ebc>] (__irq_get_desc_lock+0x48/0x88)
[   30.663932] [<c0096ebc>] (__irq_get_desc_lock) from [<c00977cc>] (irq_set_irq_wake+0x20/0xf0)
[   30.663946] [<c00977cc>] (irq_set_irq_wake) from [<bf0000c8>] (pcf857x_irq_set_wake+0x14/0x1c [gpio_pcf857x])
[   30.663962] [<bf0000c8>] (pcf857x_irq_set_wake [gpio_pcf857x]) from [<c009764c>] (set_irq_wake_real+0x30/0x44)
[   30.663970] [<c009764c>] (set_irq_wake_real) from [<c0097838>] (irq_set_irq_wake+0x8c/0xf0)
[   30.663979] [<c0097838>] (irq_set_irq_wake) from [<bf059074>] (usb_extcon_suspend+0x2c/0x48 [extcon_usb_gpio])
[   30.663992] [<bf059074>] (usb_extcon_suspend [extcon_usb_gpio]) from [<c03d38e8>] (platform_pm_suspend+0x2c/0x54)
[   30.664003] [<c03d38e8>] (platform_pm_suspend) from [<c03dbe10>] (dpm_run_callback+0x4c/0x110)
[   30.664012] [<c03dbe10>] (dpm_run_callback) from [<c03dc974>] (__device_suspend+0x12c/0x378)
[   30.664019] [<c03dc974>] (__device_suspend) from [<c03de4ac>] (dpm_suspend+0x128/0x2d8)
[   30.664025] [<c03de4ac>] (dpm_suspend) from [<c00926a0>] (suspend_devices_and_enter+0x84/0x69c)
[   30.664032] [<c00926a0>] (suspend_devices_and_enter) from [<c00930f4>] (pm_suspend+0x43c/0x4b8)
[   30.664039] [<c00930f4>] (pm_suspend) from [<c0091654>] (state_store+0x68/0xb8)
[   30.664049] [<c0091654>] (state_store) from [<c03421b8>] (kobj_attr_store+0x14/0x20)
[   30.664058] [<c03421b8>] (kobj_attr_store) from [<c01ce84c>] (sysfs_kf_write+0x4c/0x50)
[   30.664065] [<c01ce84c>] (sysfs_kf_write) from [<c01cdc20>] (kernfs_fop_write+0xbc/0x198)
[   30.664074] [<c01cdc20>] (kernfs_fop_write) from [<c015eab0>] (__vfs_write+0x2c/0xd8)
[   30.664082] [<c015eab0>] (__vfs_write) from [<c015fa7c>] (vfs_write+0x90/0x14c)
[   30.664088] [<c015fa7c>] (vfs_write) from [<c015fd04>] (SyS_write+0x40/0x8c)
[   30.664097] [<c015fd04>] (SyS_write) from [<c000f540>] (ret_fast_syscall+0x0/0x4c)
[   31.038856] sd 0:0:0:0: [sda] Stopping disk
[   31.644707] PM: suspend of devices complete after 996.653 msecs
[   31.654312] PM: late suspend of devices complete after 3.329 msecs
[   31.663835] PM: noirq suspend of devices complete after 3.029 msecs
[   31.670422] Disabling non-boot CPUs ...
[   31.675294] CPU1: shutdown

Signed-off-by: Roger Quadros <rogerq@ti.com>
---
 drivers/gpio/gpio-pcf857x.c | 37 +++----------------------------------
 1 file changed, 3 insertions(+), 34 deletions(-)

Comments

Geert Uytterhoeven May 11, 2015, 5:36 p.m. UTC | #1
Hi Roger,

On Mon, May 11, 2015 at 4:13 PM, Roger Quadros <rogerq@ti.com> wrote:
> commit b80eef95beb0 ('gpio: pcf857x: Propagate wake-up setting to parent irq controller')
> introduces the following recursive locking warning while suspending dra7-evm.
>
> The issue addressed by that commit has been already resolved by
> commit 10a50f1ab5f0 ('genirq: Set IRQCHIP_SKIP_SET_WAKE flag for dummy_irq_chip')

That's not 100% correct: commit b80eef95beb0 ('gpio: pcf857x: Propagate wake-up
setting to parent irq controller') fixes _two_ things:
  1. warning due to missing irq_set_wake / IRQCHIP_SKIP_SET_WAKE,
  2. propagating set_wake, so the parent interrupt controller stays awake, as
     it's needed for wake-up,

Only the first issue is addressed by commit 10a50f1ab5f0 ('genirq: Set
IRQCHIP_SKIP_SET_WAKE flag for dummy_irq_chip').

> and so let's revert commit b80eef95beb0 ('gpio: pcf857x: Propagate wake-up setting to parent irq controller')
>
> At least the recursive locking message no longer appears after the revert.
>
> [   30.591905] PM: Syncing filesystems ... done.
> [   30.623060] Freezing user space processes ... (elapsed 0.003 seconds) done.
> [   30.634470] Freezing remaining freezable tasks ... (elapsed 0.002 seconds) done.
> [   30.658288] sd 0:0:0:0: [sda] Synchronizing SCSI cache
> [   30.663678]
> [   30.663681] =============================================
> [   30.663683] [ INFO: possible recursive locking detected ]
> [   30.663688] 4.1.0-rc3 #1115 Not tainted
> [   30.663693] ---------------------------------------------
> [   30.663697] suspend.sh/2319 is trying to acquire lock:
> [   30.663719]  (class){......}, at: [<c0096ebc>] __irq_get_desc_lock+0x48/0x88
> [   30.663722]
> [   30.663722] but task is already holding lock:
> [   30.663734]  (class){......}, at: [<c0096ebc>] __irq_get_desc_lock+0x48/0x88

Does this mean .set_irq_wake() cannot call irq_set_irq_wake()?
Many GPIO drivers do that, as they need to propagate wake-up state to the
parent interrupt controller?

> [   30.663736]
> [   30.663736] other info that might help us debug this:
> [   30.663739]  Possible unsafe locking scenario:
> [   30.663739]
> [   30.663740]        CPU0
> [   30.663743]        ----
> [   30.663747]   lock(class);
> [   30.663752]   lock(class);
> [   30.663755]
> [   30.663755]  *** DEADLOCK ***
> [   30.663755]
> [   30.663757]  May be due to missing lock nesting notation
> [   30.663757]
> [   30.663761] 6 locks held by suspend.sh/2319:
> [   30.663778]  #0:  (sb_writers#7){.+.+.+}, at: [<c015fb1c>] vfs_write+0x130/0x14c
> [   30.663793]  #1:  (&of->mutex){+.+.+.}, at: [<c01cdbb0>] kernfs_fop_write+0x4c/0x198
> [   30.663807]  #2:  (s_active#37){.+.+.+}, at: [<c01cdbb8>] kernfs_fop_write+0x54/0x198
> [   30.663820]  #3:  (pm_mutex){+.+.+.}, at: [<c0092ef8>] pm_suspend+0x240/0x4b8
> [   30.663834]  #4:  (&dev->mutex){......}, at: [<c03dc918>] __device_suspend+0xd0/0x378
> [   30.663847]  #5:  (class){......}, at: [<c0096ebc>] __irq_get_desc_lock+0x48/0x88
> [   30.663849]
> [   30.663849] stack backtrace:
> [   30.663856] CPU: 0 PID: 2319 Comm: suspend.sh Not tainted 4.1.0-rc3 #1115
> [   30.663859] Hardware name: Generic DRA74X (Flattened Device Tree)
> [   30.663873] [<c00163bc>] (unwind_backtrace) from [<c0012930>] (show_stack+0x10/0x14)
> [   30.663884] [<c0012930>] (show_stack) from [<c05f9ee8>] (dump_stack+0x80/0x9c)
> [   30.663896] [<c05f9ee8>] (dump_stack) from [<c008bba4>] (__lock_acquire+0x13f0/0x1c14)
> [   30.663905] [<c008bba4>] (__lock_acquire) from [<c008c940>] (lock_acquire+0x9c/0x114)
> [   30.663914] [<c008c940>] (lock_acquire) from [<c0600214>] (_raw_spin_lock_irqsave+0x38/0x4c)
> [   30.663922] [<c0600214>] (_raw_spin_lock_irqsave) from [<c0096ebc>] (__irq_get_desc_lock+0x48/0x88)
> [   30.663932] [<c0096ebc>] (__irq_get_desc_lock) from [<c00977cc>] (irq_set_irq_wake+0x20/0xf0)
> [   30.663946] [<c00977cc>] (irq_set_irq_wake) from [<bf0000c8>] (pcf857x_irq_set_wake+0x14/0x1c [gpio_pcf857x])
> [   30.663962] [<bf0000c8>] (pcf857x_irq_set_wake [gpio_pcf857x]) from [<c009764c>] (set_irq_wake_real+0x30/0x44)
> [   30.663970] [<c009764c>] (set_irq_wake_real) from [<c0097838>] (irq_set_irq_wake+0x8c/0xf0)
> [   30.663979] [<c0097838>] (irq_set_irq_wake) from [<bf059074>] (usb_extcon_suspend+0x2c/0x48 [extcon_usb_gpio])
> [   30.663992] [<bf059074>] (usb_extcon_suspend [extcon_usb_gpio]) from [<c03d38e8>] (platform_pm_suspend+0x2c/0x54)
> [   30.664003] [<c03d38e8>] (platform_pm_suspend) from [<c03dbe10>] (dpm_run_callback+0x4c/0x110)
> [   30.664012] [<c03dbe10>] (dpm_run_callback) from [<c03dc974>] (__device_suspend+0x12c/0x378)
> [   30.664019] [<c03dc974>] (__device_suspend) from [<c03de4ac>] (dpm_suspend+0x128/0x2d8)
> [   30.664025] [<c03de4ac>] (dpm_suspend) from [<c00926a0>] (suspend_devices_and_enter+0x84/0x69c)
> [   30.664032] [<c00926a0>] (suspend_devices_and_enter) from [<c00930f4>] (pm_suspend+0x43c/0x4b8)
> [   30.664039] [<c00930f4>] (pm_suspend) from [<c0091654>] (state_store+0x68/0xb8)
> [   30.664049] [<c0091654>] (state_store) from [<c03421b8>] (kobj_attr_store+0x14/0x20)
> [   30.664058] [<c03421b8>] (kobj_attr_store) from [<c01ce84c>] (sysfs_kf_write+0x4c/0x50)
> [   30.664065] [<c01ce84c>] (sysfs_kf_write) from [<c01cdc20>] (kernfs_fop_write+0xbc/0x198)
> [   30.664074] [<c01cdc20>] (kernfs_fop_write) from [<c015eab0>] (__vfs_write+0x2c/0xd8)
> [   30.664082] [<c015eab0>] (__vfs_write) from [<c015fa7c>] (vfs_write+0x90/0x14c)
> [   30.664088] [<c015fa7c>] (vfs_write) from [<c015fd04>] (SyS_write+0x40/0x8c)
> [   30.664097] [<c015fd04>] (SyS_write) from [<c000f540>] (ret_fast_syscall+0x0/0x4c)
> [   31.038856] sd 0:0:0:0: [sda] Stopping disk
> [   31.644707] PM: suspend of devices complete after 996.653 msecs
> [   31.654312] PM: late suspend of devices complete after 3.329 msecs
> [   31.663835] PM: noirq suspend of devices complete after 3.029 msecs
> [   31.670422] Disabling non-boot CPUs ...
> [   31.675294] CPU1: shutdown
>
> Signed-off-by: Roger Quadros <rogerq@ti.com>
> ---
>  drivers/gpio/gpio-pcf857x.c | 37 +++----------------------------------
>  1 file changed, 3 insertions(+), 34 deletions(-)
>
> diff --git a/drivers/gpio/gpio-pcf857x.c b/drivers/gpio/gpio-pcf857x.c
> index 945f0cd..126c937 100644
> --- a/drivers/gpio/gpio-pcf857x.c
> +++ b/drivers/gpio/gpio-pcf857x.c
> @@ -204,36 +204,6 @@ static irqreturn_t pcf857x_irq(int irq, void *data)
>         return IRQ_HANDLED;
>  }
>
> -/*
> - * NOP functions
> - */
> -static void noop(struct irq_data *data) { }
> -
> -static unsigned int noop_ret(struct irq_data *data)
> -{
> -       return 0;
> -}
> -
> -static int pcf857x_irq_set_wake(struct irq_data *data, unsigned int on)
> -{
> -       struct pcf857x *gpio = irq_data_get_irq_chip_data(data);
> -
> -       irq_set_irq_wake(gpio->client->irq, on);
> -       return 0;
> -}
> -
> -static struct irq_chip pcf857x_irq_chip = {
> -       .name           = "pcf857x",
> -       .irq_startup    = noop_ret,
> -       .irq_shutdown   = noop,
> -       .irq_enable     = noop,
> -       .irq_disable    = noop,
> -       .irq_ack        = noop,
> -       .irq_mask       = noop,
> -       .irq_unmask     = noop,
> -       .irq_set_wake   = pcf857x_irq_set_wake,
> -};
> -
>  /*-------------------------------------------------------------------------*/
>
>  static int pcf857x_probe(struct i2c_client *client,
> @@ -347,9 +317,8 @@ static int pcf857x_probe(struct i2c_client *client,
>
>         /* Enable irqchip if we have an interrupt */
>         if (client->irq) {
> -               status = gpiochip_irqchip_add(&gpio->chip, &pcf857x_irq_chip,
> -                                             0, handle_level_irq,
> -                                             IRQ_TYPE_NONE);
> +               status = gpiochip_irqchip_add(&gpio->chip, &dummy_irq_chip, 0,
> +                                             handle_level_irq, IRQ_TYPE_NONE);
>                 if (status) {
>                         dev_err(&client->dev, "cannot add irqchip\n");
>                         goto fail_irq;
> @@ -362,7 +331,7 @@ static int pcf857x_probe(struct i2c_client *client,
>                 if (status)
>                         goto fail_irq;
>
> -               gpiochip_set_chained_irqchip(&gpio->chip, &pcf857x_irq_chip,
> +               gpiochip_set_chained_irqchip(&gpio->chip, &dummy_irq_chip,
>                                              client->irq, NULL);
>         }
>
> --
> 2.1.4

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds
--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
grygorii.strashko@linaro.org May 14, 2015, 12:32 p.m. UTC | #2
Hi,

On 05/11/2015 08:36 PM, Geert Uytterhoeven wrote:
> On Mon, May 11, 2015 at 4:13 PM, Roger Quadros <rogerq@ti.com> wrote:
>> commit b80eef95beb0 ('gpio: pcf857x: Propagate wake-up setting to parent irq controller')
>> introduces the following recursive locking warning while suspending dra7-evm.
>>
>> The issue addressed by that commit has been already resolved by
>> commit 10a50f1ab5f0 ('genirq: Set IRQCHIP_SKIP_SET_WAKE flag for dummy_irq_chip')
> 
> That's not 100% correct: commit b80eef95beb0 ('gpio: pcf857x: Propagate wake-up
> setting to parent irq controller') fixes _two_ things:
>    1. warning due to missing irq_set_wake / IRQCHIP_SKIP_SET_WAKE,
>    2. propagating set_wake, so the parent interrupt controller stays awake, as
>       it's needed for wake-up,
> 
> Only the first issue is addressed by commit 10a50f1ab5f0 ('genirq: Set
> IRQCHIP_SKIP_SET_WAKE flag for dummy_irq_chip').
> 
>> and so let's revert commit b80eef95beb0 ('gpio: pcf857x: Propagate wake-up setting to parent irq controller')
>>
>> At least the recursive locking message no longer appears after the revert.
>>
>> [   30.591905] PM: Syncing filesystems ... done.
>> [   30.623060] Freezing user space processes ... (elapsed 0.003 seconds) done.
>> [   30.634470] Freezing remaining freezable tasks ... (elapsed 0.002 seconds) done.
>> [   30.658288] sd 0:0:0:0: [sda] Synchronizing SCSI cache
>> [   30.663678]
>> [   30.663681] =============================================
>> [   30.663683] [ INFO: possible recursive locking detected ]
>> [   30.663688] 4.1.0-rc3 #1115 Not tainted
>> [   30.663693] ---------------------------------------------
>> [   30.663697] suspend.sh/2319 is trying to acquire lock:
>> [   30.663719]  (class){......}, at: [<c0096ebc>] __irq_get_desc_lock+0x48/0x88
>> [   30.663722]
>> [   30.663722] but task is already holding lock:
>> [   30.663734]  (class){......}, at: [<c0096ebc>] __irq_get_desc_lock+0x48/0x88
> 
> Does this mean .set_irq_wake() cannot call irq_set_irq_wake()?
> Many GPIO drivers do that, as they need to propagate wake-up state to the
> parent interrupt controller?

As I remember, there was similar problem, so I found corresponding patch (just FYI)

ab2b926 mfd: Fix twl6030 lockdep recursion warning on setting wake IRQs

Not sure such kind of solution is the best choice (
Linus Walleij May 19, 2015, 9:05 a.m. UTC | #3
On Mon, May 11, 2015 at 4:13 PM, Roger Quadros <rogerq@ti.com> wrote:

> commit b80eef95beb0 ('gpio: pcf857x: Propagate wake-up setting to parent irq controller')
> introduces the following recursive locking warning while suspending dra7-evm.
>
> The issue addressed by that commit has been already resolved by
> commit 10a50f1ab5f0 ('genirq: Set IRQCHIP_SKIP_SET_WAKE flag for dummy_irq_chip')
> and so let's revert commit b80eef95beb0 ('gpio: pcf857x: Propagate wake-up setting to parent irq controller')
>
> At least the recursive locking message no longer appears after the revert.

Geert do you have a better solution to this or should I just
apply the revert?

Yours,
Linus Walleij
--
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/gpio/gpio-pcf857x.c b/drivers/gpio/gpio-pcf857x.c
index 945f0cd..126c937 100644
--- a/drivers/gpio/gpio-pcf857x.c
+++ b/drivers/gpio/gpio-pcf857x.c
@@ -204,36 +204,6 @@  static irqreturn_t pcf857x_irq(int irq, void *data)
 	return IRQ_HANDLED;
 }
 
-/*
- * NOP functions
- */
-static void noop(struct irq_data *data) { }
-
-static unsigned int noop_ret(struct irq_data *data)
-{
-	return 0;
-}
-
-static int pcf857x_irq_set_wake(struct irq_data *data, unsigned int on)
-{
-	struct pcf857x *gpio = irq_data_get_irq_chip_data(data);
-
-	irq_set_irq_wake(gpio->client->irq, on);
-	return 0;
-}
-
-static struct irq_chip pcf857x_irq_chip = {
-	.name		= "pcf857x",
-	.irq_startup	= noop_ret,
-	.irq_shutdown	= noop,
-	.irq_enable	= noop,
-	.irq_disable	= noop,
-	.irq_ack	= noop,
-	.irq_mask	= noop,
-	.irq_unmask	= noop,
-	.irq_set_wake	= pcf857x_irq_set_wake,
-};
-
 /*-------------------------------------------------------------------------*/
 
 static int pcf857x_probe(struct i2c_client *client,
@@ -347,9 +317,8 @@  static int pcf857x_probe(struct i2c_client *client,
 
 	/* Enable irqchip if we have an interrupt */
 	if (client->irq) {
-		status = gpiochip_irqchip_add(&gpio->chip, &pcf857x_irq_chip,
-					      0, handle_level_irq,
-					      IRQ_TYPE_NONE);
+		status = gpiochip_irqchip_add(&gpio->chip, &dummy_irq_chip, 0,
+					      handle_level_irq, IRQ_TYPE_NONE);
 		if (status) {
 			dev_err(&client->dev, "cannot add irqchip\n");
 			goto fail_irq;
@@ -362,7 +331,7 @@  static int pcf857x_probe(struct i2c_client *client,
 		if (status)
 			goto fail_irq;
 
-		gpiochip_set_chained_irqchip(&gpio->chip, &pcf857x_irq_chip,
+		gpiochip_set_chained_irqchip(&gpio->chip, &dummy_irq_chip,
 					     client->irq, NULL);
 	}