[Intel-gfx] [PATCH v2 3/3] tests: rc6 residency test
Daniel Vetter
daniel at ffwll.ch
Mon Mar 26 11:37:13 CEST 2012
On Sun, Mar 25, 2012 at 05:33:32PM -0700, Ben Widawsky wrote:
> This is meant to test the sysfs entry for showing rc6 residency in
> milliseconds. Remember, sysfs is a permanent interface.
>
> v2: use new get_card interface to try "all" devices
> check rc6p and rc6pp in addition to rc6
>
> Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
You're still missing the drm_quiescent_gpu(fd) call before doing the
residency measurements. Which makes this test fail reliably in the i-g-t
testsuite because the gpu is still busy from previous tests. Please run
new tests also in the context of the full testuite to catch such issues.
If this leaking of gpu business annoys you to much, you could create a
drm_close_dev(fd) which calls drm_quiescent_gpu and replace the final
close on the dev with this in all tests.
Also, to keep things in line with other testes, can you name this
sysfs_rc6_residency?
-Daniel
> ---
> lib/drmtest.h | 1 +
> tests/Makefile.am | 1 +
> tests/rc6_residency.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 93 insertions(+)
> create mode 100644 tests/rc6_residency.c
>
> diff --git a/lib/drmtest.h b/lib/drmtest.h
> index 96fbf1a..42f238c 100644
> --- a/lib/drmtest.h
> +++ b/lib/drmtest.h
> @@ -35,6 +35,7 @@
> #include "xf86drm.h"
> #include "intel_batchbuffer.h"
>
> +int drm_get_card(int master);
> int drm_open_any(void);
> int drm_open_any_master(void);
>
> diff --git a/tests/Makefile.am b/tests/Makefile.am
> index 6544ec7..a8eed88 100644
> --- a/tests/Makefile.am
> +++ b/tests/Makefile.am
> @@ -56,6 +56,7 @@ TESTS_progs = \
> drm_vma_limiter_cpu \
> drm_vma_limiter_gtt \
> drm_vma_limiter_cached \
> + rc6_residency \
> $(NULL)
>
> # IMPORTANT: The ZZ_ tests need to be run last!
> diff --git a/tests/rc6_residency.c b/tests/rc6_residency.c
> new file mode 100644
> index 0000000..5c2e442
> --- /dev/null
> +++ b/tests/rc6_residency.c
> @@ -0,0 +1,91 @@
> +/*
> + * Copyright © 2012 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + * Authors:
> + * Ben Widawsky <ben at bwidawsk.net>
> + *
> + */
> +
> +#define _GNU_SOURCE
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <string.h>
> +#include <unistd.h>
> +#include "drmtest.h"
> +
> +static unsigned int readit(const char *path)
> +{
> + unsigned int ret;
> +
> + FILE *file;
> + file = fopen(path, "r");
> + if (file == NULL) {
> + fprintf(stderr, "Couldn't open %s (%d)\n", path, errno);
> + abort();
> + }
> + fscanf(file, "%u", &ret);
> + fclose(file);
> +
> + return ret;
> +}
> +
> +int main(int argc, char *argv[])
> +{
> + const int device = drm_get_card(0);
> + char *path, *pathp, *pathpp;
> + int fd, ret;
> + unsigned int value1, value1p, value1pp, value2, value2p, value2pp;
> + int diff;
> +
> + /* Use drm_open_any to verify device existence */
> + fd = drm_open_any();
> + close(fd);
> +
> + ret = asprintf(&path, "/sys/class/drm/card%d/power/rc6", device);
> + assert(ret != -1);
> + ret = asprintf(&pathp, "/sys/class/drm/card%d/power/rc6p", device);
> + assert(ret != -1);
> + ret = asprintf(&pathpp, "/sys/class/drm/card%d/power/rc6pp", device);
> + assert(ret != -1);
> +
> + value1 = readit(path);
> + value1p = readit(pathp);
> + value1pp = readit(pathpp);
> + // Sleep for 3 seconds and compare
> + sleep(3);
> + value2 = readit(path);
> + value2p = readit(pathp);
> + value2pp = readit(pathpp);
> +
> + diff = (value2pp - value1pp) +
> + (value2p - value1p) +
> + (value2 - value1);
> +
> + /* Plenty of fudge */
> + if (diff > 3900 || diff < 2100) {
> + printf("%d\n", diff);
> + exit(EXIT_FAILURE);
> + }
> +
> + free(path);
> + exit(EXIT_SUCCESS);
> +}
> --
> 1.7.9.4
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Daniel Vetter
Mail: daniel at ffwll.ch
Mobile: +41 (0)79 365 57 48
More information about the Intel-gfx
mailing list