From patchwork Wed Jun 22 08:02:26 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 9192137 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id D53C76075C for ; Wed, 22 Jun 2016 08:02:39 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C5224283E9 for ; Wed, 22 Jun 2016 08:02:39 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id B9C52283ED; Wed, 22 Jun 2016 08:02:39 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 10D79283E9 for ; Wed, 22 Jun 2016 08:02:39 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3737C6E1C8; Wed, 22 Jun 2016 08:02:38 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-lb0-x244.google.com (mail-lb0-x244.google.com [IPv6:2a00:1450:4010:c04::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 39BD76E1C8 for ; Wed, 22 Jun 2016 08:02:35 +0000 (UTC) Received: by mail-lb0-x244.google.com with SMTP id o4so3441191lbp.0 for ; Wed, 22 Jun 2016 01:02:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id; bh=6yHfR0Ad/C70B0IEeWwesPbC6DxTJMIICbp2v43Wke0=; b=IlxTxBHlP5DLMJ073lbcxhMlS71Gi/sE2bye8EPky1Fd3/FGqfbG3/N6duTfNATihq LKgTM5Y9Xfa1WW7kutRc6XRN8oYD+Aw64LB8tpO+SWo3rrTYrBhpzW50Rl6JXI0Q0Qrz bwOX1kWSUJwEBnj0hiJyWmzP0vefPDz4HPebY9wDESL+768SCxjg+IG65vB7mFkcmYl/ Ztxu/uZPzR1gKgaiFj0gZD0Vhm0udD7al0hYXJnxBkImsSG4l320OcTFTlSarJwSm696 lw+S/csYh/2bzX9R/xnoNqJyduJI1arjeff+3V+8czAhSjlWlnSbpluZW+FQ3DRTGLcT QCew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=6yHfR0Ad/C70B0IEeWwesPbC6DxTJMIICbp2v43Wke0=; b=B0AI4ctIx/7txtzjsbzK1kaQoW64YHwLqK6NL1GhlbQ7eVSb91fsheiS1LTQqN05Ji xfh2jWaIM1NVB6GKx9PeM0PD+viQXExJeDgZ5pz6N39xFsSMj+OFBNhxGC7iYHid4USi Fakm7d+z4AqW3F8HxMVQcNLN7C/mG5Lhs0vdA+6zXdjCa+SjekGJnEyOqGJa5g3VQTO+ bhbBZdeXJJYop4tmrhKIA98OmuHdneeackmqd/UKUeu2PdCDfcOldjXJnTnq/i+RpZsA 7+5Ni3IQXkSfGO77SraK55MD/gjIc7+yWofNgoSRtN7XqiYPnIrrL9m2ixtaKb2gBZaH fVFA== X-Gm-Message-State: ALyK8tKIs7Mz+P5Ngn2Co20nXluXWihFxFFv1vJjKdJgefNkpuP0Y1WrzmB/A01KOrGsEg== X-Received: by 10.195.10.131 with SMTP id ea3mr22297899wjd.86.1466582553066; Wed, 22 Jun 2016 01:02:33 -0700 (PDT) Received: from haswell.alporthouse.com ([78.156.65.138]) by smtp.gmail.com with ESMTPSA id q71sm6803466wme.17.2016.06.22.01.02.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 22 Jun 2016 01:02:32 -0700 (PDT) From: Chris Wilson To: intel-gfx@lists.freedesktop.org Date: Wed, 22 Jun 2016 09:02:26 +0100 Message-Id: <1466582546-28083-1-git-send-email-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.8.1 Subject: [Intel-gfx] [PATCH igt] vgem: Add basic dma-buf fence interop X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP Signed-off-by: Chris Wilson --- lib/igt_vgem.c | 70 ++++++++++++++++++++++++++++++++++++++ lib/igt_vgem.h | 4 +++ tests/prime_vgem.c | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- tests/vgem_basic.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++-- 4 files changed, 259 insertions(+), 5 deletions(-) diff --git a/lib/igt_vgem.c b/lib/igt_vgem.c index 4fe166a..95731d9 100644 --- a/lib/igt_vgem.c +++ b/lib/igt_vgem.c @@ -80,3 +80,73 @@ void *vgem_mmap(int fd, struct vgem_bo *bo, unsigned prot) return ptr; } +#define LOCAL_VGEM_FENCE_ATTACH 0x1 +#define LOCAL_VGEM_FENCE_SIGNAL 0x2 + +#define LOCAL_IOCTL_VGEM_FENCE_ATTACH DRM_IOWR( DRM_COMMAND_BASE + LOCAL_VGEM_FENCE_ATTACH, struct local_vgem_fence_attach) +#define LOCAL_IOCTL_VGEM_FENCE_SIGNAL DRM_IOW( DRM_COMMAND_BASE + LOCAL_VGEM_FENCE_SIGNAL, struct local_vgem_fence_signal) + +struct local_vgem_fence_attach { + uint32_t handle; + uint32_t flags; +#define VGEM_FENCE_WRITE 0x1 + uint32_t out_fence; + uint32_t pad; +}; + +struct local_vgem_fence_signal { + uint32_t fence; + uint32_t flags; +}; + +bool vgem_has_fences(int fd) +{ + struct local_vgem_fence_signal arg; + int err; + + err = 0; + memset(&arg, 0, sizeof(arg)); + if (drmIoctl(fd, LOCAL_IOCTL_VGEM_FENCE_SIGNAL, &arg)) + err = -errno; + errno = 0; + return err == -ENOENT; +} + +static int __vgem_fence_attach(int fd, struct local_vgem_fence_attach *arg) +{ + int err = 0; + if (igt_ioctl(fd, LOCAL_IOCTL_VGEM_FENCE_ATTACH, arg)) + err = -errno; + errno = 0; + return err; +} + +uint32_t vgem_fence_attach(int fd, struct vgem_bo *bo, bool write) +{ + struct local_vgem_fence_attach arg; + + memset(&arg, 0, sizeof(arg)); + arg.handle = bo->handle; + if (write) + arg.flags |= VGEM_FENCE_WRITE; + igt_assert_eq(__vgem_fence_attach(fd, &arg), 0); + return arg.out_fence; +} + +static int __vgem_fence_signal(int fd, struct local_vgem_fence_signal *arg) +{ + int err = 0; + if (igt_ioctl(fd, LOCAL_IOCTL_VGEM_FENCE_SIGNAL, arg)) + err = -errno; + errno = 0; + return err; +} + +void vgem_fence_signal(int fd, uint32_t fence) +{ + struct local_vgem_fence_signal arg; + + memset(&arg, 0, sizeof(arg)); + arg.fence = fence; + igt_assert_eq(__vgem_fence_signal(fd, &arg), 0); +} diff --git a/lib/igt_vgem.h b/lib/igt_vgem.h index 9e4a55e..91c77ba 100644 --- a/lib/igt_vgem.h +++ b/lib/igt_vgem.h @@ -39,4 +39,8 @@ void vgem_create(int fd, struct vgem_bo *bo); void *__vgem_mmap(int fd, struct vgem_bo *bo, unsigned prot); void *vgem_mmap(int fd, struct vgem_bo *bo, unsigned prot); +bool vgem_has_fences(int fd); +uint32_t vgem_fence_attach(int fd, struct vgem_bo *bo, bool write); +void vgem_fence_signal(int fd, uint32_t fence); + #endif /* IGT_VGEM_H */ diff --git a/tests/prime_vgem.c b/tests/prime_vgem.c index 6bdd567..be4a43c 100644 --- a/tests/prime_vgem.c +++ b/tests/prime_vgem.c @@ -309,21 +309,88 @@ static void test_sync(int i915, int vgem, unsigned ring, uint32_t flags) vgem_create(vgem, &scratch); dmabuf = prime_handle_to_fd(vgem, scratch.handle); + ptr = mmap(NULL, scratch.size, PROT_READ, MAP_SHARED, dmabuf, 0); + igt_assert(ptr != MAP_FAILED); + gem_close(vgem, scratch.handle); + work(i915, dmabuf, ring, flags); prime_sync_start(dmabuf, false); - - ptr = vgem_mmap(vgem, &scratch, PROT_READ); for (i = 0; i < 1024; i++) igt_assert_eq_u32(ptr[i], i); - munmap(ptr, 4096); prime_sync_end(dmabuf, false); + close(dmabuf); + + munmap(ptr, scratch.size); +} + +static void test_fence_wait(int i915, int vgem, unsigned ring, unsigned flags) +{ + struct vgem_bo scratch; + uint32_t fence; + uint32_t *ptr; + int dmabuf; + + scratch.width = 1024; + scratch.height = 1; + scratch.bpp = 32; + vgem_create(vgem, &scratch); + dmabuf = prime_handle_to_fd(vgem, scratch.handle); + fence = vgem_fence_attach(vgem, &scratch, true); gem_close(vgem, scratch.handle); + + igt_fork(child, 1) + work(i915, dmabuf, ring, flags); + + sleep(1); + vgem_fence_signal(vgem, fence); + igt_waitchildren(); + + ptr = mmap(NULL, scratch.size, PROT_READ, MAP_SHARED, dmabuf, 0); + igt_assert(ptr != MAP_FAILED); + + prime_sync_start(dmabuf, false); + for (int i = 0; i < 1024; i++) + igt_assert_eq_u32(ptr[i], i); + prime_sync_end(dmabuf, false); + munmap(ptr, scratch.size); + close(dmabuf); } +static void test_fence_hang(int i915, int vgem, bool write) +{ + struct vgem_bo scratch; + uint32_t *ptr; + int dmabuf; + int i; + + scratch.width = 1024; + scratch.height = 1; + scratch.bpp = 32; + vgem_create(vgem, &scratch); + dmabuf = prime_handle_to_fd(vgem, scratch.handle); + vgem_fence_attach(vgem, &scratch, write); + + ptr = mmap(NULL, scratch.size, PROT_READ, MAP_SHARED, dmabuf, 0); + igt_assert(ptr != MAP_FAILED); + gem_close(vgem, scratch.handle); + + work(i915, dmabuf, I915_EXEC_DEFAULT, 0); + + /* The work should have been cancelled */ + + prime_sync_start(dmabuf, false); + for (i = 0; i < 1024; i++) + igt_assert_eq_u32(ptr[i], 0); + prime_sync_end(dmabuf, false); + close(dmabuf); + + munmap(ptr, scratch.size); +} + static bool has_prime_export(int fd) { uint64_t value; @@ -411,6 +478,31 @@ igt_main } } + /* Fence testing */ + igt_subtest_group { + igt_fixture { + igt_require(vgem_has_fences(vgem)); + } + + for (e = intel_execution_engines; e->name; e++) { + igt_subtest_f("%sfence-wait-%s", + e->exec_id == 0 ? "basic-" : "", + e->name) { + gem_require_ring(i915, e->exec_id | e->flags); + igt_skip_on_f(gen == 6 && + e->exec_id == I915_EXEC_BSD, + "MI_STORE_DATA broken on gen6 bsd\n"); + gem_quiescent_gpu(i915); + test_fence_wait(i915, vgem, e->exec_id, e->flags); + } + } + + igt_subtest("fence-read-hang") + test_fence_hang(i915, vgem, false); + igt_subtest("fence-write-hang") + test_fence_hang(i915, vgem, true); + } + igt_fixture { close(i915); close(vgem); diff --git a/tests/vgem_basic.c b/tests/vgem_basic.c index b4337ee..9feabf7 100644 --- a/tests/vgem_basic.c +++ b/tests/vgem_basic.c @@ -27,6 +27,7 @@ #include "igt_sysfs.h" #include +#include #include #include @@ -144,6 +145,82 @@ static void test_dmabuf_mmap(int fd) munmap(ptr, bo.size); } +static bool prime_busy(int fd, bool excl) +{ + struct pollfd pfd = { .fd = fd, .events = excl ? POLLOUT : POLLIN }; + return poll(&pfd, 1, 0) == 0; +} + +static void test_dmabuf_fence(int fd) +{ + struct vgem_bo bo; + int dmabuf; + uint32_t fence; + + bo.width = 1024; + bo.height = 1; + bo.bpp = 32; + vgem_create(fd, &bo); + + /* export, then fence */ + + dmabuf = prime_handle_to_fd(fd, bo.handle); + + fence = vgem_fence_attach(fd, &bo, false); + igt_assert(!prime_busy(dmabuf, false)); + igt_assert(prime_busy(dmabuf, true)); + + vgem_fence_signal(fd, fence); + igt_assert(!prime_busy(dmabuf, false)); + igt_assert(!prime_busy(dmabuf, true)); + + fence = vgem_fence_attach(fd, &bo, true); + igt_assert(prime_busy(dmabuf, false)); + igt_assert(prime_busy(dmabuf, true)); + + vgem_fence_signal(fd, fence); + igt_assert(!prime_busy(dmabuf, false)); + igt_assert(!prime_busy(dmabuf, true)); + + gem_close(fd, bo.handle); +} + +static void test_dmabuf_fence_before(int fd) +{ + struct vgem_bo bo; + int dmabuf; + uint32_t fence; + + bo.width = 1024; + bo.height = 1; + bo.bpp = 32; + vgem_create(fd, &bo); + + fence = vgem_fence_attach(fd, &bo, false); + dmabuf = prime_handle_to_fd(fd, bo.handle); + + igt_assert(!prime_busy(dmabuf, false)); + igt_assert(prime_busy(dmabuf, true)); + + vgem_fence_signal(fd, fence); + igt_assert(!prime_busy(dmabuf, false)); + igt_assert(!prime_busy(dmabuf, true)); + + gem_close(fd, bo.handle); + vgem_create(fd, &bo); + + fence = vgem_fence_attach(fd, &bo, true); + dmabuf = prime_handle_to_fd(fd, bo.handle); + igt_assert(prime_busy(dmabuf, false)); + igt_assert(prime_busy(dmabuf, true)); + + vgem_fence_signal(fd, fence); + igt_assert(!prime_busy(dmabuf, false)); + igt_assert(!prime_busy(dmabuf, true)); + + gem_close(fd, bo.handle); +} + static void test_sysfs_read(int fd) { int dir = igt_sysfs_open(fd, NULL); @@ -229,11 +306,22 @@ igt_main igt_require(has_prime_export(fd)); } - igt_subtest_f("dmabuf-export") + igt_subtest("dmabuf-export") test_dmabuf_export(fd); - igt_subtest_f("dmabuf-mmap") + igt_subtest("dmabuf-mmap") test_dmabuf_mmap(fd); + + igt_subtest_group { + igt_fixture { + igt_require(vgem_has_fences(fd)); + } + + igt_subtest("dmabuf-fence") + test_dmabuf_fence(fd); + igt_subtest("dmabuf-fence-before") + test_dmabuf_fence_before(fd); + } } igt_subtest("sysfs")