All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 11/22] clk: Skip set_rate_range if our clock is orphan
  2022-04-08  9:10 [PATCH 00/22] clk: More clock rate fixes and tests Maxime Ripard
@ 2022-04-08  9:10 ` Maxime Ripard
  0 siblings, 0 replies; 2+ messages in thread
From: Maxime Ripard @ 2022-04-08  9:10 UTC (permalink / raw)
  To: Mike Turquette, Stephen Boyd, linux-clk
  Cc: Naresh Kamboju, Alexander Stein, Marek Szyprowski, Tony Lindgren,
	Jerome Brunet, Yassine Oudjana, Neil Armstrong, Maxime Ripard

clk_set_rate_range will now force a clk_set_rate() call to
core->req_rate. However, if our clock is orphan, req_rate will be 0 and
we will thus end up calling a set_rate to 0 on potentially all that
clock subtree.

This can be fairly invasive and result in poor decisions. In such a
case, let's just store the new range but bail out and skip the set_rate.

When that clock is no longer orphan though, we should be enforcing the
new range but we don't. Let's add a skipped test to make sure we don't
forget about that corner case.

Signed-off-by: Maxime Ripard <maxime@cerno.tech>
---
 drivers/clk/clk.c      |  6 +++++
 drivers/clk/clk_test.c | 59 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+)

diff --git a/drivers/clk/clk.c b/drivers/clk/clk.c
index 5b6ec11fcfcd..80fbec87309e 100644
--- a/drivers/clk/clk.c
+++ b/drivers/clk/clk.c
@@ -2389,6 +2389,12 @@ static int clk_set_rate_range_nolock(struct clk *clk,
 	if (clk->core->flags & CLK_GET_RATE_NOCACHE)
 		rate = clk_core_get_rate_recalc(clk->core);
 
+	if (clk->core->orphan && !rate) {
+		pr_warn("%s: clk %s: Clock is orphan and doesn't have a rate!\n",
+			__func__, clk->core->name);
+		goto out;
+	}
+
 	/*
 	 * Since the boundaries have been changed, let's give the
 	 * opportunity to the provider to adjust the clock rate based on
diff --git a/drivers/clk/clk_test.c b/drivers/clk/clk_test.c
index fa6e32c460ac..0fffc70f9e2c 100644
--- a/drivers/clk/clk_test.c
+++ b/drivers/clk/clk_test.c
@@ -735,6 +735,26 @@ clk_test_orphan_transparent_multiple_parent_mux_set_parent_set_range_untouched(s
 	clk_put(parent);
 }
 
+/*
+ * Test that, for a mux whose current parent hasn't been registered yet,
+ * calling clk_set_rate_range() will succeed but won't affect its rate.
+ */
+static void
+clk_test_orphan_transparent_multiple_parent_mux_set_range_get_rate(struct kunit *test)
+{
+	struct clk_multiple_parent_ctx *ctx = test->priv;
+	struct clk_hw *hw = &ctx->hw;
+	struct clk *clk = hw->clk;
+	unsigned long rate;
+	int ret;
+
+	ret = clk_set_rate_range(clk, DUMMY_CLOCK_RATE_1, DUMMY_CLOCK_RATE_2);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+
+	rate = clk_get_rate(clk);
+	KUNIT_EXPECT_EQ(test, rate, 0);
+}
+
 /*
  * Test that, for a mux whose current parent hasn't been registered yet,
  * calling clk_set_rate_range() will succeed, and will be taken into
@@ -758,6 +778,43 @@ clk_test_orphan_transparent_multiple_parent_mux_set_range_round_rate(struct kuni
 	KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2);
 }
 
+/*
+ * Test that, for a mux that started orphan, was assigned and rate and
+ * then got switched to a valid parent, its rate is eventually within
+ * range.
+ *
+ * FIXME: Even though we update the rate as part of clk_set_parent(), we
+ * don't evaluate whether that new rate is within range and needs to be
+ * adjusted.
+ */
+static void
+clk_test_orphan_transparent_multiple_parent_mux_set_range_set_parent_get_rate(struct kunit *test)
+{
+	struct clk_multiple_parent_ctx *ctx = test->priv;
+	struct clk_hw *hw = &ctx->hw;
+	struct clk *clk = hw->clk, *parent;
+	unsigned long rate;
+	int ret;
+
+	kunit_skip(test, "This needs to be fixed in the core.");
+
+	parent = clk_hw_get_clk(&ctx->parents_ctx[1].hw, NULL);
+	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent);
+
+	ret = clk_set_rate_range(clk, DUMMY_CLOCK_RATE_1, DUMMY_CLOCK_RATE_2);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+
+	ret = clk_set_parent(clk, parent);
+	KUNIT_ASSERT_EQ(test, ret, 0);
+
+	rate = clk_get_rate(clk);
+	KUNIT_ASSERT_GT(test, rate, 0);
+	KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1);
+	KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2);
+
+	clk_put(parent);
+}
+
 static struct kunit_case clk_orphan_transparent_multiple_parent_mux_test_cases[] = {
 	KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_get_parent),
 	KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_parent),
@@ -766,7 +823,9 @@ static struct kunit_case clk_orphan_transparent_multiple_parent_mux_test_cases[]
 	KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_parent_put),
 	KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_parent_set_range_modified),
 	KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_parent_set_range_untouched),
+	KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_range_get_rate),
 	KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_range_round_rate),
+	KUNIT_CASE(clk_test_orphan_transparent_multiple_parent_mux_set_range_set_parent_get_rate),
 	{}
 };
 
-- 
2.35.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH 11/22] clk: Skip set_rate_range if our clock is orphan
@ 2022-04-09  1:36 kernel test robot
  0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2022-04-09  1:36 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 5086 bytes --]

CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
In-Reply-To: <20220408091037.2041955-12-maxime@cerno.tech>
References: <20220408091037.2041955-12-maxime@cerno.tech>
TO: Maxime Ripard <maxime@cerno.tech>
TO: Mike Turquette <mturquette@baylibre.com>
TO: Stephen Boyd <sboyd@kernel.org>
TO: linux-clk(a)vger.kernel.org
CC: Naresh Kamboju <naresh.kamboju@linaro.org>
CC: Alexander Stein <alexander.stein@ew.tq-group.com>
CC: Marek Szyprowski <m.szyprowski@samsung.com>
CC: Tony Lindgren <tony@atomide.com>
CC: Jerome Brunet <jbrunet@baylibre.com>
CC: Yassine Oudjana <y.oudjana@protonmail.com>
CC: Neil Armstrong <narmstrong@baylibre.com>
CC: Maxime Ripard <maxime@cerno.tech>

Hi Maxime,

I love your patch! Perhaps something to improve:

[auto build test WARNING on clk/clk-next]
[also build test WARNING on linus/master v5.18-rc1 next-20220408]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Maxime-Ripard/clk-More-clock-rate-fixes-and-tests/20220408-171635
base:   https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git clk-next
:::::: branch date: 16 hours ago
:::::: commit date: 16 hours ago
config: riscv-randconfig-m031-20220408 (https://download.01.org/0day-ci/archive/20220409/202204090942.TPcGLjZX-lkp(a)intel.com/config)
compiler: riscv64-linux-gcc (GCC) 11.2.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>

New smatch warnings:
drivers/clk/clk_test.c:801 clk_test_orphan_transparent_multiple_parent_mux_set_range_set_parent_get_rate() warn: ignoring unreachable code.

Old smatch warnings:
drivers/clk/clk_test.c:929 clk_test_single_parent_mux_set_range_disjoint_child_last() warn: ignoring unreachable code.
drivers/clk/clk_test.c:959 clk_test_single_parent_mux_set_range_disjoint_parent_last() warn: ignoring unreachable code.

vim +801 drivers/clk/clk_test.c

d61deb9e36bc91 Maxime Ripard 2022-04-08  780  
2f0b8e802c7321 Maxime Ripard 2022-04-08  781  /*
2f0b8e802c7321 Maxime Ripard 2022-04-08  782   * Test that, for a mux that started orphan, was assigned and rate and
2f0b8e802c7321 Maxime Ripard 2022-04-08  783   * then got switched to a valid parent, its rate is eventually within
2f0b8e802c7321 Maxime Ripard 2022-04-08  784   * range.
2f0b8e802c7321 Maxime Ripard 2022-04-08  785   *
2f0b8e802c7321 Maxime Ripard 2022-04-08  786   * FIXME: Even though we update the rate as part of clk_set_parent(), we
2f0b8e802c7321 Maxime Ripard 2022-04-08  787   * don't evaluate whether that new rate is within range and needs to be
2f0b8e802c7321 Maxime Ripard 2022-04-08  788   * adjusted.
2f0b8e802c7321 Maxime Ripard 2022-04-08  789   */
2f0b8e802c7321 Maxime Ripard 2022-04-08  790  static void
2f0b8e802c7321 Maxime Ripard 2022-04-08  791  clk_test_orphan_transparent_multiple_parent_mux_set_range_set_parent_get_rate(struct kunit *test)
2f0b8e802c7321 Maxime Ripard 2022-04-08  792  {
2f0b8e802c7321 Maxime Ripard 2022-04-08  793  	struct clk_multiple_parent_ctx *ctx = test->priv;
2f0b8e802c7321 Maxime Ripard 2022-04-08  794  	struct clk_hw *hw = &ctx->hw;
2f0b8e802c7321 Maxime Ripard 2022-04-08  795  	struct clk *clk = hw->clk, *parent;
2f0b8e802c7321 Maxime Ripard 2022-04-08  796  	unsigned long rate;
2f0b8e802c7321 Maxime Ripard 2022-04-08  797  	int ret;
2f0b8e802c7321 Maxime Ripard 2022-04-08  798  
2f0b8e802c7321 Maxime Ripard 2022-04-08  799  	kunit_skip(test, "This needs to be fixed in the core.");
2f0b8e802c7321 Maxime Ripard 2022-04-08  800  
2f0b8e802c7321 Maxime Ripard 2022-04-08 @801  	parent = clk_hw_get_clk(&ctx->parents_ctx[1].hw, NULL);
2f0b8e802c7321 Maxime Ripard 2022-04-08  802  	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, parent);
2f0b8e802c7321 Maxime Ripard 2022-04-08  803  
2f0b8e802c7321 Maxime Ripard 2022-04-08  804  	ret = clk_set_rate_range(clk, DUMMY_CLOCK_RATE_1, DUMMY_CLOCK_RATE_2);
2f0b8e802c7321 Maxime Ripard 2022-04-08  805  	KUNIT_ASSERT_EQ(test, ret, 0);
2f0b8e802c7321 Maxime Ripard 2022-04-08  806  
2f0b8e802c7321 Maxime Ripard 2022-04-08  807  	ret = clk_set_parent(clk, parent);
2f0b8e802c7321 Maxime Ripard 2022-04-08  808  	KUNIT_ASSERT_EQ(test, ret, 0);
2f0b8e802c7321 Maxime Ripard 2022-04-08  809  
2f0b8e802c7321 Maxime Ripard 2022-04-08  810  	rate = clk_get_rate(clk);
2f0b8e802c7321 Maxime Ripard 2022-04-08  811  	KUNIT_ASSERT_GT(test, rate, 0);
2f0b8e802c7321 Maxime Ripard 2022-04-08  812  	KUNIT_EXPECT_GE(test, rate, DUMMY_CLOCK_RATE_1);
2f0b8e802c7321 Maxime Ripard 2022-04-08  813  	KUNIT_EXPECT_LE(test, rate, DUMMY_CLOCK_RATE_2);
2f0b8e802c7321 Maxime Ripard 2022-04-08  814  
2f0b8e802c7321 Maxime Ripard 2022-04-08  815  	clk_put(parent);
2f0b8e802c7321 Maxime Ripard 2022-04-08  816  }
2f0b8e802c7321 Maxime Ripard 2022-04-08  817  

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-04-09  1:36 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-04-09  1:36 [PATCH 11/22] clk: Skip set_rate_range if our clock is orphan kernel test robot
  -- strict thread matches above, loose matches on Subject: below --
2022-04-08  9:10 [PATCH 00/22] clk: More clock rate fixes and tests Maxime Ripard
2022-04-08  9:10 ` [PATCH 11/22] clk: Skip set_rate_range if our clock is orphan Maxime Ripard

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.