Hi Roger, On Mon, May 11, 2015 at 4:13 PM, Roger Quadros <rogerq@xxxxxx> 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@xxxxxx> > --- > 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@xxxxxxxxxxxxxx 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@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html