[igt-dev] [PATCH 2/2] tests/dmabuf: Add tests for sync_file import (v4)
Kamil Konieczny
kamil.konieczny at linux.intel.com
Mon May 9 09:32:34 UTC 2022
Hi Jason,
On 2022-05-06 at 12:04:47 -0500, Jason Ekstrand wrote:
> From: Jason Ekstrand <jason at jlekstrand.net>
>
> v2 (Jason Ekstrand):
> - Put the skip for igt_rwquire_sw_sync() in the subtests
>
> v3 (Jason Ekstrand):
> - Use a separate igt_require(has_dmabuf_import_sync_file())
> - Tag as RFC because the kernel patches are RFC
>
> v4 (Jason Ekstrand):
> - Rework the tests with the new semantics; import no longer tries to
> guarantee writes finish after reads.
>
> Signed-off-by: Jason Ekstrand <jason at jlekstrand.net>
> Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> ---
> tests/dmabuf_sync_file.c | 185 +++++++++++++++++++++++++++++++++++++++
> 1 file changed, 185 insertions(+)
>
> diff --git a/tests/dmabuf_sync_file.c b/tests/dmabuf_sync_file.c
> index 7fed60f8..d29f569c 100644
> --- a/tests/dmabuf_sync_file.c
> +++ b/tests/dmabuf_sync_file.c
> @@ -23,6 +23,7 @@
>
> #include "igt.h"
> #include "igt_vgem.h"
> +#include "sw_sync.h"
>
> #include <linux/dma-buf.h>
> #include <sys/poll.h>
> @@ -35,6 +36,7 @@ struct igt_dma_buf_sync_file {
> };
>
> #define IGT_DMA_BUF_IOCTL_EXPORT_SYNC_FILE _IOWR(DMA_BUF_BASE, 2, struct igt_dma_buf_sync_file)
> +#define IGT_DMA_BUF_IOCTL_IMPORT_SYNC_FILE _IOW(DMA_BUF_BASE, 3, struct igt_dma_buf_sync_file)
>
> static bool has_dmabuf_export_sync_file(int fd)
> {
> @@ -71,6 +73,55 @@ static int dmabuf_export_sync_file(int dmabuf, uint32_t flags)
> return arg.fd;
> }
>
> +static bool has_dmabuf_import_sync_file(int fd)
> +{
> + struct vgem_bo bo;
> + int dmabuf, timeline, fence, ret;
> + struct igt_dma_buf_sync_file arg;
> +
> + bo.width = 1;
> + bo.height = 1;
> + bo.bpp = 32;
> + vgem_create(fd, &bo);
> +
> + dmabuf = prime_handle_to_fd(fd, bo.handle);
> + gem_close(fd, bo.handle);
> +
> + timeline = sw_sync_timeline_create();
> + fence = sw_sync_timeline_create_fence(timeline, 1);
> + sw_sync_timeline_inc(timeline, 1);
> +
> + arg.flags = DMA_BUF_SYNC_RW;
> + arg.fd = fence;
> +
> + ret = igt_ioctl(dmabuf, IGT_DMA_BUF_IOCTL_IMPORT_SYNC_FILE, &arg);
> + close(dmabuf);
> + close(fence);
> + igt_assert(ret == 0 || errno == ENOTTY);
> +
> + return ret == 0;
> +}
> +
> +static void dmabuf_import_sync_file(int dmabuf, uint32_t flags, int sync_fd)
> +{
> + struct igt_dma_buf_sync_file arg;
> +
> + arg.flags = flags;
> + arg.fd = sync_fd;
> + do_ioctl(dmabuf, IGT_DMA_BUF_IOCTL_IMPORT_SYNC_FILE, &arg);
> +}
> +
> +static void
> +dmabuf_import_timeline_fence(int dmabuf, uint32_t flags,
> + int timeline, uint32_t seqno)
> +{
> + int fence;
> +
> + fence = sw_sync_timeline_create_fence(timeline, seqno);
> + dmabuf_import_sync_file(dmabuf, flags, fence);
> + close(fence);
> +}
> +
> static bool dmabuf_busy(int dmabuf, uint32_t flags)
> {
> struct pollfd pfd = { .fd = dmabuf };
> @@ -305,6 +356,132 @@ static void test_export_wait_after_attach(int fd)
> gem_close(fd, bo.handle);
> }
>
> +static void test_import_basic(int fd)
> +{
> + struct vgem_bo bo;
> + int dmabuf, timeline;
> +
> + igt_require_sw_sync();
> + igt_require(has_dmabuf_import_sync_file(fd));
> +
> + bo.width = 1;
> + bo.height = 1;
> + bo.bpp = 32;
> + vgem_create(fd, &bo);
> +
> + dmabuf = prime_handle_to_fd(fd, bo.handle);
> +
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> +
> + timeline = sw_sync_timeline_create();
> +
> + dmabuf_import_timeline_fence(dmabuf, DMA_BUF_SYNC_READ, timeline, 1);
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(dmabuf_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(dmabuf_busy(dmabuf, DMA_BUF_SYNC_RW));
> + igt_assert(!dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_RW));
> +
> + sw_sync_timeline_inc(timeline, 1);
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_RW));
> + igt_assert(!dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(!dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(!dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_RW));
> +
> + dmabuf_import_timeline_fence(dmabuf, DMA_BUF_SYNC_WRITE, timeline, 2);
> + igt_assert(dmabuf_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(dmabuf_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(dmabuf_busy(dmabuf, DMA_BUF_SYNC_RW));
> + igt_assert(dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_RW));
> +
> + sw_sync_timeline_inc(timeline, 1);
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_RW));
> + igt_assert(!dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(!dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(!dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_RW));
> +
> + dmabuf_import_timeline_fence(dmabuf, DMA_BUF_SYNC_RW, timeline, 3);
> + igt_assert(dmabuf_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(dmabuf_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(dmabuf_busy(dmabuf, DMA_BUF_SYNC_RW));
> + igt_assert(dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_RW));
> +
> + sw_sync_timeline_inc(timeline, 1);
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_RW));
> + igt_assert(!dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(!dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(!dmabuf_sync_file_busy(dmabuf, DMA_BUF_SYNC_RW));
> +}
> +
> +static void test_import_multiple(int fd, bool write)
> +{
> + struct vgem_bo bo;
> + int i, dmabuf, read_sync_file, write_sync_file;
> + int write_timeline = -1, read_timelines[32];
> +
> + igt_require_sw_sync();
> + igt_require(has_dmabuf_import_sync_file(fd));
> +
> + bo.width = 1;
> + bo.height = 1;
> + bo.bpp = 32;
> + vgem_create(fd, &bo);
> +
> + dmabuf = prime_handle_to_fd(fd, bo.handle);
> +
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> +
> + for (i = 0; i < ARRAY_SIZE(read_timelines); i++) {
> + read_timelines[i] = sw_sync_timeline_create();
> + dmabuf_import_timeline_fence(dmabuf, DMA_BUF_SYNC_READ,
> + read_timelines[i], 1);
> + }
> +
> + if (write) {
> + write_timeline = sw_sync_timeline_create();
> + dmabuf_import_timeline_fence(dmabuf, DMA_BUF_SYNC_WRITE,
> + write_timeline, 1);
> + }
> +
> + read_sync_file = dmabuf_export_sync_file(dmabuf, DMA_BUF_SYNC_READ);
> + write_sync_file = dmabuf_export_sync_file(dmabuf, DMA_BUF_SYNC_WRITE);
> +
> + for (i = ARRAY_SIZE(read_timelines) - 1; i >= 0; i--) {
> + igt_assert_eq(dmabuf_busy(dmabuf, DMA_BUF_SYNC_READ), write);
> + igt_assert_eq(sync_file_busy(read_sync_file), write);
> + igt_assert(dmabuf_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(sync_file_busy(write_sync_file));
> +
> + sw_sync_timeline_inc(read_timelines[i], 1);
> + }
> +
> + igt_assert_eq(dmabuf_busy(dmabuf, DMA_BUF_SYNC_READ), write);
> + igt_assert_eq(sync_file_busy(read_sync_file), write);
> + igt_assert_eq(dmabuf_busy(dmabuf, DMA_BUF_SYNC_WRITE), write);
> + igt_assert_eq(sync_file_busy(write_sync_file), write);
> +
> + if (write)
> + sw_sync_timeline_inc(write_timeline, 1);
> +
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_READ));
> + igt_assert(!sync_file_busy(read_sync_file));
> + igt_assert(!dmabuf_busy(dmabuf, DMA_BUF_SYNC_WRITE));
> + igt_assert(!sync_file_busy(write_sync_file));
> +}
> +
> igt_main
> {
> int fd;
> @@ -325,4 +502,12 @@ igt_main
> igt_subtest_f("export-wait-after-attach")
> test_export_wait_after_attach(fd);
>
Please add description here.
> + igt_subtest_f("import-basic")
> + test_import_basic(fd);
> +
Same here.
> + igt_subtest_f("import-multiple-read-only")
> + test_import_multiple(fd, false);
> +
Same here.
Regards,
Kamil
> + igt_subtest_f("import-multiple-read-write")
> + test_import_multiple(fd, true);
> }
> --
> 2.36.0
>
More information about the igt-dev
mailing list