From: Matthias Kaehlcke <mka@chromium.org>
To: Leonard Crestez <leonard.crestez@nxp.com>
Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net>,
"Viresh Kumar" <viresh.kumar@linaro.org>,
"MyungJoo Ham" <myungjoo.ham@samsung.com>,
"Kyungmin Park" <kyungmin.park@samsung.com>,
"Chanwoo Choi" <cw00.choi@samsung.com>,
"Artur Świgoń" <a.swigon@partner.samsung.com>,
"Angus Ainslie" <angus@akkea.ca>,
"Brendan Higgins" <brendanhiggins@google.com>,
linux-kselftest@vger.kernel.org, kunit-dev@googlegroups.com,
linux-pm@vger.kernel.org, linux-imx@nxp.com
Subject: Re: [PATCH v3 1/4] PM / QoS: Initial kunit test
Date: Mon, 25 Nov 2019 12:19:59 -0800 [thread overview]
Message-ID: <20191125201959.GA228856@google.com> (raw)
In-Reply-To: <023ab2f86445e5eb81b39fc471bebe9bc173f993.1574699610.git.leonard.crestez@nxp.com>
On Mon, Nov 25, 2019 at 06:42:16PM +0200, Leonard Crestez wrote:
> The pm_qos family of APIs are used in relatively difficult to reproduce
> scenarios such as thermal throttling so they benefit from unit testing.
indeed, a unit test is useful in this case!
> Start by adding basic tests from the the freq_qos APIs. It includes
> tests for issues that were brought up on mailing lists:
>
> https://patchwork.kernel.org/patch/11252425/#23017005
> https://patchwork.kernel.org/patch/11253421/
>
> Signed-off-by: Leonard Crestez <leonard.crestez@nxp.com>
> ---
> drivers/base/Kconfig | 4 ++
> drivers/base/power/Makefile | 1 +
> drivers/base/power/qos-test.c | 116 ++++++++++++++++++++++++++++++++++
> 3 files changed, 121 insertions(+)
> create mode 100644 drivers/base/power/qos-test.c
>
> diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
> index e37d37684132..d4ae1c1adf69 100644
> --- a/drivers/base/Kconfig
> +++ b/drivers/base/Kconfig
> @@ -155,10 +155,14 @@ config DEBUG_TEST_DRIVER_REMOVE
>
> This option is expected to find errors and may render your system
> unusable. You should say N here unless you are explicitly looking to
> test this functionality.
>
> +config PM_QOS_KUNIT_TEST
> + bool "KUnit Test for PM QoS features"
> + depends on KUNIT
> +
> config HMEM_REPORTING
> bool
> default n
> depends on NUMA
> help
> diff --git a/drivers/base/power/Makefile b/drivers/base/power/Makefile
> index ec5bb190b9d0..8fdd0073eeeb 100644
> --- a/drivers/base/power/Makefile
> +++ b/drivers/base/power/Makefile
> @@ -2,7 +2,8 @@
> obj-$(CONFIG_PM) += sysfs.o generic_ops.o common.o qos.o runtime.o wakeirq.o
> obj-$(CONFIG_PM_SLEEP) += main.o wakeup.o wakeup_stats.o
> obj-$(CONFIG_PM_TRACE_RTC) += trace.o
> obj-$(CONFIG_PM_GENERIC_DOMAINS) += domain.o domain_governor.o
> obj-$(CONFIG_HAVE_CLK) += clock_ops.o
> +obj-$(CONFIG_PM_QOS_KUNIT_TEST) += qos-test.o
>
> ccflags-$(CONFIG_DEBUG_DRIVER) := -DDEBUG
> diff --git a/drivers/base/power/qos-test.c b/drivers/base/power/qos-test.c
> new file mode 100644
> index 000000000000..8267d91332a8
> --- /dev/null
> +++ b/drivers/base/power/qos-test.c
> @@ -0,0 +1,116 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (C) 2019 NXP
> + */
> +#include <kunit/test.h>
> +#include <linux/pm_qos.h>
> +
> +/* Basic test for aggregating two "min" requests */
> +static void freq_qos_test_min(struct kunit *test)
> +{
> + struct freq_constraints qos;
> + struct freq_qos_request req1, req2;
> + int ret;
> +
> + freq_constraints_init(&qos);
> + memset(&req1, 0, sizeof(req1));
> + memset(&req2, 0, sizeof(req2));
> +
> + ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MIN, 1000);
> + KUNIT_EXPECT_EQ(test, ret, 1);
> + ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MIN, 2000);
> + KUNIT_EXPECT_EQ(test, ret, 1);
> +
> + KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 2000);
> +
> + freq_qos_remove_request(&req2);
> + KUNIT_EXPECT_EQ(test, ret, 1);
This checks (again) the return value of the above freq_qos_add_request() call,
which I suppose is not intended. Remove?
> + KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN), 1000);
> +
> + freq_qos_remove_request(&req1);
> + KUNIT_EXPECT_EQ(test, ret, 1);
ditto
> + KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MIN),
> + FREQ_QOS_MIN_DEFAULT_VALUE);
> +}
> +
> +/* Test that requests for MAX_DEFAULT_VALUE have no effect */
> +static void freq_qos_test_maxdef(struct kunit *test)
> +{
> + struct freq_constraints qos;
> + struct freq_qos_request req1, req2;
> + int ret;
> +
> + freq_constraints_init(&qos);
> + memset(&req1, 0, sizeof(req1));
> + memset(&req2, 0, sizeof(req2));
> + KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX),
> + FREQ_QOS_MAX_DEFAULT_VALUE);
> +
> + ret = freq_qos_add_request(&qos, &req1, FREQ_QOS_MAX,
> + FREQ_QOS_MAX_DEFAULT_VALUE);
> + KUNIT_EXPECT_EQ(test, ret, 0);
> + ret = freq_qos_add_request(&qos, &req2, FREQ_QOS_MAX,
> + FREQ_QOS_MAX_DEFAULT_VALUE);
> + KUNIT_EXPECT_EQ(test, ret, 0);
> +
> + /* Add max 1000 */
> + ret = freq_qos_update_request(&req1, 1000);
> + KUNIT_EXPECT_EQ(test, ret, 1);
> + KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
> +
> + /* Add max 2000, no impact */
> + ret = freq_qos_update_request(&req2, 2000);
> + KUNIT_EXPECT_EQ(test, ret, 0);
> + KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 1000);
> +
> + /* Remove max 2000, new max 1000 */
the code doesn't match the comment, max 1000 is removed
> + ret = freq_qos_remove_request(&req1);
> + KUNIT_EXPECT_EQ(test, ret, 1);
> + KUNIT_EXPECT_EQ(test, freq_qos_read_value(&qos, FREQ_QOS_MAX), 2000);
> +}
> +
> +/*
> + * Test that a freq_qos_request can be readded after removal
nit: 're-added'. It took me a few secs to figure this is not a about
'read'ing something
next prev parent reply other threads:[~2019-11-25 20:20 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-25 16:42 [PATCH v3 0/4] PM: QoS: Restore DEV_PM_QOS_MIN/MAX_FREQUENCY Leonard Crestez
2019-11-25 16:42 ` [PATCH v3 1/4] PM / QoS: Initial kunit test Leonard Crestez
2019-11-25 20:19 ` Matthias Kaehlcke [this message]
2019-11-26 12:36 ` Leonard Crestez
2019-11-25 16:42 ` [PATCH v3 2/4] PM / QOS: Redefine FREQ_QOS_MAX_DEFAULT_VALUE to S32_MAX Leonard Crestez
2019-11-25 21:09 ` Matthias Kaehlcke
2019-11-25 16:42 ` [PATCH v3 3/4] PM / QoS: Reorder pm_qos/freq_qos/dev_pm_qos structs Leonard Crestez
2019-11-25 22:22 ` Matthias Kaehlcke
2019-11-25 16:42 ` [PATCH v3 4/4] PM / QoS: Restore DEV_PM_QOS_MIN/MAX_FREQUENCY Leonard Crestez
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20191125201959.GA228856@google.com \
--to=mka@chromium.org \
--cc=a.swigon@partner.samsung.com \
--cc=angus@akkea.ca \
--cc=brendanhiggins@google.com \
--cc=cw00.choi@samsung.com \
--cc=kunit-dev@googlegroups.com \
--cc=kyungmin.park@samsung.com \
--cc=leonard.crestez@nxp.com \
--cc=linux-imx@nxp.com \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=myungjoo.ham@samsung.com \
--cc=rjw@rjwysocki.net \
--cc=viresh.kumar@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).