[igt-dev] [PATCH i-g-t 06/12] i915/gem_mmap_offset: Verify all regions return clear mmaps on cration

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Fri Sep 2 03:42:20 UTC 2022


On Thu, Sep 01, 2022 at 01:44:36PM +0200, Zbigniew Kempczyński wrote:
> From: Chris Wilson <chris.p.wilson at intel.com>
> 
> We do not tolerate leaking stale information in newly created objects, so
> make sure the test covers all memory regions.

Typo in email subject s/cration/creation/.

With this small nit fixed:

Reviewed-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>

--
Zbigniew

> 
> Signed-off-by: Chris Wilson <chris.p.wilson at intel.com>
> ---
>  tests/i915/gem_mmap_offset.c | 87 +++++++++++++++++++++++++-----------
>  1 file changed, 60 insertions(+), 27 deletions(-)
> 
> diff --git a/tests/i915/gem_mmap_offset.c b/tests/i915/gem_mmap_offset.c
> index d1075c32eb..faadbd4ee6 100644
> --- a/tests/i915/gem_mmap_offset.c
> +++ b/tests/i915/gem_mmap_offset.c
> @@ -35,6 +35,7 @@
>  
>  #include "i915/gem.h"
>  #include "i915/gem_create.h"
> +#include "i915/intel_memory_region.h"
>  #include "igt.h"
>  #include "igt_x86.h"
>  
> @@ -75,6 +76,37 @@ __mmap_offset(int i915, uint32_t handle, uint64_t offset, uint64_t size,
>  	return ptr;
>  }
>  
> +static uint32_t batch_create(int i915)
> +{
> +	const uint32_t bbe = MI_BATCH_BUFFER_END;
> +	uint32_t handle = gem_create(i915, sizeof(bbe));
> +
> +	gem_write(i915, handle, 0, &bbe, sizeof(bbe));
> +	return handle;
> +}
> +
> +static void make_resident(int i915, uint32_t batch, uint32_t handle)
> +{
> +	struct drm_i915_gem_exec_object2 obj[2] = {
> +		[0] = {
> +			.handle = handle,
> +			.flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS,
> +		},
> +		[1] = {
> +			.handle = batch ?: batch_create(i915),
> +			.flags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS,
> +		},
> +	};
> +	struct drm_i915_gem_execbuffer2 eb = {
> +		.buffers_ptr = to_user_pointer(obj),
> +		.buffer_count = ARRAY_SIZE(obj),
> +	};
> +
> +	gem_execbuf(i915, &eb);
> +	if (obj[1].handle != batch)
> +		gem_close(i915, obj[1].handle);
> +}
> +
>  static void bad_object(int i915)
>  {
>  	uint32_t real_handle;
> @@ -529,44 +561,35 @@ static uint64_t get_npages(_Atomic(uint64_t) *global, uint64_t npages)
>  
>  struct thread_clear {
>  	_Atomic(uint64_t) max;
> +	struct drm_i915_gem_memory_class_instance region;
>  	int timeout;
>  	int i915;
>  };
>  
> -static int create_ioctl(int i915, struct drm_i915_gem_create *create)
> -{
> -	int err = 0;
> -
> -	if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_CREATE, create)) {
> -		err = -errno;
> -		igt_assume(err != 0);
> -	}
> -
> -	errno = 0;
> -	return err;
> -}
> -
>  static void *thread_clear(void *data)
>  {
>  	struct thread_clear *arg = data;
>  	const struct mmap_offset *t;
> -	unsigned long checked = 0;
> +	unsigned long checked = 0, total = 0;
>  	int i915 = arg->i915;
> +	uint32_t batch = batch_create(i915);
>  
>  	t = mmap_offset_types;
>  	igt_until_timeout(arg->timeout) {
> -		struct drm_i915_gem_create create = {};
> -		uint64_t npages;
> +		uint64_t npages, size;
> +		uint32_t handle;
>  		void *ptr;
>  
>  		npages = random();
>  		npages <<= 32;
>  		npages |= random();
>  		npages = get_npages(&arg->max, npages);
> -		create.size = npages << 12;
> +		size = npages << 12;
>  
> -		create_ioctl(i915, &create);
> -		ptr = __mmap_offset(i915, create.handle, 0, create.size,
> +		igt_assert_eq(__gem_create_in_memory_region_list(i915, &handle, &size, 0, &arg->region, 1), 0);
> +		make_resident(i915, batch, handle);
> +
> +		ptr = __mmap_offset(i915, handle, 0, size,
>  				    PROT_READ | PROT_WRITE,
>  				    t->type);
>  		/* No set-domains as we are being as naughty as possible */
> @@ -584,26 +607,32 @@ static void *thread_clear(void *data)
>  			for (int i = 0; i < ARRAY_SIZE(x); i++)
>  				igt_assert_eq_u64(x[i], 0);
>  		}
> -		if (ptr)
> -			munmap(ptr, create.size);
> -		gem_close(i915, create.handle);
> -		checked += npages;
> +		if (ptr) {
> +			munmap(ptr, size);
> +			checked += npages;
> +		}
> +		gem_close(i915, handle);
>  
> +		total += npages;
>  		atomic_fetch_add(&arg->max, npages);
>  
>  		if (!(++t)->name)
>  			t = mmap_offset_types;
>  	}
>  
> +	gem_close(i915, batch);
> +
> +	igt_info("Checked %'lu / %'lu pages\n", checked, total);
>  	return (void *)(uintptr_t)checked;
>  }
>  
> -static void always_clear(int i915, int timeout)
> +static void always_clear(int i915, const struct gem_memory_region *r, int timeout)
>  {
>  	struct thread_clear arg = {
>  		.i915 = i915,
> +		.region = r->ci,
> +		.max = r->size / 2 >> 12, /* in pages */
>  		.timeout = timeout,
> -		.max = igt_get_avail_ram_mb() << (20 - 12), /* in pages */
>  	};
>  	const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
>  	unsigned long checked;
> @@ -750,8 +779,12 @@ igt_main
>  	igt_subtest_f("open-flood")
>  		open_flood(i915, 20);
>  
> -	igt_subtest_f("clear")
> -		always_clear(i915, 20);
> +	igt_subtest_with_dynamic("clear") {
> +		for_each_memory_region(r, i915) {
> +			igt_dynamic_f("%s", r->name)
> +				always_clear(i915, r, 20);
> +		}
> +	}
>  
>  	igt_subtest_f("blt-coherency")
>  		blt_coherency(i915);
> -- 
> 2.34.1
> 


More information about the igt-dev mailing list