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 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.