[Intel-gfx] [PATCH i-g-t] pm_rps: Changes in waitboost scenario

Chris Wilson chris at chris-wilson.co.uk
Fri Aug 18 13:38:48 UTC 2017


Quoting Katarzyna Dec (2017-08-18 08:33:11)
> Waitboost and reset test cases were failing because maximum
> frequency is not always boost frequency (sometimes overcloking
> occurs).
> Moreover more time is needed for boost to be finished.
> Changed boost_freq function so boost occurred on the same engine
> as low load.
> Added function waiting for boost to be finished.
> Made test DRM master to make sure that the test isn't ran along Xorg
> 
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Jeff Mcgee <jeff.mcgee at intel.com>
> Cc: Radoslaw Szwichtenberg <radoslaw.szwichtenberg at intel.com>
> 
> Signed-off-by: Katarzyna Dec <katarzyna.dec at intel.com>
> ---
>  tests/pm_rps.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++--------
>  1 file changed, 50 insertions(+), 8 deletions(-)
> 
> diff --git a/tests/pm_rps.c b/tests/pm_rps.c
> index f0455e78..08a73f5d 100644
> --- a/tests/pm_rps.c
> +++ b/tests/pm_rps.c
> @@ -50,6 +50,7 @@ enum {
>         RP0,
>         RP1,
>         RPn,
> +       BOOST,
>         NUMFREQ
>  };
>  
> @@ -60,7 +61,7 @@ struct junk {
>         const char *mode;
>         FILE *filp;
>  } stuff[] = {
> -       { "cur", "r", NULL }, { "min", "rb+", NULL }, { "max", "rb+", NULL }, { "RP0", "r", NULL }, { "RP1", "r", NULL }, { "RPn", "r", NULL }, { NULL, NULL, NULL }
> +       { "cur", "r", NULL }, { "min", "rb+", NULL }, { "max", "rb+", NULL }, { "RP0", "r", NULL }, { "RP1", "r", NULL }, { "RPn", "r", NULL }, { "boost", "rb+", NULL }, { NULL, NULL, NULL }
>  };
>  
>  static int readval(FILE *filp)
> @@ -556,25 +557,61 @@ static void stabilize_check(int *out)
>  static void reset_gpu(void)
>  {
>         int fd = drm_open_driver(DRIVER_INTEL);
> +
>         igt_post_hang_ring(fd, igt_hang_ring(fd, I915_EXEC_DEFAULT));
>         close(fd);
>  }
>  
> +static bool is_in_boost(void)
> +{
> +       char buf[1024];
> +
> +       igt_debugfs_read(drm_fd, "i915_rps_boost_info", buf);
> +       return strstr(buf, "Boosts outstanding? 1");

Might as well make this generic and return the count. Then you can use
it to return -1 if either i915_rps_boost_info doesn't exist (oops, buf
used unterminated!) or doesn't contain the count.

> +}
> +
>  static void boost_freq(int fd, int *boost_freqs)
>  {
>         int64_t timeout = 1;
> -       int ring = -1;
>         igt_spin_t *load;
> +       unsigned int engine;
>  
> -       load = igt_spin_batch_new(fd, ring, 0);
> -
> +       /* put boost on the same engine as low load */
> +       engine = I915_EXEC_RENDER;
> +       if (intel_gen(lh.devid) >= 6)
> +               engine = I915_EXEC_BLT;
> +       load = igt_spin_batch_new(fd, engine, 0);

Something to note is that spin-batch will also force the GPU to maximum.

You could set the boost freq > max freq to differentiate

>         /* Waiting will grant us a boost to maximum */
>         gem_wait(fd, load->handle, &timeout);
>  
>         read_freqs(boost_freqs);
>         dump(boost_freqs);
> +       igt_assert_eq(is_in_boost(), 1);

Will fail on older kernels.

> +       /* Avoid downlocking till boost request is pending */
> +       igt_spin_batch_end(load);
> +       gem_sync(fd, load->handle);
>         igt_spin_batch_free(fd, load);
> +

Misplaced whitespace.

> +}
> +
> +#define BOOST_WAIT_TIMESTEP_MSEC 250
> +#define BOOST_WAIT_TIMEOUT_MSEC 15000
> +static void fall_from_boost_wait(int *freqs)
> +{
> +       int wait = 0;
> +
> +       do {
> +               read_freqs(freqs);
> +               dump(freqs);

Why pass in freqs? After this function you overwrite them, and by its
nature the value of those freqs whilst in this function is either
boosted or some other value.

> +               if (!is_in_boost())
> +                       break;
> +               usleep(1000 * BOOST_WAIT_TIMESTEP_MSEC);
> +               wait += BOOST_WAIT_TIMESTEP_MSEC;
> +
> +       } while (wait < BOOST_WAIT_TIMEOUT_MSEC);
> +
> +       igt_debug("Waited %d till falling from boost\n", wait);

Units! "Waited %dms"

>  }
>  
>  static void waitboost(bool reset)
> @@ -601,6 +638,7 @@ static void waitboost(bool reset)
>          * to maximum.
>          */
>         boost_freq(fd, boost_freqs);
> +       fall_from_boost_wait(post_freqs);

wait_for_fall_from_grace() ?

>  
>         igt_debug("Apply low load again...\n");
>         sleep(1);
> @@ -611,7 +649,7 @@ static void waitboost(bool reset)
>         idle_check();
>  
>         igt_assert_lt(pre_freqs[CUR], pre_freqs[MAX]);
> -       igt_assert_eq(boost_freqs[CUR], boost_freqs[MAX]);
> +       igt_assert_eq(boost_freqs[CUR], boost_freqs[BOOST]);
>         igt_assert_lt(post_freqs[CUR], post_freqs[MAX]);
>  
>         close(fd);
> @@ -640,14 +678,15 @@ igt_main
>                 struct junk *junk = stuff;
>                 int ret;
>  
> -               /* Use drm_open_driver to verify device existence */
> -               drm_fd = drm_open_driver(DRIVER_INTEL);
> +               /* Use drm_open_driver to to force running tests as drm master */
> +               drm_fd = drm_open_driver_master(DRIVER_INTEL);

?? This interface / policy does not require the display.

>                 igt_require_gem(drm_fd);
>                 igt_require(gem_can_store_dword(drm_fd, 0));
>  
>                 do {
>                         int val = -1;
>                         char *path;
> +
>                         ret = asprintf(&path, sysfs_base_path, device, junk->name);
>                         igt_assert(ret != -1);
>                         junk->filp = fopen(path, junk->mode);
> @@ -657,7 +696,7 @@ igt_main
>                         val = readval(junk->filp);
>                         igt_assert(val >= 0);
>                         junk++;
> -               } while(junk->name != NULL);
> +               } while (junk->name != NULL);
>  
>                 read_freqs(origfreqs);
>  
> @@ -684,4 +723,7 @@ igt_main
>         igt_subtest("reset")
>                 waitboost(true);
>  
> +       igt_fixture {
> +               intel_register_access_fini();

??


More information about the Intel-gfx mailing list