Re: [RFC/PATCH 0/2] clocksource/drivers/sh_cmt: Improve clock event design

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

 



Hi Niklas,

On Sat, 30 Aug 2025 at 23:10, Niklas Söderlund
<niklas.soderlund+renesas@xxxxxxxxxxxx> wrote:
> This RFC/PATCH tries to address an issue with the Renesas CMT driver
> design. The driver do PM and clock handling in struct clock_event_device
> callbacks. This leads to LOCKDEP warnings and I think hints at a larger
> issue.
>
>     =============================
>     [ BUG: Invalid wait context ]
>     6.17.0-rc3-arm64-renesas-03071-gb3c4f4122b28-dirty #21 Not tainted
>     -----------------------------
>     swapper/1/0 is trying to lock:
>     ffff00000898d180 (&dev->power.lock){-...}-{3:3}, at: __pm_runtime_resume+0x38/0x88
>     ccree e6601000.crypto: ARM CryptoCell 630P Driver: HW version 0xAF400001/0xDCC63000, Driver version 5.0
>     other info that might help us debug this:
>     ccree e6601000.crypto: ARM ccree device initialized
>     context-{5:5}
>     2 locks held by swapper/1/0:
>      #0: ffff80008173c298 (tick_broadcast_lock){-...}-{2:2}, at: __tick_broadcast_oneshot_control+0xa4/0x3a8
>      #1: ffff0000089a5858 (&ch->lock){....}-{2:2}
>     usbcore: registered new interface driver usbhid
>     , at: sh_cmt_start+0x30/0x364
>     stack backtrace:
>     CPU: 1 UID: 0 PID: 0 Comm: swapper/1 Not tainted 6.17.0-rc3-arm64-renesas-03071-gb3c4f4122b28-dirty #21 PREEMPT
>     Hardware name: Renesas Salvator-X 2nd version board based on r8a77965 (DT)
>     Call trace:
>      show_stack+0x14/0x1c (C)
>      dump_stack_lvl+0x6c/0x90
>      dump_stack+0x14/0x1c
>      __lock_acquire+0x904/0x1584
>      lock_acquire+0x220/0x34c
>      _raw_spin_lock_irqsave+0x58/0x80
>      __pm_runtime_resume+0x38/0x88
>      sh_cmt_start+0x54/0x364
>      sh_cmt_clock_event_set_oneshot+0x64/0xb8
>      clockevents_switch_state+0xfc/0x13c
>      tick_broadcast_set_event+0x30/0xa4
>      __tick_broadcast_oneshot_control+0x1e0/0x3a8
>      tick_broadcast_oneshot_control+0x30/0x40
>      cpuidle_enter_state+0x40c/0x680
>      cpuidle_enter+0x30/0x40
>      do_idle+0x1f4/0x26c
>      cpu_startup_entry+0x34/0x40
>      secondary_start_kernel+0x11c/0x13c
>      __secondary_switched+0x74/0x78
>
> This series tries to address this by instead doing PM and clock
> management at probe time, and leaving them on for the CMT channels that
> are used as clock events. The CMT design is a bit messy as channels can
> be used both as clock sources and events. And the design to do the
> housekeeping for clock sources seems to be valid and is kept.
>
> This is posted as an RFC as there is one other driver in-tree that
> suffers form similar issues. I intend to try and refactor that away too,
> but would like to try and get some feedback first.
>
> The work is tested on R-Car M3N.
>
> Niklas Söderlund (2):
>   clocksource/drivers/sh_cmt: Split start/stop of clock source and
>     events
>   clocksource/drivers/sh_cmt: Do not power down channels used for events

Thanks for your series!

I can confirm this fixes the issue on e.g. R-Car Gen3, where the CMT
can be used for clock events or as a clock source, so
Tested-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx>

On R-Mobile A1, the CMT is also used for periodic clock events.
Your series seems to fix one invalid context, and expose a "new" one
(lockdep shuts down after the first report):

    sh_cmt e6138000.timer: ch0: used for clock events
    sh_cmt e6138000.timer: ch0: used for periodic clock events

    =============================
    [ BUG: Invalid wait context ]
    6.17.0-rc5-armadillo-06055-g57d9d685e295 #872 Not tainted
    -----------------------------
    swapper/0/1 is trying to lock:
    c0e5ae28 (enable_lock){....}-{3:3}, at: clk_enable_lock+0x38/0xc4
    other info that might help us debug this:
    context-{5:5}
    2 locks held by swapper/0/1:
     #0: c218e488 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xd8/0xf8
     #1: c2201038 (&ch->lock){....}-{2:2}, at: sh_cmt_probe+0x598/0x780
    stack backtrace:
    CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted
6.17.0-rc5-armadillo-06055-g57d9d685e295 #872 NONE
    Hardware name: Generic R8A7740 (Flattened Device Tree)
    Call trace:
     unwind_backtrace from show_stack+0x10/0x14
     show_stack from dump_stack_lvl+0x44/0x74
     dump_stack_lvl from __lock_acquire+0x41c/0x17e8
     __lock_acquire from lock_acquire+0x208/0x28c
     lock_acquire from _raw_spin_lock_irqsave+0x50/0x64

   - _raw_spin_lock_irqsave from __pm_runtime_resume+0x54/0x80
   - __pm_runtime_resume from sh_cmt_start+0x60/0x26c
   - sh_cmt_start from sh_cmt_clock_event_set_state+0x60/0xe8
   - sh_cmt_clock_event_set_state from clockevents_switch_state+0x90/0x138
   - clockevents_switch_state from clockevents_register_device+0x78/0xe8
   - clockevents_register_device from sh_cmt_probe+0x588/0x700
   + _raw_spin_lock_irqsave from clk_enable_lock+0x38/0xc4
   + clk_enable_lock from clk_core_enable_lock+0xc/0x2c
   + clk_core_enable_lock from sh_cmt_enable+0x28/0x1c8
   + sh_cmt_enable from sh_cmt_probe+0x5a4/0x780

     sh_cmt_probe from platform_probe+0x58/0x90
     platform_probe from really_probe+0x128/0x28c
     really_probe from __driver_probe_device+0x16c/0x18c
     __driver_probe_device from driver_probe_device+0x2c/0xa8
     driver_probe_device from __driver_attach+0xe4/0xf8
     __driver_attach from bus_for_each_dev+0x84/0xc8
     bus_for_each_dev from bus_add_driver+0xd0/0x1d8
     bus_add_driver from driver_register+0xb8/0x100
     driver_register from do_one_initcall+0x74/0x1cc
     do_one_initcall from kernel_init_freeable+0x224/0x294
     kernel_init_freeable from kernel_init+0x14/0x12c
     kernel_init from ret_from_fork+0x14/0x28
    Exception stack(0xe0851fb0 to 0xe0851ff8)
    1fa0:                                     00000000 00000000
00000000 00000000
    1fc0: 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000
    1fe0: 00000000 00000000 00000000 00000000 00000013 00000000

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





[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux