[Intel-gfx] [PATCH igt 08/10] igt/pm_rc6_residency: Measure residency after checking for applicability
Ewelina Musial
ewelina.musial at intel.com
Mon Dec 4 10:11:10 UTC 2017
On Mon, Dec 04, 2017 at 09:27:29AM +0000, Chris Wilson wrote:
> CI doesn't run in whole-test mode, but runs each subtest individually.
> Tests that are designed to do a block of work to be shared between many
> subtests end up running that work multiple times (once per subtest) and
> worse, that work is wasted if the subtest will be skipped.
>
> pm_rc6_residency is one such example that measured all the residencies
> up front before skipping, each skip was therefore taking in excess of
> 10s.
Looks good for me.
-Ewelina
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> tests/pm_rc6_residency.c | 68 ++++++++++++++++++++++++++----------------------
> 1 file changed, 37 insertions(+), 31 deletions(-)
>
> diff --git a/tests/pm_rc6_residency.c b/tests/pm_rc6_residency.c
> index ad05cca4..3d46fbd1 100644
> --- a/tests/pm_rc6_residency.c
> +++ b/tests/pm_rc6_residency.c
> @@ -53,11 +53,11 @@ struct residencies {
>
> static unsigned long get_rc6_enabled_mask(void)
> {
> - unsigned long rc6_mask;
> + unsigned long enabled;
>
> - rc6_mask = 0;
> - igt_sysfs_scanf(sysfs, "power/rc6_enable", "%lu", &rc6_mask);
> - return rc6_mask;
> + enabled = 0;
> + igt_sysfs_scanf(sysfs, "power/rc6_enable", "%lu", &enabled);
> + return enabled;
> }
>
> static unsigned long read_rc6_residency(const char *name)
> @@ -85,20 +85,20 @@ static void residency_accuracy(unsigned int diff,
> "Sysfs RC6 residency counter is inaccurate.\n");
> }
>
> -static void read_residencies(int devid, unsigned int rc6_mask,
> +static void read_residencies(int devid, unsigned int mask,
> struct residencies *res)
> {
> - if (rc6_mask & RC6_ENABLED)
> + if (mask & RC6_ENABLED)
> res->rc6 = read_rc6_residency("rc6");
>
> - if ((rc6_mask & RC6_ENABLED) &&
> + if ((mask & RC6_ENABLED) &&
> (IS_VALLEYVIEW(devid) || IS_CHERRYVIEW(devid)))
> res->media_rc6 = read_rc6_residency("media_rc6");
>
> - if (rc6_mask & RC6P_ENABLED)
> + if (mask & RC6P_ENABLED)
> res->rc6p = read_rc6_residency("rc6p");
>
> - if (rc6_mask & RC6PP_ENABLED)
> + if (mask & RC6PP_ENABLED)
> res->rc6pp = read_rc6_residency("rc6pp");
> }
>
> @@ -111,7 +111,7 @@ static unsigned long gettime_ms(void)
> return ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
> }
>
> -static void measure_residencies(int devid, unsigned int rc6_mask,
> +static void measure_residencies(int devid, unsigned int mask,
> struct residencies *res)
> {
> struct residencies start = { };
> @@ -119,15 +119,9 @@ static void measure_residencies(int devid, unsigned int rc6_mask,
> int retry;
> unsigned long t;
>
> - if (!rc6_mask)
> + if (!mask)
> return;
>
> - /*
> - * For some reason my ivb isn't idle even after syncing up with the gpu.
> - * Let's add a sleep just to make it happy.
> - */
> - sleep(8);
> -
> /*
> * Retry in case of counter wrap-around. We simply re-run the
> * measurement, since the valid counter range is different on
> @@ -135,9 +129,9 @@ static void measure_residencies(int devid, unsigned int rc6_mask,
> */
> for (retry = 0; retry < 2; retry++) {
> t = gettime_ms();
> - read_residencies(devid, rc6_mask, &start);
> + read_residencies(devid, mask, &start);
> sleep(SLEEP_DURATION);
> - read_residencies(devid, rc6_mask, &end);
> + read_residencies(devid, mask, &end);
> t = gettime_ms() - t;
>
> if (end.rc6 >= start.rc6 && end.media_rc6 >= start.media_rc6 &&
> @@ -166,9 +160,8 @@ static void measure_residencies(int devid, unsigned int rc6_mask,
>
> igt_main
> {
> - unsigned int rc6_mask;
> - int devid = 0;
> - struct residencies res;
> + unsigned int rc6_enabled = 0;
> + unsigned int devid = 0;
>
> igt_skip_on_simulation();
>
> @@ -181,31 +174,44 @@ igt_main
> sysfs = igt_sysfs_open(fd, NULL);
> close(fd);
>
> - rc6_mask = get_rc6_enabled_mask();
> - igt_require(rc6_mask);
> -
> - measure_residencies(devid, rc6_mask, &res);
> + rc6_enabled = get_rc6_enabled_mask();
> + igt_require(rc6_enabled);
> }
>
> igt_subtest("rc6-accuracy") {
> - igt_skip_on(!(rc6_mask & RC6_ENABLED));
> + struct residencies res;
> +
> + igt_require(rc6_enabled & RC6_ENABLED);
>
> + measure_residencies(devid, RC6_ENABLED, &res);
> residency_accuracy(res.rc6, res.duration, "rc6");
> }
> +
> igt_subtest("media-rc6-accuracy") {
> - igt_skip_on(!((rc6_mask & RC6_ENABLED) &&
> - (IS_VALLEYVIEW(devid) || IS_CHERRYVIEW(devid))));
> + struct residencies res;
>
> + igt_require((rc6_enabled & RC6_ENABLED) &&
> + (IS_VALLEYVIEW(devid) || IS_CHERRYVIEW(devid)));
> +
> + measure_residencies(devid, RC6_ENABLED, &res);
> residency_accuracy(res.media_rc6, res.duration, "media_rc6");
> }
> +
> igt_subtest("rc6p-accuracy") {
> - igt_skip_on(!(rc6_mask & RC6P_ENABLED));
> + struct residencies res;
> +
> + igt_require(rc6_enabled & RC6P_ENABLED);
>
> + measure_residencies(devid, RC6P_ENABLED, &res);
> residency_accuracy(res.rc6p, res.duration, "rc6p");
> }
> +
> igt_subtest("rc6pp-accuracy") {
> - igt_skip_on(!(rc6_mask & RC6PP_ENABLED));
> + struct residencies res;
> +
> + igt_require(rc6_enabled & RC6PP_ENABLED);
>
> + measure_residencies(devid, RC6PP_ENABLED, &res);
> residency_accuracy(res.rc6pp, res.duration, "rc6pp");
> }
> }
> --
> 2.15.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
More information about the Intel-gfx
mailing list