[igt-dev] [PATCH i-g-t v3 2/2] igt/evictions: Avoid getting killed by the reaper in mlock

Ewelina Musial ewelina.musial at intel.com
Tue Jun 12 13:29:43 UTC 2018


On Tue, Jun 12, 2018 at 02:41:29PM +0200, Michał Winiarski wrote:
> We're little bit too enthusiastic in our initial attempt to lock all
> available memory. Let's use the mlock probe from lib rather than trying
> to lock everything that sysinfo.freeram has to offer.
> Note that we're only tweaking the initial step - it's still possible
> that we're going to get killed later on.
> 
> v2: Just increment lock instead of modifying addr passed to mlock
> 
> Signed-off-by: Michał Winiarski <michal.winiarski at intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Ewelina Musial <ewelina.musial at intel.com>
> Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>

Reviewed-By: Ewelina Musial <ewelina.musial at intel.com>
- Ewelina
> ---
>  tests/eviction_common.c | 54 ++++++++++++++++-------------------------
>  1 file changed, 21 insertions(+), 33 deletions(-)
> 
> diff --git a/tests/eviction_common.c b/tests/eviction_common.c
> index 300eb03d..8535dfca 100644
> --- a/tests/eviction_common.c
> +++ b/tests/eviction_common.c
> @@ -133,47 +133,33 @@ static void mlocked_evictions(int fd, struct igt_eviction_test_ops *ops,
>  			      uint64_t surface_size,
>  			      uint64_t surface_count)
>  {
> -	unsigned int *can_mlock;
> -	uint64_t sz, pin;
> +	void *mem;
> +	uint64_t sz, pin_total;
>  
>  	intel_require_memory(surface_count, surface_size, CHECK_RAM);
>  
>  	sz = surface_size*surface_count;
> -	pin = intel_get_avail_ram_mb();
> -	pin *= 1024 * 1024;
> -	igt_require(pin > sz);
> -	pin -= sz;
> +	pin_total = intel_get_total_pinnable_mem();
> +	igt_require(pin_total > sz);
>  
> -	igt_debug("Pinning [%'lld, %'lld] MiB\n",
> -		  (long long)pin/(1024*1024),
> -		  (long long)(pin + sz)/(1024*1024));
> -
> -	can_mlock = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
> -	igt_assert(can_mlock != MAP_FAILED);
> +	mem = mmap(NULL, pin_total, PROT_READ, MAP_SHARED | MAP_ANON, -1, 0);
> +	igt_assert(mem != MAP_FAILED);
>  
>  	igt_fork(child, 1) {
> -		void *locked;
> -
> -		locked = malloc(pin + sz);
> -		if (locked != NULL && !mlock(locked, pin + sz))
> -			*can_mlock = 1;
> -	}
> -	igt_waitchildren();
> -	igt_require(*can_mlock);
> -	munmap(can_mlock, 4096);
> -
> -	igt_fork(child, 1) {
> -		void *locked;
>  		uint32_t *bo;
>  		uint64_t n;
>  		int ret;
> +		size_t lock = pin_total - sz;
>  
> -		bo = malloc(surface_count*sizeof(*bo));
> +		bo = malloc(surface_count * sizeof(*bo));
>  		igt_assert(bo);
> +		lock -= ALIGN(surface_count * sizeof(*bo), 4096);
>  
> -		locked = malloc(pin);
> -		if (locked == NULL || mlock(locked, pin))
> -			exit(ENOSPC);
> +		igt_debug("Locking %'"PRIu64" B (%'"PRIu64" MiB)\n",
> +			  lock, lock >> 20);
> +		igt_assert(!mlock(mem, lock));
> +		igt_info("Locked %'"PRIu64" B (%'"PRIu64" MiB)\n",
> +			 lock, lock >> 20);
>  
>  		for (n = 0; n < surface_count; n++)
>  			bo[n] = ops->create(fd, surface_size);
> @@ -188,17 +174,19 @@ static void mlocked_evictions(int fd, struct igt_eviction_test_ops *ops,
>  			 * our pages into memory), start a memory hog to
>  			 * force evictions.
>  			 */
> -
> -			locked = malloc(surface_size);
> -			if (locked == NULL || mlock(locked, surface_size))
> -				free(locked);
> +			lock += surface_size;
> +			igt_assert(!mlock(mem, lock));
> +			igt_debug("Total locked %'"PRIu64" B (%'"PRIu64" MiB)\n",
> +				  lock,
> +				  lock >> 20);
>  		}
>  
>  		for (n = 0; n < surface_count; n++)
>  			ops->close(fd, bo[n]);
>  	}
> -
>  	igt_waitchildren();
> +
> +	munmap(mem, pin_total);
>  }
>  
>  static int swapping_evictions(int fd, struct igt_eviction_test_ops *ops,
> -- 
> 2.17.1
> 


More information about the igt-dev mailing list