Stephen Boyd
903c6bd937
clk: Evict unregistered clks from parent caches
...
commit bdcf1dc253248542537a742ae1e7ccafdd03f2d3 upstream.
We leave a dangling pointer in each clk_core::parents array that has an
unregistered clk as a potential parent when that clk_core pointer is
freed by clk{_hw}_unregister(). It is impossible for the true parent of
a clk to be set with clk_set_parent() once the dangling pointer is left
in the cache because we compare parent pointers in
clk_fetch_parent_index() instead of checking for a matching clk name or
clk_hw pointer.
Before commit ede77858473a ("clk: Remove global clk traversal on fetch
parent index"), we would check clk_hw pointers, which has a higher
chance of being the same between registration and unregistration, but it
can still be allocated and freed by the clk provider. In fact, this has
been a long standing problem since commit da0f0b2c3a ("clk: Correct
lookup logic in clk_fetch_parent_index()") where we stopped trying to
compare clk names and skipped over entries in the cache that weren't
NULL.
There are good (performance) reasons to not do the global tree lookup in
cases where the cache holds dangling pointers to parents that have been
unregistered. Let's take the performance hit on the uncommon
registration path instead. Loop through all the clk_core::parents arrays
when a clk is unregistered and set the entry to NULL when the parent
cache entry and clk being unregistered are the same pointer. This will
fix this problem and avoid the overhead for the "normal" case.
Based on a patch by Bjorn Andersson.
Fixes: da0f0b2c3a ("clk: Correct lookup logic in clk_fetch_parent_index()")
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Tested-by: Sai Prakash Ranjan <saiprakash.ranjan@codeaurora.org>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Link: https://lkml.kernel.org/r/20190828181959.204401-1-sboyd@kernel.org
Tested-by: Naresh Kamboju <naresh.kamboju@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2020-08-26 10:31:07 +02:00
..
actions
clk: actions: Fix factor clk struct member access
2020-01-27 14:51:14 +01:00
at91
clk: at91: usb: continue if clk_hw_round_rate() return zero
2020-04-23 10:30:17 +02:00
axis
axs10x
clk: axs10x: introduce AXS10X pll driver
2017-07-17 11:50:59 -07:00
bcm
clk: bcm2835: Fix return type of bcm2835_register_gate
2020-06-25 15:33:00 +02:00
berlin
This time we have a good set of changes to the core framework that do some
2018-06-09 12:06:24 -07:00
davinci
ARM: 32-bit SoC platform updates
2018-08-23 13:44:43 -07:00
h8300
clk: h8300: pr_err() strings should end with newlines
2017-12-06 22:40:02 -08:00
hisilicon
clk: hi3660: Mark clk_gate_ufs_subsys as critical
2019-05-25 18:23:28 +02:00
imgtec
clk: boston: unregister clks on failure in clk_boston_setup()
2019-11-06 13:05:26 +01:00
imx
clk: vf610: fix refcount leak in vf610_clocks_init()
2020-01-27 14:50:09 +01:00
ingenic
clk: ingenic/jz4770: Exit with error if CGU init failed
2020-04-17 10:48:52 +02:00
keystone
clk: keystone: Enable TISCI clocks if K3_ARCH
2019-11-24 08:19:48 +01:00
loongson1
mediatek
clk: mediatek: Drop more __init markings for driver probe
2019-12-13 08:52:16 +01:00
meson
clk: meson: axg: spread spectrum is on mpll2
2020-01-27 14:50:49 +01:00
microchip
mmp
clk: mmp2: Fix the order of timer mux parents
2020-02-05 14:43:43 +00:00
mvebu
clk: dove: fix refcount leak in dove_clk_init()
2020-01-27 14:50:10 +01:00
mxs
clk: mxs: make clk_ops const
2017-11-01 23:25:43 -07:00
nxp
clk: lpc32xx: Set name of regmap_config
2018-03-19 14:35:16 -07:00
pistachio
pxa
clk: pxa: fix one of the pxa RTC clocks
2020-01-04 19:12:57 +01:00
qcom
clk: qcom: msm8916: Fix the address location of pll->config_reg
2020-06-25 15:32:47 +02:00
renesas
clk: renesas: rcar-gen3: Set state when registering SD clocks
2019-12-13 08:52:32 +01:00
rockchip
clk: rockchip: fix incorrect configuration of rk3228 aclk_gpu* clocks
2020-05-20 08:18:50 +02:00
samsung
clk: samsung: exynos5433: Add IGNORE_UNUSED flag to sclk_i2s1
2020-06-25 15:32:58 +02:00
sirf
clk: clk-atlas6: fix return value check in atlas6_clk_init()
2020-08-21 11:05:36 +02:00
socfpga
clk: socfpga: fix refcount leak
2020-01-27 14:50:08 +01:00
spear
clk: spear: fix WDT clock definition on SPEAr600
2018-04-06 13:45:34 -07:00
sprd
clk: sprd: return correct type of value for _sprd_pll_recalc_rate
2020-06-25 15:33:00 +02:00
st
clk: clk-flexgen: fix clock-critical handling
2020-06-25 15:32:50 +02:00
sunxi
clk: sunxi: Fix incorrect usage of round_down()
2020-06-25 15:32:47 +02:00
sunxi-ng
clk: sunxi-ng: add mux and pll notifiers for A64 CPU clock
2020-02-24 08:34:44 +01:00
tegra
clk: tegra: Fix Tegra PMC clock out parents
2020-04-23 10:30:17 +02:00
ti
clk: ti: composite: fix memory leak
2020-06-25 15:32:56 +02:00
uniphier
clk: uniphier: Add SCSSI clock gate for each channel
2020-02-24 08:34:45 +01:00
ux500
clk: ux500: Drop AB8540/9540 support
2018-03-23 09:36:11 -07:00
versatile
clk: versatile: Remove WARNs in ->round_rate()
2018-03-16 15:31:16 -07:00
x86
clk: x86: Add system specific quirk to mark clocks as critical
2019-05-08 07:21:54 +02:00
zte
clk: zx296718: Don't reference clk_init_data after registration
2019-10-07 18:56:46 +02:00
zynq
clk-asm9260.c
treewide: Use struct_size() for kmalloc()-family
2018-06-06 11:15:43 -07:00
clk-aspeed.c
The new and exciting feature this time around is in the clk core.
2018-08-15 21:41:21 -07:00
clk-axi-clkgen.c
clk: axi-clkgen: Round closest in round_rate() and recalc_rate()
2017-12-21 18:07:53 -08:00
clk-axm5516.c
clk-bulk.c
clk: bulk: silently error out on EPROBE_DEFER
2018-05-15 15:16:13 -07:00
clk-cdce706.c
clk-cdce925.c
clk: cdce925: remove redundant check for non-null parent_name
2017-11-13 17:44:15 -08:00
clk-clps711x.c
treewide: Use struct_size() for kmalloc()-family
2018-06-06 11:15:43 -07:00
clk-composite.c
clk-conf.c
clk: Convert to using %pOF instead of full_name
2017-07-21 15:49:54 -07:00
clk-cs2000-cp.c
clk: cs2000-cp: convert to SPDX identifiers
2018-08-02 13:55:00 -07:00
clk-devres.c
clk: add managed version of clk_bulk_get
2017-06-02 15:37:49 -07:00
clk-divider.c
clk: divider: read-only divider can propagate rate change
2018-03-12 15:10:26 -07:00
clk-efm32gg.c
treewide: Use struct_size() for kmalloc()-family
2018-06-06 11:15:43 -07:00
clk-fixed-factor.c
clk: fixed-factor: fix of_node_get-put imbalance
2018-11-27 16:13:04 +01:00
clk-fixed-rate.c
clk: fixed-rate: fix of_node_get-put imbalance
2018-11-27 16:13:00 +01:00
clk-fractional-divider.c
clk: fractional-divider: check parent rate only if flag is set
2019-04-05 22:33:03 +02:00
clk-gate.c
clk: gate: expose clk_gate_ops::is_enabled
2017-08-31 18:35:45 -07:00
clk-gemini.c
treewide: Use struct_size() for kmalloc()-family
2018-06-06 11:15:43 -07:00
clk-gpio.c
clk: clk-gpio: propagate rate change to parent
2020-01-04 19:12:52 +01:00
clk-hi655x.c
clk: hi6220: Add the hi655x's pmic clock
2017-04-21 19:18:53 -07:00
clk-highbank.c
clk: highbank: fix refcount leak in hb_clk_init()
2020-01-27 14:50:08 +01:00
clk-hsdk-pll.c
ARC: clk: fix spelling mistake: "configurarion" -> "configuration"
2017-11-13 17:44:26 -08:00
clk-max9485.c
clk: Add driver for MAX9485
2018-07-06 13:44:06 -07:00
clk-max77686.c
clk-moxart.c
clk: Convert to using %pOF instead of full_name
2017-07-21 15:49:54 -07:00
clk-multiplier.c
clk-mux.c
clk: honor CLK_MUX_ROUND_CLOSEST in generic clk mux
2018-04-16 09:25:07 -07:00
clk-nomadik.c
clk: nomadik: Delete error messages for a failed memory allocation in two functions
2017-04-21 19:47:14 -07:00
clk-npcm7xx.c
clk: npcm7xx: fix memory allocation
2018-08-28 15:12:59 -07:00
clk-nspire.c
clk-oxnas.c
clk-palmas.c
clk: palmas: undo preparation of a clock source.
2017-06-02 10:51:34 -07:00
clk-pwm.c
clk-qoriq.c
clk: qoriq: fix refcount leak in clockgen_init()
2020-01-27 14:50:08 +01:00
clk-rk808.c
clk-s2mps11.c
clk: s2mps11: Add used attribute to s2mps11_dt_match
2019-09-16 08:21:45 +02:00
clk-scmi.c
clk: scmi: Fix min and max rate when registering clocks with discrete rates
2020-08-19 08:14:49 +02:00
clk-scpi.c
clk: scpi: error when clock fails to register
2017-06-29 18:47:35 -07:00
clk-si514.c
clk-si514, clk-si544: Implement prepare/unprepare/is_prepared operations
2018-06-29 10:59:40 -07:00
clk-si544.c
clk-si514, clk-si544: Implement prepare/unprepare/is_prepared operations
2018-06-29 10:59:40 -07:00
clk-si570.c
clk-si5351.c
clk: si5351: _si5351_clkout_reset_pll() can be static
2017-12-28 10:49:48 -08:00
clk-si5351.h
clk-stm32f4.c
clk: stm32: Add clk entry for SDMMC2 on stm32F769
2018-03-19 13:46:07 -07:00
clk-stm32h7.c
treewide: Use struct_size() for kmalloc()-family
2018-06-06 11:15:43 -07:00
clk-stm32mp1.c
clk: stm32mp1: parent clocks update
2019-12-05 09:21:35 +01:00
clk-tango4.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
clk-twl6040.c
clk: clk-twl6040: Fix imprecise external abort for pdmclk
2019-03-23 20:10:03 +01:00
clk-u300.c
clk: clk-u300: Fix a typo in two comment lines
2017-11-13 17:39:43 -08:00
clk-versaclock5.c
clk: vc5: Abort clock configuration without upstream clock
2019-03-05 17:58:46 +01:00
clk-vt8500.c
clk-wm831x.c
clk: make clk_init_data const
2017-11-01 23:25:51 -07:00
clk-xgene.c
clk: clk-xgene: Adjust six checks for null pointers
2017-11-13 17:40:03 -08:00
clk.c
clk: Evict unregistered clks from parent caches
2020-08-26 10:31:07 +02:00
clk.h
clk: Move __clk_{get,put}() into private clk.h API
2018-01-04 15:13:29 -08:00
clkdev.c
ARM: 8778/1: clkdev: don't call __of_clk_get_by_name() unnecessarily from clk_get()
2018-08-13 16:27:52 +01:00
Kconfig
clk: Add driver for MAX9485
2018-07-06 13:44:06 -07:00
Makefile
clk: keystone: Enable TISCI clocks if K3_ARCH
2019-11-24 08:19:48 +01:00