[Intel-gfx] [PATCH 2/3] tests/gem_close_race: Adapt the test for Full PPGTT

oscar.mateo at intel.com oscar.mateo at intel.com
Tue Dec 10 10:36:22 CET 2013


From: Oscar Mateo <oscar.mateo at intel.com>

With Full PPGTT, each new fd creates a new context and thus a new
PPGTT, so we have to reduce the number of simultaneous fds or face
OOM problems. For every new PPGTT, its PDEs are stored in the GGTT
which imposes a limit of 1024 new contexts. We want to leave at
least 1/4 of the GGTT available for "important" stuff like scanout
buffers, so never open more than 768 fds.

Signed-off-by: Oscar Mateo <oscar.mateo at intel.com>
---
 tests/gem_close_race.c |   39 ++++++++++++++++++++++++++-------------
 1 file changed, 26 insertions(+), 13 deletions(-)

diff --git a/tests/gem_close_race.c b/tests/gem_close_race.c
index 6064c02..f658c90 100644
--- a/tests/gem_close_race.c
+++ b/tests/gem_close_race.c
@@ -49,6 +49,8 @@
 
 static char device[80];
 static uint32_t devid;
+static unsigned int num_childs = 2000;
+static unsigned int num_fds = 32000;
 
 static void selfcopy(int fd, uint32_t handle, int loops)
 {
@@ -136,11 +138,10 @@ static void run(int child)
 		gem_read(fd, handle, 0, &handle, sizeof(handle));
 }
 
-#define NUM_FD 32000
-
 struct thread {
 	pthread_mutex_t mutex;
-	int fds[NUM_FD];
+	unsigned int num_fds;
+	int *fds;
 	int done;
 };
 
@@ -152,7 +153,7 @@ static void *thread_run(void *_data)
 	while (!t->done) {
 		pthread_mutex_unlock(&t->mutex);
 
-		for (int n = 0; n < NUM_FD; n++) {
+		for (int n = 0; n < t->num_fds; n++) {
 			struct drm_i915_gem_create create;
 
 			create.handle = 0;
@@ -185,7 +186,7 @@ static void *thread_busy(void *_data)
 
 		pthread_mutex_unlock(&t->mutex);
 
-		n  = rand() % NUM_FD;
+		n  = rand() % t->num_fds;
 
 		create.handle = 0;
 		create.size = OBJECT_SIZE;
@@ -213,16 +214,23 @@ igt_main
 {
 	igt_skip_on_simulation();
 
-	sprintf(device, "/dev/dri/card%d", drm_get_card());
-	{
-		int fd = open(device, O_RDWR);
+	igt_fixture {
+		int fd;
+		sprintf(device, "/dev/dri/card%d", drm_get_card());
+		fd = open(device, O_RDWR);
 		igt_assert(fd != -1);
 		devid = intel_get_drm_devid(fd);
+		if (gem_uses_full_ppgtt(fd))
+		{
+			/* Reduce the number of simultaneous fds or face OOM */
+			num_childs = 768;
+			num_fds = 768;
+		}
 		close(fd);
 	}
 
 	igt_subtest("process-exit") {
-		igt_fork(child, 2000)
+		igt_fork(child, num_childs)
 			run(child);
 		igt_waitchildren();
 	}
@@ -232,17 +240,21 @@ igt_main
 		struct thread *data = calloc(1, sizeof(struct thread));
 		int n;
 
+		data->num_fds = num_fds;
+		data->fds = calloc(num_fds, sizeof(int));
+
 		igt_assert(data);
+		igt_assert(data->fds);
 
 		pthread_mutex_init(&data->mutex, NULL);
-		for (n = 0; n < NUM_FD; n++)
+		for (n = 0; n < num_fds; n++)
 			data->fds[n] = open(device, O_RDWR);
 
 		pthread_create(&thread[0], NULL, thread_run, data);
 		pthread_create(&thread[1], NULL, thread_busy, data);
 
-		for (n = 0; n < 1000*NUM_FD; n++) {
-			int i = rand() % NUM_FD;
+		for (n = 0; n < 1000*num_fds; n++) {
+			int i = rand() % num_fds;
 			if (data->fds[i] == -1) {
 				data->fds[i] = open(device, O_RDWR);
 			} else{
@@ -258,8 +270,9 @@ igt_main
 		pthread_join(thread[1], NULL);
 		pthread_join(thread[0], NULL);
 
-		for (n = 0; n < NUM_FD; n++)
+		for (n = 0; n < num_fds; n++)
 			close(data->fds[n]);
+		free(data->fds);
 		free(data);
 	}
 }
-- 
1.7.9.5




More information about the Intel-gfx mailing list