public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
From: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
To: ankitprasad.r.sharma@intel.com, intel-gfx@lists.freedesktop.org
Cc: akash.goel@intel.com, shashidhar.hiremath@intel.com
Subject: Re: [PATCH 2/3] igt/gem_pread: Support to verify pread/pwrite for non-shmem backed obj
Date: Fri, 03 Jul 2015 10:37:21 +0100	[thread overview]
Message-ID: <559657D1.4060106@linux.intel.com> (raw)
In-Reply-To: <1435742797-4949-3-git-send-email-ankitprasad.r.sharma@intel.com>



On 07/01/2015 10:26 AM, ankitprasad.r.sharma@intel.com wrote:
> From: Ankitprasad Sharma <ankitprasad.r.sharma@intel.com>
>
> This patch adds support to verify pread/pwrite for non-shmem backed
> objects. It also shows the pread/pwrite speed.
> It also tests speeds for pread with and without user side page faults
>
> v2: Rebased to the latest (Ankit)
>
> Signed-off-by: Ankitprasad Sharma <ankitprasad.r.sharma at intel.com>
> ---
>   tests/gem_pread.c  | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>   tests/gem_pwrite.c |  45 ++++++++++++++++++++++++
>   2 files changed, 145 insertions(+)
>
> diff --git a/tests/gem_pread.c b/tests/gem_pread.c
> index cc83948..95162d5 100644
> --- a/tests/gem_pread.c
> +++ b/tests/gem_pread.c
> @@ -41,6 +41,10 @@
>   #include "drmtest.h"
>
>   #define OBJECT_SIZE 16384
> +#define LARGE_OBJECT_SIZE 1024 * 1024
> +#define KGRN "\x1B[32m"
> +#define KRED "\x1B[31m"
> +#define KNRM "\x1B[0m"
>
>   static void do_gem_read(int fd, uint32_t handle, void *buf, int len, int loops)
>   {
> @@ -76,11 +80,14 @@ static const char *bytes_per_sec(char *buf, double v)
>
>
>   uint32_t *src, dst;
> +uint32_t *dst_user, src_stolen, large_stolen;
> +uint32_t *stolen_pf_user, *stolen_nopf_user;
>   int fd, count;
>
>   int main(int argc, char **argv)
>   {
>   	int object_size = 0;
> +	int large_obj_size = LARGE_OBJECT_SIZE;

Why have both a define and a variable which does not get modified for 
the same thing?

>   	uint32_t buf[20];
>   	const struct {
>   		int level;
> @@ -90,6 +97,9 @@ int main(int argc, char **argv)
>   		{ 1, "snoop" },
>   		{ 2, "display" },
>   		{ -1 },
> +		{ -1, "stolen-uncached"},
> +		{ -1, "stolen-snoop"},
> +		{ -1, "stolen-display"},

Ugh why so hacky? You only used the new three entries for their names, 
right?

What about instead of "igt_subtest((c + 4)->name)" do 
"igt_subtest_f("stolen-%s", c->name)" and then you don't need to add 
these hacky entries?

>   	}, *c;
>
>   	igt_subtest_init(argc, argv);
> @@ -106,6 +116,8 @@ int main(int argc, char **argv)
>
>   		dst = gem_create(fd, object_size);
>   		src = malloc(object_size);
> +		src_stolen = gem_create_stolen(fd, object_size);
> +		dst_user = malloc(object_size);
>   	}
>
>   	igt_subtest("normal") {
> @@ -142,9 +154,97 @@ int main(int argc, char **argv)
>   		}
>   	}
>
> +	igt_subtest("stolen-normal") {
> +		for (count = 1; count <= 1<<17; count <<= 1) {
> +			struct timeval start, end;
> +
> +			gettimeofday(&start, NULL);
> +			do_gem_read(fd, src_stolen, dst_user, object_size, count);
> +			gettimeofday(&end, NULL);
> +			igt_info("Time to pread %d bytes x %6d:	%7.3fµs, %s\n",
> +				 object_size, count,
> +				 elapsed(&start, &end, count),
> +				 bytes_per_sec((char *)buf,
> +				 object_size/elapsed(&start, &end, count)*1e6));

There is no checking that bytes_per_sec won't overflow buf. Which is 
also declared as unit32_t just so we can cast here. :) Suggest fixing if 
you feel like it, won't mandate it since it is existing code.

> +			fflush(stdout);
> +		}
> +	}
> +	for (c = cache; c->level != -1; c++) {
> +		igt_subtest((c + 4)->name) {
> +			gem_set_caching(fd, src_stolen, c->level);
> +
> +			for (count = 1; count <= 1<<17; count <<= 1) {
> +				struct timeval start, end;
> +
> +				gettimeofday(&start, NULL);
> +				do_gem_read(fd, src_stolen, dst_user,
> +					    object_size, count);
> +				gettimeofday(&end, NULL);
> +				igt_info("Time to %s pread %d bytes x %6d:      %7.3fµs, %s\n",
> +					 (c + 4)->name, object_size, count,
> +					 elapsed(&start, &end, count),
> +					 bytes_per_sec((char *)buf,
> +					 object_size/elapsed(&start, &end, count)*1e6));
> +				fflush(stdout);
> +			}
> +		}
> +	}
> +
> +	/* List pread times for stolen area with 1 page fault (page fault only
> +	 * first time) and multiple page faults (unmapping the pages at the
> +	 * end of each iteration)
> +	 */

Can you explain more the idea behind this test? It benchmarks minor 
faulting (well could be major as well but we can't say), but it is 
nothing in the i915 path as far as I know.

> +	igt_subtest("pagefault-pread") {
> +		large_stolen = gem_create_stolen(fd, large_obj_size);
> +		stolen_nopf_user = (uint32_t *) mmap(NULL, large_obj_size,
> +						PROT_WRITE,
> +						MAP_ANONYMOUS|MAP_PRIVATE,
> +						-1, 0);

Some asserts for object creationg and mmap?

> +
> +		for (count = 1; count <= 10; count ++) {
> +			struct timeval start, end;
> +			uint32_t t_elapsed = 0;
> +
> +			gettimeofday(&start, NULL);
> +			do_gem_read(fd, large_stolen, stolen_nopf_user,
> +				    large_obj_size, 1);
> +			gettimeofday(&end, NULL);
> +			t_elapsed = elapsed(&start, &end, 1);
> +			igt_info("Pagefault-N - Time to pread %d bytes: %7.3fµs, %s\n",
> +				 large_obj_size,
> +				 elapsed(&start, &end, 1),
> +				 bytes_per_sec((char *)buf,
> +				 large_obj_size/elapsed(&start, &end, 1)*1e6));
> +
> +			stolen_pf_user = (uint32_t *) mmap(NULL, large_obj_size,
> +						      PROT_WRITE,
> +						      MAP_ANONYMOUS|MAP_PRIVATE,
> +						      -1, 0);
> +
> +			gettimeofday(&start, NULL);
> +			do_gem_read(fd, large_stolen, stolen_pf_user,
> +				    large_obj_size, 1);
> +			gettimeofday(&end, NULL);
> +			igt_info("Pagefault-Y - Time to pread %d bytes: %7.3fµs, %s%s%s\n",
> +				 large_obj_size,
> +				 elapsed(&start, &end, 1),
> +				 t_elapsed < elapsed(&start, &end, 1) ? KGRN : KRED,
> +				 bytes_per_sec((char *)buf,
> +				 large_obj_size/elapsed(&start, &end, 1)*1e6),
> +				 KNRM);
> +			fflush(stdout);
> +			munmap(stolen_pf_user, large_obj_size);
> +		}
> +			munmap(stolen_nopf_user, large_obj_size);
> +			gem_close(fd, large_stolen);

Indentation is broken here.

> +	}
> +
> +
>   	igt_fixture {
>   		free(src);
>   		gem_close(fd, dst);
> +		free(dst_user);
> +		gem_close(fd, src_stolen);
>
>   		close(fd);
>   	}
> diff --git a/tests/gem_pwrite.c b/tests/gem_pwrite.c
> index 5b6a77f..c7e3edf 100644
> --- a/tests/gem_pwrite.c
> +++ b/tests/gem_pwrite.c
> @@ -135,6 +135,7 @@ static void test_big_gtt(int fd, int scale)
>   }
>
>   uint32_t *src, dst;
> +uint32_t *src_user, dst_stolen;
>   int fd;
>
>   int main(int argc, char **argv)
> @@ -150,6 +151,9 @@ int main(int argc, char **argv)
>   		{ 1, "snoop" },
>   		{ 2, "display" },
>   		{ -1 },
> +		{ -1, "stolen-uncached"},
> +		{ -1, "stolen-snoop"},
> +		{ -1, "stolen-display"},

Same comment as for pread.

Hm, should the page faulting benchmark go in gem_pwrite rather than 
gem_pread? Although not sure - is stolen pageable at all?

Regards,

Tvrtko
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2015-07-03  9:37 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-01  9:26 [PATCH v2 0/3] Tests for verifying the old and extended GEM_CREATE ioctl ankitprasad.r.sharma
2015-07-01  9:26 ` [PATCH 1/3] igt/gem_stolen: Verifying extended gem_create ioctl ankitprasad.r.sharma
2015-07-03  9:05   ` Tvrtko Ursulin
2015-07-03  9:16     ` Chris Wilson
2015-07-03  9:38       ` Tvrtko Ursulin
2015-07-01  9:26 ` [PATCH 2/3] igt/gem_pread: Support to verify pread/pwrite for non-shmem backed obj ankitprasad.r.sharma
2015-07-03  9:37   ` Tvrtko Ursulin [this message]
2015-07-06 14:33     ` Dave Gordon
2015-07-21 12:38     ` Ankitprasad Sharma
2015-07-01  9:26 ` [PATCH 3/3] igt/gem_create: Test to validate parameters for GEM_CREATE ioctl ankitprasad.r.sharma
2015-07-03  9:52   ` Tvrtko Ursulin
2015-07-21 13:09     ` Ankitprasad Sharma
  -- strict thread matches above, loose matches on Subject: below --
2015-09-15  8:36 [PATCH v4 0/3] Tests for verifying the old and extended " ankitprasad.r.sharma
2015-09-15  8:36 ` [PATCH 2/3] igt/gem_pread: Support to verify pread/pwrite for non-shmem backed obj ankitprasad.r.sharma
2015-09-15 15:35   ` Tvrtko Ursulin
2015-07-22 13:45 [PATCH v3 0/3] Tests for verifying the old and extended GEM_CREATE ioctl ankitprasad.r.sharma
2015-07-22 13:45 ` [PATCH 2/3] igt/gem_pread: Support to verify pread/pwrite for non-shmem backed obj ankitprasad.r.sharma
2015-07-22 16:14   ` Tvrtko Ursulin
2015-05-13 11:53 [PATCH 0/3] Tests for verifying the old and extended GEM_CREATE ioctl ankitprasad.r.sharma
2015-05-13 11:53 ` [PATCH 2/3] igt/gem_pread: Support to verify pread/pwrite for non-shmem backed obj ankitprasad.r.sharma

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=559657D1.4060106@linux.intel.com \
    --to=tvrtko.ursulin@linux.intel.com \
    --cc=akash.goel@intel.com \
    --cc=ankitprasad.r.sharma@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=shashidhar.hiremath@intel.com \
    /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