With intel_measure_ring_size and igt_cork added as common utilities we
can use them instead of the local copy of those utilities

Signed-off-by: Daniele Ceraolo Spurio <[email protected]>
Cc: Chris Wilson <[email protected]>
---
 tests/gem_exec_schedule.c | 159 ++++++++++------------------------------------
 1 file changed, 35 insertions(+), 124 deletions(-)

diff --git a/tests/gem_exec_schedule.c b/tests/gem_exec_schedule.c
index ad3688c..0e022cb 100644
--- a/tests/gem_exec_schedule.c
+++ b/tests/gem_exec_schedule.c
@@ -129,35 +129,6 @@ static void store_dword(int fd, uint32_t ctx, unsigned 
ring,
        gem_close(fd, obj[2].handle);
 }
 
-struct cork {
-       int device;
-       uint32_t handle;
-       uint32_t fence;
-};
-
-static void plug(int fd, struct cork *c)
-{
-       struct vgem_bo bo;
-       int dmabuf;
-
-       c->device = drm_open_driver(DRIVER_VGEM);
-
-       bo.width = bo.height = 1;
-       bo.bpp = 4;
-       vgem_create(c->device, &bo);
-       c->fence = vgem_fence_attach(c->device, &bo, VGEM_FENCE_WRITE);
-
-       dmabuf = prime_handle_to_fd(c->device, bo.handle);
-       c->handle = prime_fd_to_handle(fd, dmabuf);
-       close(dmabuf);
-}
-
-static void unplug(struct cork *c)
-{
-       vgem_fence_signal(c->device, c->fence);
-       close(c->device);
-}
-
 static uint32_t create_highest_priority(int fd)
 {
        uint32_t ctx = gem_context_create(fd);
@@ -172,7 +143,7 @@ static uint32_t create_highest_priority(int fd)
        return ctx;
 }
 
-static void unplug_show_queue(int fd, struct cork *c, unsigned int engine)
+static void unplug_show_queue(int fd, igt_cork_t *c, unsigned int engine)
 {
        igt_spin_t *spin[BUSY_QLEN];
 
@@ -182,7 +153,7 @@ static void unplug_show_queue(int fd, struct cork *c, 
unsigned int engine)
                gem_context_destroy(fd, ctx);
        }
 
-       unplug(c); /* batches will now be queued on the engine */
+       igt_cork_free(fd, c); /* batches will now be queued on the engine */
        igt_debugfs_dump(fd, "i915_engine_info");
 
        for (int n = 0; n < ARRAY_SIZE(spin); n++)
@@ -192,19 +163,19 @@ static void unplug_show_queue(int fd, struct cork *c, 
unsigned int engine)
 
 static void fifo(int fd, unsigned ring)
 {
-       struct cork cork;
+       igt_cork_t *cork;
        uint32_t scratch;
        uint32_t *ptr;
 
        scratch = gem_create(fd, 4096);
 
-       plug(fd, &cork);
+       cork = igt_cork_new(fd);
 
        /* Same priority, same timeline, final result will be the second eb */
-       store_dword(fd, 0, ring, scratch, 0, 1, cork.handle, 0);
-       store_dword(fd, 0, ring, scratch, 0, 2, cork.handle, 0);
+       store_dword(fd, 0, ring, scratch, 0, 1, cork->handle, 0);
+       store_dword(fd, 0, ring, scratch, 0, 2, cork->handle, 0);
 
-       unplug_show_queue(fd, &cork, ring);
+       unplug_show_queue(fd, cork, ring);
 
        ptr = gem_mmap__gtt(fd, scratch, 4096, PROT_READ);
        gem_set_domain(fd, scratch, /* no write hazard lies! */
@@ -292,7 +263,7 @@ static void smoketest(int fd, unsigned ring, unsigned 
timeout)
 static void reorder(int fd, unsigned ring, unsigned flags)
 #define EQUAL 1
 {
-       struct cork cork;
+       igt_cork_t *cork;
        uint32_t scratch;
        uint32_t *ptr;
        uint32_t ctx[2];
@@ -304,15 +275,15 @@ static void reorder(int fd, unsigned ring, unsigned flags)
        ctx_set_priority(fd, ctx[HI], flags & EQUAL ? MIN_PRIO : 0);
 
        scratch = gem_create(fd, 4096);
-       plug(fd, &cork);
+       cork = igt_cork_new(fd);
 
        /* We expect the high priority context to be executed first, and
         * so the final result will be value from the low priority context.
         */
-       store_dword(fd, ctx[LO], ring, scratch, 0, ctx[LO], cork.handle, 0);
-       store_dword(fd, ctx[HI], ring, scratch, 0, ctx[HI], cork.handle, 0);
+       store_dword(fd, ctx[LO], ring, scratch, 0, ctx[LO], cork->handle, 0);
+       store_dword(fd, ctx[HI], ring, scratch, 0, ctx[HI], cork->handle, 0);
 
-       unplug_show_queue(fd, &cork, ring);
+       unplug_show_queue(fd, cork, ring);
 
        gem_context_destroy(fd, ctx[LO]);
        gem_context_destroy(fd, ctx[HI]);
@@ -331,7 +302,7 @@ static void reorder(int fd, unsigned ring, unsigned flags)
 
 static void promotion(int fd, unsigned ring)
 {
-       struct cork cork;
+       igt_cork_t *cork;
        uint32_t result, dep;
        uint32_t *ptr;
        uint32_t ctx[3];
@@ -348,15 +319,15 @@ static void promotion(int fd, unsigned ring)
        result = gem_create(fd, 4096);
        dep = gem_create(fd, 4096);
 
-       plug(fd, &cork);
+       cork = igt_cork_new(fd);
 
        /* Expect that HI promotes LO, so the order will be LO, HI, NOISE.
         *
         * fifo would be NOISE, LO, HI.
         * strict priority would be  HI, NOISE, LO
         */
-       store_dword(fd, ctx[NOISE], ring, result, 0, ctx[NOISE], cork.handle, 
0);
-       store_dword(fd, ctx[LO], ring, result, 0, ctx[LO], cork.handle, 0);
+       store_dword(fd, ctx[NOISE], ring, result, 0, ctx[NOISE], cork->handle, 
0);
+       store_dword(fd, ctx[LO], ring, result, 0, ctx[LO], cork->handle, 0);
 
        /* link LO <-> HI via a dependency on another buffer */
        store_dword(fd, ctx[LO], ring, dep, 0, ctx[LO], 0, 
I915_GEM_DOMAIN_INSTRUCTION);
@@ -364,7 +335,7 @@ static void promotion(int fd, unsigned ring)
 
        store_dword(fd, ctx[HI], ring, result, 0, ctx[HI], 0, 0);
 
-       unplug_show_queue(fd, &cork, ring);
+       unplug_show_queue(fd, cork, ring);
 
        gem_context_destroy(fd, ctx[NOISE]);
        gem_context_destroy(fd, ctx[LO]);
@@ -544,7 +515,7 @@ static void deep(int fd, unsigned ring)
        const unsigned int nctx = MAX_PRIO - MIN_PRIO;
        const unsigned size = ALIGN(4*nctx, 4096);
        struct timespec tv = {};
-       struct cork cork;
+       igt_cork_t *cork;
        uint32_t result, dep[XS];
        uint32_t expected = 0;
        uint32_t *ptr;
@@ -585,12 +556,12 @@ static void deep(int fd, unsigned ring)
                gem_sync(fd, result);
        }
 
-       plug(fd, &cork);
+       cork = igt_cork_new(fd);
 
        /* Create a deep dependency chain, with a few branches */
        for (int n = 0; n < nctx && igt_seconds_elapsed(&tv) < 8; n++)
                for (int m = 0; m < XS; m++)
-                       store_dword(fd, ctx[n], ring, dep[m], 4*n, ctx[n], 
cork.handle, I915_GEM_DOMAIN_INSTRUCTION);
+                       store_dword(fd, ctx[n], ring, dep[m], 4*n, ctx[n], 
cork->handle, I915_GEM_DOMAIN_INSTRUCTION);
 
        for (int n = 0; n < nctx && igt_seconds_elapsed(&tv) < 6; n++) {
                for (int m = 0; m < XS; m++) {
@@ -600,7 +571,7 @@ static void deep(int fd, unsigned ring)
                expected = ctx[n];
        }
 
-       unplug_show_queue(fd, &cork, ring);
+       unplug_show_queue(fd, cork, ring);
        igt_require(expected); /* too slow */
 
        for (int n = 0; n < nctx; n++)
@@ -643,72 +614,13 @@ static int __execbuf(int fd, struct 
drm_i915_gem_execbuffer2 *execbuf)
        return err;
 }
 
-static unsigned int measure_ring_size(int fd, unsigned int ring)
-{
-       struct sigaction sa = { .sa_handler = alarm_handler };
-       struct drm_i915_gem_exec_object2 obj[2];
-       struct drm_i915_gem_execbuffer2 execbuf;
-       const uint32_t bbe = MI_BATCH_BUFFER_END;
-       unsigned int count, last;
-       struct itimerval itv;
-       struct cork c;
-
-       memset(obj, 0, sizeof(obj));
-       obj[1].handle = gem_create(fd, 4096);
-       gem_write(fd, obj[1].handle, 0, &bbe, sizeof(bbe));
-
-       memset(&execbuf, 0, sizeof(execbuf));
-       execbuf.buffers_ptr = to_user_pointer(obj + 1);
-       execbuf.buffer_count = 1;
-       execbuf.flags = ring;
-       gem_execbuf(fd, &execbuf);
-       gem_sync(fd, obj[1].handle);
-
-       plug(fd, &c);
-       obj[0].handle = c.handle;
-
-       execbuf.buffers_ptr = to_user_pointer(obj);
-       execbuf.buffer_count = 2;
-       execbuf.rsvd1 = gem_context_create(fd);
-
-       sigaction(SIGALRM, &sa, NULL);
-       itv.it_interval.tv_sec = 0;
-       itv.it_interval.tv_usec = 100;
-       itv.it_value.tv_sec = 0;
-       itv.it_value.tv_usec = 1000;
-       setitimer(ITIMER_REAL, &itv, NULL);
-
-       last = -1;
-       count = 0;
-       do {
-               if (__execbuf(fd, &execbuf) == 0) {
-                       count++;
-                       continue;
-               }
-
-               if (last == count)
-                       break;
-
-               last = count;
-       } while (1);
-
-       memset(&itv, 0, sizeof(itv));
-       setitimer(ITIMER_REAL, &itv, NULL);
-
-       unplug(&c);
-       gem_close(fd, obj[1].handle);
-       gem_context_destroy(fd, execbuf.rsvd1);
-
-       return count;
-}
-
 static void wide(int fd, unsigned ring)
 {
 #define NCTX 4096
        struct timespec tv = {};
-       unsigned int ring_size = measure_ring_size(fd, ring);
+       unsigned int ring_size = intel_measure_ring_size(fd, ring, true);
 
-       struct cork cork;
+       igt_cork_t *cork;
        uint32_t result;
        uint32_t *ptr;
        uint32_t *ctx;
@@ -720,20 +632,20 @@ static void wide(int fd, unsigned ring)
 
        result = gem_create(fd, 4*NCTX);
 
-       plug(fd, &cork);
+       cork = igt_cork_new(fd);
 
        /* Lots of in-order requests, plugged and submitted simultaneously */
        for (count = 0;
             igt_seconds_elapsed(&tv) < 5 && count < ring_size;
             count++) {
                for (int n = 0; n < NCTX; n++) {
-                       store_dword(fd, ctx[n], ring, result, 4*n, ctx[n], 
cork.handle, I915_GEM_DOMAIN_INSTRUCTION);
+                       store_dword(fd, ctx[n], ring, result, 4*n, ctx[n], 
cork->handle, I915_GEM_DOMAIN_INSTRUCTION);
                }
        }
        igt_info("Submitted %d requests over %d contexts in %.1fms\n",
                 count, NCTX, igt_nsec_elapsed(&tv) * 1e-6);
 
-       unplug_show_queue(fd, &cork, ring);
+       unplug_show_queue(fd, cork, ring);
 
        for (int n = 0; n < NCTX; n++)
                gem_context_destroy(fd, ctx[n]);
@@ -757,21 +669,21 @@ static void reorder_wide(int fd, unsigned ring)
        struct drm_i915_gem_exec_object2 obj[3];
        struct drm_i915_gem_execbuffer2 execbuf;
        struct timespec tv = {};
-       unsigned int ring_size = measure_ring_size(fd, ring);
-       struct cork cork;
+       unsigned int ring_size = intel_measure_ring_size(fd, ring, true);
+       igt_cork_t *cork;
        uint32_t result, target;
        uint32_t *found, *expected;
 
        result = gem_create(fd, 4096);
        target = gem_create(fd, 4096);
 
-       plug(fd, &cork);
+       cork = igt_cork_new(fd);
 
        expected = gem_mmap__cpu(fd, target, 0, 4096, PROT_WRITE);
        gem_set_domain(fd, target, I915_GEM_DOMAIN_CPU, I915_GEM_DOMAIN_CPU);
 
        memset(obj, 0, sizeof(obj));
-       obj[0].handle = cork.handle;
+       obj[0].handle = cork->handle;
        obj[1].handle = result;
        obj[2].relocs_ptr = to_user_pointer(&reloc);
        obj[2].relocation_count = 1;
@@ -838,7 +750,7 @@ static void reorder_wide(int fd, unsigned ring)
                gem_context_destroy(fd, execbuf.rsvd1);
        }
 
-       unplug_show_queue(fd, &cork, ring);
+       unplug_show_queue(fd, cork, ring);
 
        found = gem_mmap__gtt(fd, result, 4096, PROT_READ);
        gem_set_domain(fd, result, /* no write hazard lies! */
@@ -873,7 +785,7 @@ static void test_pi_ringfull(int fd, unsigned int engine)
        struct drm_i915_gem_exec_object2 obj[2];
        unsigned int last, count;
        struct itimerval itv;
-       struct cork c;
+       igt_cork_t *c;
        bool *result;
 
        result = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
@@ -895,8 +807,8 @@ static void test_pi_ringfull(int fd, unsigned int engine)
        gem_sync(fd, obj[1].handle);
 
        /* Fill the low-priority ring */
-       plug(fd, &c);
-       obj[0].handle = c.handle;
+       c = igt_cork_new(fd);
+       obj[0].handle = c->handle;
 
        execbuf.buffers_ptr = to_user_pointer(obj);
        execbuf.buffer_count = 2;
@@ -970,12 +882,11 @@ static void test_pi_ringfull(int fd, unsigned int engine)
        igt_assert_f(result[2],
                     "High priority child unable to submit within 10ms\n");
 
-       unplug(&c);
+       igt_cork_free(fd, c);
        igt_waitchildren();
 
        gem_context_destroy(fd, execbuf.rsvd1);
        gem_close(fd, obj[1].handle);
-       gem_close(fd, obj[0].handle);
        munmap(result, 4096);
 }
 
-- 
1.9.1

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to