intel-gfx.lists.freedesktop.org archive mirror
 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
Subject: Re: [PATCH 3/3] igt/gem_stolen: Check for available stolen memory size
Date: Fri, 3 Jun 2016 11:58:53 +0100	[thread overview]
Message-ID: <575162ED.9080707@linux.intel.com> (raw)
In-Reply-To: <1464943891-15470-3-git-send-email-ankitprasad.r.sharma@intel.com>


On 03/06/16 09:51, ankitprasad.r.sharma@intel.com wrote:
> From: Ankitprasad Sharma <ankitprasad.r.sharma@intel.com>
>
> Check for available stolen memory size before attempting to run
> the stolen memory tests. This way we make sure that we do not
> create objects from stolen memory without knowing the available size.
>
> This checks if the kernel supports creation of stolen backed objects
> before doing any operation on stolen backed objects.
>
> Also correcting the CREATE_VERSION ioctl number in getparam ioctl,
> due to kernel changes added in between.
>
> Signed-off-by: Ankitprasad Sharma <ankitprasad.r.sharma@intel.com>
> ---
>   lib/ioctl_wrappers.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
>   lib/ioctl_wrappers.h |  7 +++++--
>   tests/gem_create.c   |  2 +-
>   tests/gem_pread.c    |  3 +++
>   tests/gem_pwrite.c   |  2 ++
>   tests/gem_stolen.c   | 16 ++++++++--------
>   6 files changed, 66 insertions(+), 12 deletions(-)
>
> diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
> index f224091..e6120bb 100644
> --- a/lib/ioctl_wrappers.c
> +++ b/lib/ioctl_wrappers.c
> @@ -455,7 +455,7 @@ bool gem_create__has_stolen_support(int fd)
>
>   	if (has_stolen_support < 0) {
>   		memset(&gp, 0, sizeof(gp));
> -		gp.param = 36; /* CREATE_VERSION */
> +		gp.param = 38; /* CREATE_VERSION */
>   		gp.value = &val;
>
>   		/* Do we have the extended gem_create_ioctl? */
> @@ -1230,6 +1230,52 @@ bool gem_has_bsd2(int fd)
>   		has_bsd2 = has_param(fd, LOCAL_I915_PARAM_HAS_BSD2);
>   	return has_bsd2;
>   }
> +
> +struct local_i915_gem_get_aperture {
> +	__u64 aper_size;
> +	__u64 aper_available_size;
> +	__u64 version;
> +	__u64 map_total_size;
> +	__u64 stolen_total_size;
> +};
> +#define DRM_I915_GEM_GET_APERTURE	0x23
> +#define LOCAL_IOCTL_I915_GEM_GET_APERTURE DRM_IOR  (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct local_i915_gem_get_aperture)
> +/**
> + * gem_total_mappable_size:
> + * @fd: open i915 drm file descriptor
> + *
> + * Feature test macro to query the kernel for the total mappable size.

Minor: it is not a feature test nor a macro.

> + *
> + * Returns: Total mappable address space size.
> + */
> +uint64_t gem_total_mappable_size(int fd)
> +{
> +	struct local_i915_gem_get_aperture aperture;
> +
> +	memset(&aperture, 0, sizeof(aperture));
> +	do_ioctl(fd, LOCAL_IOCTL_I915_GEM_GET_APERTURE, &aperture);
> +
> +	return aperture.map_total_size;
> +}
> +
> +/**
> + * gem_total_stolen_size:
> + * @fd: open i915 drm file descriptor
> + *
> + * Feature test macro to query the kernel for the total stolen size.

Same here.

> + *
> + * Returns: Total stolen memory.
> + */
> +uint64_t gem_total_stolen_size(int fd)
> +{
> +	struct local_i915_gem_get_aperture aperture;
> +
> +	memset(&aperture, 0, sizeof(aperture));
> +	do_ioctl(fd, LOCAL_IOCTL_I915_GEM_GET_APERTURE, &aperture);
> +
> +	return aperture.stolen_total_size;
> +}
> +
>   /**
>    * gem_available_aperture_size:
>    * @fd: open i915 drm file descriptor
> diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h
> index f3bd23f..ae04b35 100644
> --- a/lib/ioctl_wrappers.h
> +++ b/lib/ioctl_wrappers.h
> @@ -93,8 +93,9 @@ void *__gem_mmap__wc(int fd, uint32_t handle, uint64_t offset, uint64_t size, un
>    * Test macro to query whether support for allocating objects from stolen
>    * memory is available. Automatically skips through igt_require() if not.
>    */
> -#define gem_require_stolen_support(fd) \
> -			igt_require(gem_create__has_stolen_support(fd))
> +#define gem_require_stolen_support(fd, size) \
> +			igt_require(gem_create__has_stolen_support(fd) && \
> +				    (gem_total_stolen_size(fd) > size))

Looks like a needless complication to pass in a size, this should only 
be about is it supported or not. How the test uses it is even stranger, 
it is not likely (or even possible) some platform will have a PAGE_SIZE 
of stolen but not OBJECT_SIZE or something. I suggest you just drop the 
size param.

>
>   /**
>    * gem_require_mmap_wc:
> @@ -153,6 +154,8 @@ int gem_gtt_type(int fd);
>   bool gem_uses_ppgtt(int fd);
>   bool gem_uses_full_ppgtt(int fd);
>   int gem_available_fences(int fd);
> +uint64_t gem_total_mappable_size(int fd);
> +uint64_t gem_total_stolen_size(int fd);
>   uint64_t gem_available_aperture_size(int fd);
>   uint64_t gem_aperture_size(int fd);
>   uint64_t gem_global_aperture_size(int fd);
> diff --git a/tests/gem_create.c b/tests/gem_create.c
> index 25f75d4..b251216 100644
> --- a/tests/gem_create.c
> +++ b/tests/gem_create.c
> @@ -78,7 +78,7 @@ static void invalid_flag_test(int fd)
>   {
>   	int ret;
>
> -	gem_require_stolen_support(fd);
> +	gem_require_stolen_support(fd, PAGE_SIZE);
>
>   	create.handle = 0;
>   	create.size = PAGE_SIZE;
> diff --git a/tests/gem_pread.c b/tests/gem_pread.c
> index afa072d..3da8bed 100644
> --- a/tests/gem_pread.c
> +++ b/tests/gem_pread.c
> @@ -152,6 +152,7 @@ int main(int argc, char **argv)
>   	}
>
>   	igt_subtest("stolen-normal") {
> +		gem_require_stolen_support(fd, OBJECT_SIZE);
>   		for (count = 1; count <= 1<<17; count <<= 1) {
>   			struct timeval start, end;
>
> @@ -167,6 +168,7 @@ int main(int argc, char **argv)
>   	}
>   	for (c = cache; c->level != -1; c++) {
>   		igt_subtest_f("stolen-%s", c->name) {
> +			gem_require_stolen_support(fd, OBJECT_SIZE);
>   			gem_set_caching(fd, src_stolen, c->level);
>
>   			for (count = 1; count <= 1<<17; count <<= 1) {
> @@ -190,6 +192,7 @@ int main(int argc, char **argv)
>   	 * user space buffer
>   	 */
>   	igt_subtest("pagefault-pread") {
> +		gem_require_stolen_support(fd, LARGE_OBJECT_SIZE);
>   		large_stolen = gem_create_stolen(fd, LARGE_OBJECT_SIZE);
>   		stolen_nopf_user = (uint32_t *) mmap(NULL, LARGE_OBJECT_SIZE,
>   						PROT_WRITE,
> diff --git a/tests/gem_pwrite.c b/tests/gem_pwrite.c
> index a322f91..de720c5 100644
> --- a/tests/gem_pwrite.c
> +++ b/tests/gem_pwrite.c
> @@ -280,6 +280,7 @@ int main(int argc, char **argv)
>   	}
>
>   	igt_subtest("stolen-normal") {
> +		gem_require_stolen_support(fd, OBJECT_SIZE);
>   		for (count = 1; count <= 1<<17; count <<= 1) {
>   			struct timeval start, end;
>
> @@ -297,6 +298,7 @@ int main(int argc, char **argv)
>
>   	for (c = cache; c->level != -1; c++) {
>   		igt_subtest_f("stolen-%s", c->name) {
> +			gem_require_stolen_support(fd, OBJECT_SIZE);
>   			gem_set_caching(fd, dst, c->level);
>   			for (count = 1; count <= 1<<17; count <<= 1) {
>   				struct timeval start, end;
> diff --git a/tests/gem_stolen.c b/tests/gem_stolen.c
> index 7d329dd..541585b 100644
> --- a/tests/gem_stolen.c
> +++ b/tests/gem_stolen.c
> @@ -105,7 +105,7 @@ static void stolen_pwrite(int fd)
>   	for (i = 0; i < SIZE/DWORD_SIZE; i++)
>   		buf[i] = DATA;
>
> -	gem_require_stolen_support(fd);
> +	gem_require_stolen_support(fd, SIZE);
>
>   	handle = gem_create_stolen(fd, SIZE);
>
> @@ -135,7 +135,7 @@ static void stolen_pread(int fd)
>
>   	CLEAR(buf);
>
> -	gem_require_stolen_support(fd);
> +	gem_require_stolen_support(fd, SIZE);
>
>   	handle = gem_create_stolen(fd, SIZE);
>
> @@ -165,7 +165,7 @@ static void copy_test(int fd)
>   	drm_intel_bo *src, *dest;
>   	uint32_t src_handle = 0, dest_handle = 0;
>
> -	gem_require_stolen_support(fd);
> +	gem_require_stolen_support(fd, SIZE);
>
>   	src_handle = gem_create_stolen(fd, SIZE);
>   	dest_handle = gem_create_stolen(fd, SIZE);
> @@ -191,7 +191,7 @@ static void verify_object_clear(int fd)
>   	uint32_t *virt;
>   	int i, ret;
>
> -	gem_require_stolen_support(fd);
> +	gem_require_stolen_support(fd, SIZE);
>
>   	handle = gem_create_stolen(fd, SIZE);
>
> @@ -215,7 +215,7 @@ static void stolen_large_obj_alloc(int fd)
>   {
>   	uint32_t handle = 0;
>
> -	gem_require_stolen_support(fd);
> +	gem_require_stolen_support(fd, SIZE);
>   	handle = __gem_create_stolen(fd, (unsigned long long) LARGE_SIZE + 4096);
>   	igt_assert(!handle);
>   }
> @@ -230,7 +230,7 @@ static void stolen_fill_purge_test(int fd)
>   	uint32_t *virt;
>   	int retained;
>
> -	gem_require_stolen_support(fd);
> +	gem_require_stolen_support(fd, SIZE);
>
>   	/* Exhaust Stolen space */
>   	do {
> @@ -299,7 +299,7 @@ static void stolen_hibernate(int fd)
>   	uint32_t handle[MAX_OBJECTS], src_handle;
>   	uint32_t *virt;
>
> -	gem_require_stolen_support(fd);
> +	gem_require_stolen_support(fd, SIZE);
>
>   	src_handle = gem_create(fd, SIZE);
>   	src = gem_handle_to_libdrm_bo(bufmgr, fd,
> @@ -388,7 +388,7 @@ stolen_no_mmap(int fd)
>   	void *addr;
>   	uint32_t handle = 0;
>
> -	gem_require_stolen_support(fd);
> +	gem_require_stolen_support(fd, SIZE);
>
>   	handle = gem_create_stolen(fd, SIZE);
>
>

Regards,

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

  reply	other threads:[~2016-06-03 10:58 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-03  8:51 [PATCH 1/3] igt/gem_stolen: Verify contents of stolen-backed objects across hibernation ankitprasad.r.sharma
2016-06-03  8:51 ` [PATCH 2/3] igt/gem_stolen: Fix for no_mmap subtest ankitprasad.r.sharma
2016-06-03 10:53   ` Tvrtko Ursulin
2016-06-03  8:51 ` [PATCH 3/3] igt/gem_stolen: Check for available stolen memory size ankitprasad.r.sharma
2016-06-03 10:58   ` Tvrtko Ursulin [this message]
2016-06-06  9:25     ` Ankitprasad Sharma
2016-06-03 10:52 ` [PATCH 1/3] igt/gem_stolen: Verify contents of stolen-backed objects across hibernation Tvrtko Ursulin
2016-06-03 11:32 ` ✗ Ro.CI.BAT: failure for series starting with [1/3] " Patchwork
2016-06-03 11:39 ` Patchwork

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=575162ED.9080707@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 \
    /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;
as well as URLs for NNTP newsgroup(s).