• Nishanth Menon's avatar
    ARM: OMAP: clock: fix race in disable all clocks · 0eb4fd9b
    Nishanth Menon authored
    clk_disable_unused is invoked when CONFIG_OMAP_RESET_CLOCKS=y.
    Since clk_disable_unused is called as lateinitcall, there can
    be more than a few workqueues executing off secondary CPU(s).
    The current code does the following:
    a) checks if clk is unused
    b) holds lock
    c) disables clk
    d) unlocks
    
    Between (a) and (b) being executed on CPU0, It is possible to
    have a driver executing on CPU1 which could do a get_sync->clk_get
    (and increase the use_count) of the clock which was just about
    to be disabled by clk_disable_unused.
    
    We ensure instead that the entire list traversal is protected by
    the lock allowing for parent child clock traversal which could be
    potentially be done by runtime operations to be safe as well.
    Reported-by: default avatarTodd Poynor <toddpoynor@google.com>
    Signed-off-by: default avatarNishanth Menon <nm@ti.com>
    Signed-off-by: default avatarPaul Walmsley <paul@pwsan.com>
    0eb4fd9b
clock.c 11.6 KB