diff mbox series

gpio: rcar: Use raw_spinlock to protect register access

Message ID 20250121135833.3769310-1-niklas.soderlund+renesas@ragnatech.se
State New
Headers show
Series gpio: rcar: Use raw_spinlock to protect register access | expand

Commit Message

Niklas Söderlund Jan. 21, 2025, 1:58 p.m. UTC
Use raw_spinlock in order to fix spurious messages about invalid context
when spinlock debugging is enabled. The lock is only used to serialize
register access.

    [    4.239592] =============================
    [    4.239595] [ BUG: Invalid wait context ]
    [    4.239599] 6.13.0-rc7-arm64-renesas-05496-gd088502a519f #35 Not tainted
    [    4.239603] -----------------------------
    [    4.239606] kworker/u8:5/76 is trying to lock:
    [    4.239609] ffff0000091898a0 (&p->lock){....}-{3:3}, at: gpio_rcar_config_interrupt_input_mode+0x34/0x164
    [    4.239641] other info that might help us debug this:
    [    4.239643] context-{5:5}
    [    4.239646] 5 locks held by kworker/u8:5/76:
    [    4.239651]  #0: ffff0000080fb148 ((wq_completion)async){+.+.}-{0:0}, at: process_one_work+0x190/0x62c
    [    4.250180] OF: /soc/sound@ec500000/ports/port@0/endpoint: Read of boolean property 'frame-master' with a value.
    [    4.254094]  #1: ffff80008299bd80 ((work_completion)(&entry->work)){+.+.}-{0:0}, at: process_one_work+0x1b8/0x62c
    [    4.254109]  #2: ffff00000920c8f8
    [    4.258345] OF: /soc/sound@ec500000/ports/port@1/endpoint: Read of boolean property 'bitclock-master' with a value.
    [    4.264803]  (&dev->mutex){....}-{4:4}, at: __device_attach_async_helper+0x3c/0xdc
    [    4.264820]  #3: ffff00000a50ca40 (request_class#2){+.+.}-{4:4}, at: __setup_irq+0xa0/0x690
    [    4.264840]  #4:
    [    4.268872] OF: /soc/sound@ec500000/ports/port@1/endpoint: Read of boolean property 'frame-master' with a value.
    [    4.273275] ffff00000a50c8c8 (lock_class){....}-{2:2}, at: __setup_irq+0xc4/0x690
    [    4.296130] renesas_sdhi_internal_dmac ee100000.mmc: mmc1 base at 0x00000000ee100000, max clock rate 200 MHz
    [    4.304082] stack backtrace:
    [    4.304086] CPU: 1 UID: 0 PID: 76 Comm: kworker/u8:5 Not tainted 6.13.0-rc7-arm64-renesas-05496-gd088502a519f #35
    [    4.304092] Hardware name: Renesas Salvator-X 2nd version board based on r8a77965 (DT)
    [    4.304097] Workqueue: async async_run_entry_fn
    [    4.304106] Call trace:
    [    4.304110]  show_stack+0x14/0x20 (C)
    [    4.304122]  dump_stack_lvl+0x6c/0x90
    [    4.304131]  dump_stack+0x14/0x1c
    [    4.304138]  __lock_acquire+0xdfc/0x1584
    [    4.426274]  lock_acquire+0x1c4/0x33c
    [    4.429942]  _raw_spin_lock_irqsave+0x5c/0x80
    [    4.434307]  gpio_rcar_config_interrupt_input_mode+0x34/0x164
    [    4.440061]  gpio_rcar_irq_set_type+0xd4/0xd8
    [    4.444422]  __irq_set_trigger+0x5c/0x178
    [    4.448435]  __setup_irq+0x2e4/0x690
    [    4.452012]  request_threaded_irq+0xc4/0x190
    [    4.456285]  devm_request_threaded_irq+0x7c/0xf4
    [    4.459398] ata1: link resume succeeded after 1 retries
    [    4.460902]  mmc_gpiod_request_cd_irq+0x68/0xe0
    [    4.470660]  mmc_start_host+0x50/0xac
    [    4.474327]  mmc_add_host+0x80/0xe4
    [    4.477817]  tmio_mmc_host_probe+0x2b0/0x440
    [    4.482094]  renesas_sdhi_probe+0x488/0x6f4
    [    4.486281]  renesas_sdhi_internal_dmac_probe+0x60/0x78
    [    4.491509]  platform_probe+0x64/0xd8
    [    4.495178]  really_probe+0xb8/0x2a8
    [    4.498756]  __driver_probe_device+0x74/0x118
    [    4.503116]  driver_probe_device+0x3c/0x154
    [    4.507303]  __device_attach_driver+0xd4/0x160
    [    4.511750]  bus_for_each_drv+0x84/0xe0
    [    4.515588]  __device_attach_async_helper+0xb0/0xdc
    [    4.520470]  async_run_entry_fn+0x30/0xd8
    [    4.524481]  process_one_work+0x210/0x62c
    [    4.528494]  worker_thread+0x1ac/0x340
    [    4.532245]  kthread+0x10c/0x110
    [    4.535476]  ret_from_fork+0x10/0x20

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
---

Hi Geert,

This is similar to what was done to other GPIO drivers to solve the same
situation see [1], [2], [3] and [4] for some examples.

1. 3c938cc5cebc ("gpio: use raw spinlock for gpio chip shadowed data")
2. 37174f334130 ("gpio: tegra: Use raw_spinlock")
3. 4dbada2be460 ("gpio: omap: use raw locks for locking")
3. 505936131ea7 ("gpio: mpc8xxx: Convert mpc8xxx_gpio_chip.lock to raw_spinlock")
---
 drivers/gpio/gpio-rcar.c | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

Comments

Geert Uytterhoeven Jan. 21, 2025, 2:49 p.m. UTC | #1
Hi Niklas,

On Tue, Jan 21, 2025 at 2:59 PM Niklas Söderlund
<niklas.soderlund+renesas@ragnatech.se> wrote:
> Use raw_spinlock in order to fix spurious messages about invalid context
> when spinlock debugging is enabled. The lock is only used to serialize
> register access.
>
>     [    4.239592] =============================
>     [    4.239595] [ BUG: Invalid wait context ]

[...]

>     [    4.426274]  lock_acquire+0x1c4/0x33c
>     [    4.429942]  _raw_spin_lock_irqsave+0x5c/0x80
>     [    4.434307]  gpio_rcar_config_interrupt_input_mode+0x34/0x164
>     [    4.440061]  gpio_rcar_irq_set_type+0xd4/0xd8

> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>

Thanks for your patch!
This indeed gets rid of the annoying messages on various R-Car boards.
Unfortunately  I now start seeing other scary messages during resume
from s2idle/s2ram.

On marzen (R-Car H1):

        =============================
        [ BUG: Invalid wait context ]
        6.13.0-marzen-08235-gb3d2b6c82b8c #193 Not tainted
        -----------------------------
        swapper/0/0 is trying to lock:
        c2d3c994 (&dev->event_lock){..-.}-{3:3}, at: input_event+0x38/0x60
        other info that might help us debug this:
        context-{2:2}
        no locks held by swapper/0/0.
        stack backtrace:
        CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted
6.13.0-marzen-08235-gb3d2b6c82b8c #193
        Hardware name: Generic R8A7779 (Flattened Device Tree)
        Call trace:
         unwind_backtrace from show_stack+0x10/0x14
         show_stack from dump_stack_lvl+0x7c/0xb0
         dump_stack_lvl from __lock_acquire+0x38c/0x1698
         __lock_acquire from lock_acquire+0x29c/0x338
         lock_acquire from _raw_spin_lock_irqsave+0x50/0x64
         _raw_spin_lock_irqsave from input_event+0x38/0x60
         input_event from gpio_keys_irq_timer+0x30/0x50
         gpio_keys_irq_timer from __hrtimer_run_queues+0x208/0x370
         __hrtimer_run_queues from hrtimer_interrupt+0xbc/0x1f8
         hrtimer_interrupt from twd_handler+0x30/0x3c
         twd_handler from handle_percpu_devid_irq+0x58/0xfc
         handle_percpu_devid_irq from handle_irq_desc+0x68/0x80
         handle_irq_desc from gic_handle_irq+0x74/0x84
         gic_handle_irq from generic_handle_arch_irq+0x28/0x3c
         generic_handle_arch_irq from __irq_svc+0x8c/0xb8
        Exception stack(0xc0e01f30 to 0xc0e01f78)
        1f20:                                     ffffffff 00000001
2b229000 00000001
        1f40: c0e0be40 c0173ae0 c0e09090 c0e0be40 c0e09054 c0e09090
ffffffff 00000000
        1f60: 00000000 c0e01f80 c08d13b8 c08d13c0 200f0013 ffffffff
         __irq_svc from cpu_idle_poll+0xc4/0x130
         cpu_idle_poll from do_idle+0xb0/0x288
         do_idle from cpu_startup_entry+0x28/0x2c
         cpu_startup_entry from rest_init+0x150/0x178
         rest_init from start_kernel+0x544/0x5d8

On Salvator-X(S) (R-Car Gen3) and Gray/White Hawk (R-Car Gen4):

        =============================
        WARNING: suspicious RCU usage
        6.13.0-rcar3-08235-gb3d2b6c82b8c #174 Tainted: G        W
        -----------------------------
        drivers/net/phy/phy_device.c:1970 suspicious
rcu_dereference_protected() usage!

        other info that might help us debug this:

        rcu_scheduler_active = 2, debug_locks = 1
        5 locks held by s2idle/1070:
         #0: ffffff84c6c173f0 (sb_writers#5){.+.+}-{0:0}, at:
file_start_write.isra.0+0x24/0x30
         #1: ffffff84cdbf3888 (&of->mutex#2){+.+.}-{4:4}, at:
kernfs_fop_write_iter+0xf8/0x180
         #2: ffffff84c1007168 (kn->active#64){.+.+}-{0:0}, at:
kernfs_fop_write_iter+0x100/0x180
         #3: ffffffc0812d51e8 (system_transition_mutex){+.+.}-{4:4},
at: pm_suspend+0x84/0x248
         #4: ffffff84c211a8f8 (&dev->mutex){....}-{4:4}, at:
device_resume+0xb4/0x1c4

        stack backtrace:
        CPU: 1 UID: 0 PID: 1070 Comm: s2idle Tainted: G        W
   6.13.0-rcar3-08235-gb3d2b6c82b8c #174
        Tainted: [W]=WARN
        Hardware name: Renesas Salvator-X 2nd version board based on
r8a77951 (DT)
        Call trace:
         show_stack+0x14/0x1c (C)
         dump_stack_lvl+0x78/0xa8
         dump_stack+0x14/0x1c
         lockdep_rcu_suspicious+0x138/0x184
         phy_detach+0xc0/0x188
         phy_disconnect+0x44/0x50
         ravb_close+0x7c/0x1b8
         ravb_resume+0xb0/0x130
         dpm_run_callback+0x5c/0xc8
         device_resume+0xf0/0x1c4
         dpm_resume+0x150/0x168
         dpm_resume_end+0x14/0x28
         suspend_devices_and_enter+0x150/0x59c
         pm_suspend+0x214/0x248
         state_store+0xa8/0xe8
         kobj_attr_store+0x14/0x24
         sysfs_kf_write+0x48/0x60
         kernfs_fop_write_iter+0x138/0x180
         vfs_write+0x148/0x1b4
         ksys_write+0x78/0xe0
         __arm64_sys_write+0x14/0x1c
         invoke_syscall+0x68/0xf0
         el0_svc_common.constprop.0+0xb0/0xcc
         do_el0_svc+0x18/0x20
         el0_svc+0x38/0x90
         el0t_64_sync_handler+0x80/0x130
         el0t_64_sync+0x158/0x15c

Probably they were just masked by the other issue before?

Gr{oetje,eeting}s,

                        Geert
Claudiu Jan. 21, 2025, 3:03 p.m. UTC | #2
Hi, Geert, Niklas,

On 21.01.2025 16:49, Geert Uytterhoeven wrote:
> Hi Niklas,
> 
> On Tue, Jan 21, 2025 at 2:59 PM Niklas Söderlund
> <niklas.soderlund+renesas@ragnatech.se> wrote:
>> Use raw_spinlock in order to fix spurious messages about invalid context
>> when spinlock debugging is enabled. The lock is only used to serialize
>> register access.
>>
>>     [    4.239592] =============================
>>     [    4.239595] [ BUG: Invalid wait context ]
> 
> [...]
> 
>>     [    4.426274]  lock_acquire+0x1c4/0x33c
>>     [    4.429942]  _raw_spin_lock_irqsave+0x5c/0x80
>>     [    4.434307]  gpio_rcar_config_interrupt_input_mode+0x34/0x164
>>     [    4.440061]  gpio_rcar_irq_set_type+0xd4/0xd8
> 
>> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> 
> Thanks for your patch!
> This indeed gets rid of the annoying messages on various R-Car boards.
> Unfortunately  I now start seeing other scary messages during resume
> from s2idle/s2ram.
> 
> On marzen (R-Car H1):
> 
>         =============================
>         [ BUG: Invalid wait context ]
>         6.13.0-marzen-08235-gb3d2b6c82b8c #193 Not tainted
>         -----------------------------
>         swapper/0/0 is trying to lock:
>         c2d3c994 (&dev->event_lock){..-.}-{3:3}, at: input_event+0x38/0x60
>         other info that might help us debug this:
>         context-{2:2}
>         no locks held by swapper/0/0.
>         stack backtrace:
>         CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted
> 6.13.0-marzen-08235-gb3d2b6c82b8c #193
>         Hardware name: Generic R8A7779 (Flattened Device Tree)
>         Call trace:
>          unwind_backtrace from show_stack+0x10/0x14
>          show_stack from dump_stack_lvl+0x7c/0xb0
>          dump_stack_lvl from __lock_acquire+0x38c/0x1698
>          __lock_acquire from lock_acquire+0x29c/0x338
>          lock_acquire from _raw_spin_lock_irqsave+0x50/0x64
>          _raw_spin_lock_irqsave from input_event+0x38/0x60
>          input_event from gpio_keys_irq_timer+0x30/0x50
>          gpio_keys_irq_timer from __hrtimer_run_queues+0x208/0x370
>          __hrtimer_run_queues from hrtimer_interrupt+0xbc/0x1f8
>          hrtimer_interrupt from twd_handler+0x30/0x3c
>          twd_handler from handle_percpu_devid_irq+0x58/0xfc
>          handle_percpu_devid_irq from handle_irq_desc+0x68/0x80
>          handle_irq_desc from gic_handle_irq+0x74/0x84
>          gic_handle_irq from generic_handle_arch_irq+0x28/0x3c
>          generic_handle_arch_irq from __irq_svc+0x8c/0xb8
>         Exception stack(0xc0e01f30 to 0xc0e01f78)
>         1f20:                                     ffffffff 00000001
> 2b229000 00000001
>         1f40: c0e0be40 c0173ae0 c0e09090 c0e0be40 c0e09054 c0e09090
> ffffffff 00000000
>         1f60: 00000000 c0e01f80 c08d13b8 c08d13c0 200f0013 ffffffff
>          __irq_svc from cpu_idle_poll+0xc4/0x130
>          cpu_idle_poll from do_idle+0xb0/0x288
>          do_idle from cpu_startup_entry+0x28/0x2c
>          cpu_startup_entry from rest_init+0x150/0x178
>          rest_init from start_kernel+0x544/0x5d8
> 
> On Salvator-X(S) (R-Car Gen3) and Gray/White Hawk (R-Car Gen4):
> 
>         =============================
>         WARNING: suspicious RCU usage
>         6.13.0-rcar3-08235-gb3d2b6c82b8c #174 Tainted: G        W
>         -----------------------------
>         drivers/net/phy/phy_device.c:1970 suspicious
> rcu_dereference_protected() usage!
> 
>         other info that might help us debug this:
> 
>         rcu_scheduler_active = 2, debug_locks = 1
>         5 locks held by s2idle/1070:
>          #0: ffffff84c6c173f0 (sb_writers#5){.+.+}-{0:0}, at:
> file_start_write.isra.0+0x24/0x30
>          #1: ffffff84cdbf3888 (&of->mutex#2){+.+.}-{4:4}, at:
> kernfs_fop_write_iter+0xf8/0x180
>          #2: ffffff84c1007168 (kn->active#64){.+.+}-{0:0}, at:
> kernfs_fop_write_iter+0x100/0x180
>          #3: ffffffc0812d51e8 (system_transition_mutex){+.+.}-{4:4},
> at: pm_suspend+0x84/0x248
>          #4: ffffff84c211a8f8 (&dev->mutex){....}-{4:4}, at:
> device_resume+0xb4/0x1c4
> 
>         stack backtrace:
>         CPU: 1 UID: 0 PID: 1070 Comm: s2idle Tainted: G        W
>    6.13.0-rcar3-08235-gb3d2b6c82b8c #174
>         Tainted: [W]=WARN
>         Hardware name: Renesas Salvator-X 2nd version board based on
> r8a77951 (DT)
>         Call trace:
>          show_stack+0x14/0x1c (C)
>          dump_stack_lvl+0x78/0xa8
>          dump_stack+0x14/0x1c
>          lockdep_rcu_suspicious+0x138/0x184
>          phy_detach+0xc0/0x188
>          phy_disconnect+0x44/0x50
>          ravb_close+0x7c/0x1b8
>          ravb_resume+0xb0/0x130
>          dpm_run_callback+0x5c/0xc8
>          device_resume+0xf0/0x1c4
>          dpm_resume+0x150/0x168
>          dpm_resume_end+0x14/0x28
>          suspend_devices_and_enter+0x150/0x59c
>          pm_suspend+0x214/0x248
>          state_store+0xa8/0xe8
>          kobj_attr_store+0x14/0x24
>          sysfs_kf_write+0x48/0x60
>          kernfs_fop_write_iter+0x138/0x180
>          vfs_write+0x148/0x1b4
>          ksys_write+0x78/0xe0
>          __arm64_sys_write+0x14/0x1c
>          invoke_syscall+0x68/0xf0
>          el0_svc_common.constprop.0+0xb0/0xcc
>          do_el0_svc+0x18/0x20
>          el0_svc+0x38/0x90
>          el0t_64_sync_handler+0x80/0x130
>          el0t_64_sync+0x158/0x15c

The ravb issue is under discussion here:
https://lore.kernel.org/all/20250120141926.1290763-1-kory.maincent@bootlin.com

Thank you,
Claudiu

> 
> Probably they were just masked by the other issue before?
> 
> Gr{oetje,eeting}s,
> 
>                         Geert
>
Niklas Söderlund Jan. 22, 2025, 5:27 p.m. UTC | #3
Hi Geert,

On 2025-01-21 15:49:59 +0100, Geert Uytterhoeven wrote:
> Hi Niklas,
> 
> On Tue, Jan 21, 2025 at 2:59 PM Niklas Söderlund
> <niklas.soderlund+renesas@ragnatech.se> wrote:
> > Use raw_spinlock in order to fix spurious messages about invalid context
> > when spinlock debugging is enabled. The lock is only used to serialize
> > register access.
> >
> >     [    4.239592] =============================
> >     [    4.239595] [ BUG: Invalid wait context ]
> 
> [...]
> 
> >     [    4.426274]  lock_acquire+0x1c4/0x33c
> >     [    4.429942]  _raw_spin_lock_irqsave+0x5c/0x80
> >     [    4.434307]  gpio_rcar_config_interrupt_input_mode+0x34/0x164
> >     [    4.440061]  gpio_rcar_irq_set_type+0xd4/0xd8
> 
> > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> 
> Thanks for your patch!
> This indeed gets rid of the annoying messages on various R-Car boards.
> Unfortunately  I now start seeing other scary messages during resume
> from s2idle/s2ram.

I think this might be symtom of issues in those drivers too. As Claudiu 
points out the issue in RAVB was discussed and fixed by patch [1].

With this and patch and [1] applied I no longer see a splat when 
resuming on M3N using WoL.

I still think this patch is correct, but of course the bug on Marzen 
should be fixed, but that is unrelated to this patch. Would you agree?

1.[PATCH net 1/2] net: ravb: Fix missing rtnl lock in suspend path

> 
> On marzen (R-Car H1):
> 
>         =============================
>         [ BUG: Invalid wait context ]
>         6.13.0-marzen-08235-gb3d2b6c82b8c #193 Not tainted
>         -----------------------------
>         swapper/0/0 is trying to lock:
>         c2d3c994 (&dev->event_lock){..-.}-{3:3}, at: input_event+0x38/0x60
>         other info that might help us debug this:
>         context-{2:2}
>         no locks held by swapper/0/0.
>         stack backtrace:
>         CPU: 0 UID: 0 PID: 0 Comm: swapper/0 Not tainted
> 6.13.0-marzen-08235-gb3d2b6c82b8c #193
>         Hardware name: Generic R8A7779 (Flattened Device Tree)
>         Call trace:
>          unwind_backtrace from show_stack+0x10/0x14
>          show_stack from dump_stack_lvl+0x7c/0xb0
>          dump_stack_lvl from __lock_acquire+0x38c/0x1698
>          __lock_acquire from lock_acquire+0x29c/0x338
>          lock_acquire from _raw_spin_lock_irqsave+0x50/0x64
>          _raw_spin_lock_irqsave from input_event+0x38/0x60
>          input_event from gpio_keys_irq_timer+0x30/0x50
>          gpio_keys_irq_timer from __hrtimer_run_queues+0x208/0x370
>          __hrtimer_run_queues from hrtimer_interrupt+0xbc/0x1f8
>          hrtimer_interrupt from twd_handler+0x30/0x3c
>          twd_handler from handle_percpu_devid_irq+0x58/0xfc
>          handle_percpu_devid_irq from handle_irq_desc+0x68/0x80
>          handle_irq_desc from gic_handle_irq+0x74/0x84
>          gic_handle_irq from generic_handle_arch_irq+0x28/0x3c
>          generic_handle_arch_irq from __irq_svc+0x8c/0xb8
>         Exception stack(0xc0e01f30 to 0xc0e01f78)
>         1f20:                                     ffffffff 00000001
> 2b229000 00000001
>         1f40: c0e0be40 c0173ae0 c0e09090 c0e0be40 c0e09054 c0e09090
> ffffffff 00000000
>         1f60: 00000000 c0e01f80 c08d13b8 c08d13c0 200f0013 ffffffff
>          __irq_svc from cpu_idle_poll+0xc4/0x130
>          cpu_idle_poll from do_idle+0xb0/0x288
>          do_idle from cpu_startup_entry+0x28/0x2c
>          cpu_startup_entry from rest_init+0x150/0x178
>          rest_init from start_kernel+0x544/0x5d8
> 
> On Salvator-X(S) (R-Car Gen3) and Gray/White Hawk (R-Car Gen4):
> 
>         =============================
>         WARNING: suspicious RCU usage
>         6.13.0-rcar3-08235-gb3d2b6c82b8c #174 Tainted: G        W
>         -----------------------------
>         drivers/net/phy/phy_device.c:1970 suspicious
> rcu_dereference_protected() usage!
> 
>         other info that might help us debug this:
> 
>         rcu_scheduler_active = 2, debug_locks = 1
>         5 locks held by s2idle/1070:
>          #0: ffffff84c6c173f0 (sb_writers#5){.+.+}-{0:0}, at:
> file_start_write.isra.0+0x24/0x30
>          #1: ffffff84cdbf3888 (&of->mutex#2){+.+.}-{4:4}, at:
> kernfs_fop_write_iter+0xf8/0x180
>          #2: ffffff84c1007168 (kn->active#64){.+.+}-{0:0}, at:
> kernfs_fop_write_iter+0x100/0x180
>          #3: ffffffc0812d51e8 (system_transition_mutex){+.+.}-{4:4},
> at: pm_suspend+0x84/0x248
>          #4: ffffff84c211a8f8 (&dev->mutex){....}-{4:4}, at:
> device_resume+0xb4/0x1c4
> 
>         stack backtrace:
>         CPU: 1 UID: 0 PID: 1070 Comm: s2idle Tainted: G        W
>    6.13.0-rcar3-08235-gb3d2b6c82b8c #174
>         Tainted: [W]=WARN
>         Hardware name: Renesas Salvator-X 2nd version board based on
> r8a77951 (DT)
>         Call trace:
>          show_stack+0x14/0x1c (C)
>          dump_stack_lvl+0x78/0xa8
>          dump_stack+0x14/0x1c
>          lockdep_rcu_suspicious+0x138/0x184
>          phy_detach+0xc0/0x188
>          phy_disconnect+0x44/0x50
>          ravb_close+0x7c/0x1b8
>          ravb_resume+0xb0/0x130
>          dpm_run_callback+0x5c/0xc8
>          device_resume+0xf0/0x1c4
>          dpm_resume+0x150/0x168
>          dpm_resume_end+0x14/0x28
>          suspend_devices_and_enter+0x150/0x59c
>          pm_suspend+0x214/0x248
>          state_store+0xa8/0xe8
>          kobj_attr_store+0x14/0x24
>          sysfs_kf_write+0x48/0x60
>          kernfs_fop_write_iter+0x138/0x180
>          vfs_write+0x148/0x1b4
>          ksys_write+0x78/0xe0
>          __arm64_sys_write+0x14/0x1c
>          invoke_syscall+0x68/0xf0
>          el0_svc_common.constprop.0+0xb0/0xcc
>          do_el0_svc+0x18/0x20
>          el0_svc+0x38/0x90
>          el0t_64_sync_handler+0x80/0x130
>          el0t_64_sync+0x158/0x15c
> 
> Probably they were just masked by the other issue before?
> 
> 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
Geert Uytterhoeven March 4, 2025, 4:02 p.m. UTC | #4
Hi Niklas,

On Wed, 22 Jan 2025 at 18:27, Niklas Söderlund
<niklas.soderlund+renesas@ragnatech.se> wrote:
> On 2025-01-21 15:49:59 +0100, Geert Uytterhoeven wrote:
> > On Tue, Jan 21, 2025 at 2:59 PM Niklas Söderlund
> > <niklas.soderlund+renesas@ragnatech.se> wrote:
> > > Use raw_spinlock in order to fix spurious messages about invalid context
> > > when spinlock debugging is enabled. The lock is only used to serialize
> > > register access.
> > >
> > >     [    4.239592] =============================
> > >     [    4.239595] [ BUG: Invalid wait context ]
> >
> > [...]
> >
> > >     [    4.426274]  lock_acquire+0x1c4/0x33c
> > >     [    4.429942]  _raw_spin_lock_irqsave+0x5c/0x80
> > >     [    4.434307]  gpio_rcar_config_interrupt_input_mode+0x34/0x164
> > >     [    4.440061]  gpio_rcar_irq_set_type+0xd4/0xd8
> >
> > > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> >
> > Thanks for your patch!
> > This indeed gets rid of the annoying messages on various R-Car boards.
> > Unfortunately  I now start seeing other scary messages during resume
> > from s2idle/s2ram.
>
> I think this might be symtom of issues in those drivers too. As Claudiu
> points out the issue in RAVB was discussed and fixed by patch [1].
>
> With this and patch and [1] applied I no longer see a splat when
> resuming on M3N using WoL.
>
> I still think this patch is correct, but of course the bug on Marzen
> should be fixed, but that is unrelated to this patch. Would you agree?

Yes, I think we should proceed with this patch.

Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Tested-by: Geert Uytterhoeven <geert+renesas@glider.be>

> 1.[PATCH net 1/2] net: ravb: Fix missing rtnl lock in suspend path

Gr{oetje,eeting}s,

                        Geert
Bartosz Golaszewski March 5, 2025, 12:15 p.m. UTC | #5
From: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>


On Tue, 21 Jan 2025 14:58:33 +0100, Niklas Söderlund wrote:
> Use raw_spinlock in order to fix spurious messages about invalid context
> when spinlock debugging is enabled. The lock is only used to serialize
> register access.
> 
>     [    4.239592] =============================
>     [    4.239595] [ BUG: Invalid wait context ]
>     [    4.239599] 6.13.0-rc7-arm64-renesas-05496-gd088502a519f #35 Not tainted
>     [    4.239603] -----------------------------
>     [    4.239606] kworker/u8:5/76 is trying to lock:
>     [    4.239609] ffff0000091898a0 (&p->lock){....}-{3:3}, at: gpio_rcar_config_interrupt_input_mode+0x34/0x164
>     [    4.239641] other info that might help us debug this:
>     [    4.239643] context-{5:5}
>     [    4.239646] 5 locks held by kworker/u8:5/76:
>     [    4.239651]  #0: ffff0000080fb148 ((wq_completion)async){+.+.}-{0:0}, at: process_one_work+0x190/0x62c
>     [    4.250180] OF: /soc/sound@ec500000/ports/port@0/endpoint: Read of boolean property 'frame-master' with a value.
>     [    4.254094]  #1: ffff80008299bd80 ((work_completion)(&entry->work)){+.+.}-{0:0}, at: process_one_work+0x1b8/0x62c
>     [    4.254109]  #2: ffff00000920c8f8
>     [    4.258345] OF: /soc/sound@ec500000/ports/port@1/endpoint: Read of boolean property 'bitclock-master' with a value.
>     [    4.264803]  (&dev->mutex){....}-{4:4}, at: __device_attach_async_helper+0x3c/0xdc
>     [    4.264820]  #3: ffff00000a50ca40 (request_class#2){+.+.}-{4:4}, at: __setup_irq+0xa0/0x690
>     [    4.264840]  #4:
>     [    4.268872] OF: /soc/sound@ec500000/ports/port@1/endpoint: Read of boolean property 'frame-master' with a value.
>     [    4.273275] ffff00000a50c8c8 (lock_class){....}-{2:2}, at: __setup_irq+0xc4/0x690
>     [    4.296130] renesas_sdhi_internal_dmac ee100000.mmc: mmc1 base at 0x00000000ee100000, max clock rate 200 MHz
>     [    4.304082] stack backtrace:
>     [    4.304086] CPU: 1 UID: 0 PID: 76 Comm: kworker/u8:5 Not tainted 6.13.0-rc7-arm64-renesas-05496-gd088502a519f #35
>     [    4.304092] Hardware name: Renesas Salvator-X 2nd version board based on r8a77965 (DT)
>     [    4.304097] Workqueue: async async_run_entry_fn
>     [    4.304106] Call trace:
>     [    4.304110]  show_stack+0x14/0x20 (C)
>     [    4.304122]  dump_stack_lvl+0x6c/0x90
>     [    4.304131]  dump_stack+0x14/0x1c
>     [    4.304138]  __lock_acquire+0xdfc/0x1584
>     [    4.426274]  lock_acquire+0x1c4/0x33c
>     [    4.429942]  _raw_spin_lock_irqsave+0x5c/0x80
>     [    4.434307]  gpio_rcar_config_interrupt_input_mode+0x34/0x164
>     [    4.440061]  gpio_rcar_irq_set_type+0xd4/0xd8
>     [    4.444422]  __irq_set_trigger+0x5c/0x178
>     [    4.448435]  __setup_irq+0x2e4/0x690
>     [    4.452012]  request_threaded_irq+0xc4/0x190
>     [    4.456285]  devm_request_threaded_irq+0x7c/0xf4
>     [    4.459398] ata1: link resume succeeded after 1 retries
>     [    4.460902]  mmc_gpiod_request_cd_irq+0x68/0xe0
>     [    4.470660]  mmc_start_host+0x50/0xac
>     [    4.474327]  mmc_add_host+0x80/0xe4
>     [    4.477817]  tmio_mmc_host_probe+0x2b0/0x440
>     [    4.482094]  renesas_sdhi_probe+0x488/0x6f4
>     [    4.486281]  renesas_sdhi_internal_dmac_probe+0x60/0x78
>     [    4.491509]  platform_probe+0x64/0xd8
>     [    4.495178]  really_probe+0xb8/0x2a8
>     [    4.498756]  __driver_probe_device+0x74/0x118
>     [    4.503116]  driver_probe_device+0x3c/0x154
>     [    4.507303]  __device_attach_driver+0xd4/0x160
>     [    4.511750]  bus_for_each_drv+0x84/0xe0
>     [    4.515588]  __device_attach_async_helper+0xb0/0xdc
>     [    4.520470]  async_run_entry_fn+0x30/0xd8
>     [    4.524481]  process_one_work+0x210/0x62c
>     [    4.528494]  worker_thread+0x1ac/0x340
>     [    4.532245]  kthread+0x10c/0x110
>     [    4.535476]  ret_from_fork+0x10/0x20
> 
> [...]

Applied, thanks!

[1/1] gpio: rcar: Use raw_spinlock to protect register access
      commit: f02c41f87cfe61440c18bf77d1ef0a884b9ee2b5

Best regards,
diff mbox series

Patch

diff --git a/drivers/gpio/gpio-rcar.c b/drivers/gpio/gpio-rcar.c
index 2ecee3269a0c..8e0544e92488 100644
--- a/drivers/gpio/gpio-rcar.c
+++ b/drivers/gpio/gpio-rcar.c
@@ -40,7 +40,7 @@  struct gpio_rcar_info {
 
 struct gpio_rcar_priv {
 	void __iomem *base;
-	spinlock_t lock;
+	raw_spinlock_t lock;
 	struct device *dev;
 	struct gpio_chip gpio_chip;
 	unsigned int irq_parent;
@@ -123,7 +123,7 @@  static void gpio_rcar_config_interrupt_input_mode(struct gpio_rcar_priv *p,
 	 * "Setting Level-Sensitive Interrupt Input Mode"
 	 */
 
-	spin_lock_irqsave(&p->lock, flags);
+	raw_spin_lock_irqsave(&p->lock, flags);
 
 	/* Configure positive or negative logic in POSNEG */
 	gpio_rcar_modify_bit(p, POSNEG, hwirq, !active_high_rising_edge);
@@ -142,7 +142,7 @@  static void gpio_rcar_config_interrupt_input_mode(struct gpio_rcar_priv *p,
 	if (!level_trigger)
 		gpio_rcar_write(p, INTCLR, BIT(hwirq));
 
-	spin_unlock_irqrestore(&p->lock, flags);
+	raw_spin_unlock_irqrestore(&p->lock, flags);
 }
 
 static int gpio_rcar_irq_set_type(struct irq_data *d, unsigned int type)
@@ -246,7 +246,7 @@  static void gpio_rcar_config_general_input_output_mode(struct gpio_chip *chip,
 	 * "Setting General Input Mode"
 	 */
 
-	spin_lock_irqsave(&p->lock, flags);
+	raw_spin_lock_irqsave(&p->lock, flags);
 
 	/* Configure positive logic in POSNEG */
 	gpio_rcar_modify_bit(p, POSNEG, gpio, false);
@@ -261,7 +261,7 @@  static void gpio_rcar_config_general_input_output_mode(struct gpio_chip *chip,
 	if (p->info.has_outdtsel && output)
 		gpio_rcar_modify_bit(p, OUTDTSEL, gpio, false);
 
-	spin_unlock_irqrestore(&p->lock, flags);
+	raw_spin_unlock_irqrestore(&p->lock, flags);
 }
 
 static int gpio_rcar_request(struct gpio_chip *chip, unsigned offset)
@@ -347,7 +347,7 @@  static int gpio_rcar_get_multiple(struct gpio_chip *chip, unsigned long *mask,
 		return 0;
 	}
 
-	spin_lock_irqsave(&p->lock, flags);
+	raw_spin_lock_irqsave(&p->lock, flags);
 	outputs = gpio_rcar_read(p, INOUTSEL);
 	m = outputs & bankmask;
 	if (m)
@@ -356,7 +356,7 @@  static int gpio_rcar_get_multiple(struct gpio_chip *chip, unsigned long *mask,
 	m = ~outputs & bankmask;
 	if (m)
 		val |= gpio_rcar_read(p, INDT) & m;
-	spin_unlock_irqrestore(&p->lock, flags);
+	raw_spin_unlock_irqrestore(&p->lock, flags);
 
 	bits[0] = val;
 	return 0;
@@ -367,9 +367,9 @@  static void gpio_rcar_set(struct gpio_chip *chip, unsigned offset, int value)
 	struct gpio_rcar_priv *p = gpiochip_get_data(chip);
 	unsigned long flags;
 
-	spin_lock_irqsave(&p->lock, flags);
+	raw_spin_lock_irqsave(&p->lock, flags);
 	gpio_rcar_modify_bit(p, OUTDT, offset, value);
-	spin_unlock_irqrestore(&p->lock, flags);
+	raw_spin_unlock_irqrestore(&p->lock, flags);
 }
 
 static void gpio_rcar_set_multiple(struct gpio_chip *chip, unsigned long *mask,
@@ -386,12 +386,12 @@  static void gpio_rcar_set_multiple(struct gpio_chip *chip, unsigned long *mask,
 	if (!bankmask)
 		return;
 
-	spin_lock_irqsave(&p->lock, flags);
+	raw_spin_lock_irqsave(&p->lock, flags);
 	val = gpio_rcar_read(p, OUTDT);
 	val &= ~bankmask;
 	val |= (bankmask & bits[0]);
 	gpio_rcar_write(p, OUTDT, val);
-	spin_unlock_irqrestore(&p->lock, flags);
+	raw_spin_unlock_irqrestore(&p->lock, flags);
 }
 
 static int gpio_rcar_direction_output(struct gpio_chip *chip, unsigned offset,
@@ -505,7 +505,7 @@  static int gpio_rcar_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	p->dev = dev;
-	spin_lock_init(&p->lock);
+	raw_spin_lock_init(&p->lock);
 
 	/* Get device configuration from DT node */
 	ret = gpio_rcar_parse_dt(p, &npins);