[Intel-gfx] [RFC] tests/gem_ring_sync_copy: reduce memory usage

Damien Lespiau damien.lespiau at intel.com
Fri Nov 28 16:39:29 CET 2014


On Fri, Nov 28, 2014 at 02:46:24PM +0000, tim.gore at intel.com wrote:
> From: Tim Gore <tim.gore at intel.com>
> 
> gem_ring_sync_copy uses a lot of memory and gets OOM
> killed on smaller systems (eg android devices).
> Most of the allocation is for "busy work" to keep the
> render rings busy and for this we can just re-use the
> same few buffers over and over. This enables the test
> to be run on low end devices.
> 
> Signed-off-by: Tim Gore <tim.gore at intel.com>

The one thing I'm wondering is how we can ensure that 32 is indeed
enough to create a dependency between the two rings.

I'm not sure why you've chosen to remove n_buffers_load (without
actually removing it from the test data. How about:

diff --git a/tests/gem_ring_sync_copy.c b/tests/gem_ring_sync_copy.c
index 4a732d2..2561bac 100644
--- a/tests/gem_ring_sync_copy.c
+++ b/tests/gem_ring_sync_copy.c
@@ -331,7 +331,7 @@ igt_main
                data.drm_fd = drm_open_any_render();
                data.devid = intel_get_drm_devid(data.drm_fd);
 
-               data.n_buffers_load = 1000;
+               data.n_buffers_load = 32;
 
                data.bufmgr = drm_intel_bufmgr_gem_init(data.drm_fd, 4096);
                igt_assert(data.bufmgr);

-- 
Damien

> ---
>  tests/gem_ring_sync_copy.c | 25 +++++++++++++++----------
>  1 file changed, 15 insertions(+), 10 deletions(-)
> 
> diff --git a/tests/gem_ring_sync_copy.c b/tests/gem_ring_sync_copy.c
> index 4a732d2..7257188 100644
> --- a/tests/gem_ring_sync_copy.c
> +++ b/tests/gem_ring_sync_copy.c
> @@ -57,6 +57,7 @@
>  
>  #define WIDTH	512
>  #define HEIGHT	512
> +#define NUM_BUSY_BUFFERS 32
>  
>  typedef struct {
>  	int drm_fd;
> @@ -163,11 +164,13 @@ static void render_busy(data_t *data)
>  	size_t array_size;
>  	int i;
>  
> -	array_size = data->n_buffers_load * sizeof(struct igt_buf);
> +	/* allocate 32 buffer objects and re-use them as needed */
> +	array_size = NUM_BUSY_BUFFERS * sizeof(struct igt_buf);
> +
>  	data->render.srcs = malloc(array_size);
>  	data->render.dsts = malloc(array_size);
>  
> -	for (i = 0; i < data->n_buffers_load; i++) {
> +	for (i = 0; i < NUM_BUSY_BUFFERS; i++) {
>  		scratch_buf_init(data, &data->render.srcs[i], WIDTH, HEIGHT,
>  				 0xdeadbeef);
>  		scratch_buf_init(data, &data->render.dsts[i], WIDTH, HEIGHT,
> @@ -177,10 +180,10 @@ static void render_busy(data_t *data)
>  	for (i = 0; i < data->n_buffers_load; i++) {
>  		data->render.copy(data->batch,
>  				  NULL,			/* context */
> -				  &data->render.srcs[i],
> +				  &data->render.srcs[i % NUM_BUSY_BUFFERS],
>  				  0, 0,			/* src_x, src_y */
>  				  WIDTH, HEIGHT,
> -				  &data->render.dsts[i],
> +				  &data->render.dsts[i % NUM_BUSY_BUFFERS],
>  				  0, 0			/* dst_x, dst_y */);
>  	}
>  }
> @@ -189,7 +192,7 @@ static void render_busy_fini(data_t *data)
>  {
>  	int i;
>  
> -	for (i = 0; i < data->n_buffers_load; i++) {
> +	for (i = 0; i < NUM_BUSY_BUFFERS; i++) {
>  		drm_intel_bo_unreference(data->render.srcs[i].bo);
>  		drm_intel_bo_unreference(data->render.dsts[i].bo);
>  	}
> @@ -225,11 +228,13 @@ static void blitter_busy(data_t *data)
>  	size_t array_size;
>  	int i;
>  
> -	array_size = data->n_buffers_load * sizeof(drm_intel_bo *);
> +	/* allocate 32 buffer objects and re-use them as needed */
> +	array_size = NUM_BUSY_BUFFERS * sizeof(drm_intel_bo *);
> +
>  	data->blitter.srcs = malloc(array_size);
>  	data->blitter.dsts = malloc(array_size);
>  
> -	for (i = 0; i < data->n_buffers_load; i++) {
> +	for (i = 0; i < NUM_BUSY_BUFFERS; i++) {
>  		data->blitter.srcs[i] = bo_create(data,
>  						  WIDTH, HEIGHT,
>  						  0xdeadbeef);
> @@ -240,8 +245,8 @@ static void blitter_busy(data_t *data)
>  
>  	for (i = 0; i < data->n_buffers_load; i++) {
>  		intel_copy_bo(data->batch,
> -			      data->blitter.srcs[i],
> -			      data->blitter.dsts[i],
> +			      data->blitter.srcs[i % NUM_BUSY_BUFFERS],
> +			      data->blitter.dsts[i % NUM_BUSY_BUFFERS],
>  			      WIDTH*HEIGHT*4);
>  	}
>  }
> @@ -250,7 +255,7 @@ static void blitter_busy_fini(data_t *data)
>  {
>  	int i;
>  
> -	for (i = 0; i < data->n_buffers_load; i++) {
> +	for (i = 0; i < NUM_BUSY_BUFFERS; i++) {
>  		drm_intel_bo_unreference(data->blitter.srcs[i]);
>  		drm_intel_bo_unreference(data->blitter.dsts[i]);
>  	}
> -- 
> 2.1.3
> 



More information about the Intel-gfx mailing list