From 7ade1ad14efda4e24da2dc9b3352cd00ba40335d Mon Sep 17 00:00:00 2001
From: Daniel Vetter <daniel.vetter@ffwll.ch>
Date: Wed, 20 Feb 2019 10:18:40 +0100
Subject: [PATCH] tests/kms_lease: multimaster testcase

Doesn't work as expected yet ...

Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
---
 tests/kms_lease.c | 69 +++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 61 insertions(+), 8 deletions(-)

diff --git a/tests/kms_lease.c b/tests/kms_lease.c
index e69964dd3..f7f3c98dc 100644
--- a/tests/kms_lease.c
+++ b/tests/kms_lease.c
@@ -839,7 +839,8 @@ static bool is_master(int fd)
 	/* FIXME: replace with drmIsMaster once we bumped libdrm version */
 	return drmAuthMagic(fd, 0) != -EACCES;
 }
-static void master_vs_lease(data_t *data)
+
+static int _create_simple_lease(int master_fd, data_t *data, int expected_ret)
 {
 	uint32_t object_ids[3];
 	struct local_drm_mode_create_lease mcl;
@@ -852,28 +853,77 @@ static void master_vs_lease(data_t *data)
 	mcl.object_count = 3;
 	mcl.flags = 0;
 
-	igt_assert_eq(create_lease(data->master.fd, &mcl), 0);
+	igt_assert_eq(create_lease(data->master.fd, &mcl), expected_ret);
+
+	return expected_ret == 0 ? mcl.fd : 0;
+}
+
+static int create_simple_lease(int master_fd, data_t *data)
+{
+	return _create_simple_lease(master_fd, data, 0);
+}
 
-	igt_assert_eq(drmDropMaster(mcl.fd), -1);
+/* check lease master status in lockdep with lessors, but can't change it
+ * themselves */
+static void master_vs_lease(data_t *data)
+{
+	int lease_fd;
+
+	lease_fd = create_simple_lease(data->master.fd, data);
+
+	igt_assert_eq(drmDropMaster(lease_fd), -1);
 	igt_assert_eq(errno, EINVAL);
 
 	igt_assert(is_master(data->master.fd));
-	igt_assert(is_master(mcl.fd));
+	igt_assert(is_master(lease_fd));
 
 	do_or_die(drmDropMaster(data->master.fd));
 
 	igt_assert(!is_master(data->master.fd));
-	igt_assert(!is_master(mcl.fd));
+	igt_assert(!is_master(lease_fd));
 
-	igt_assert_eq(drmSetMaster(mcl.fd), -1);
+	igt_assert_eq(drmSetMaster(lease_fd), -1);
 	igt_assert_eq(errno, EINVAL);
 
 	do_or_die(drmSetMaster(data->master.fd));
 
 	igt_assert(is_master(data->master.fd));
-	igt_assert(is_master(mcl.fd));
+	igt_assert(is_master(lease_fd));
 
-	close(mcl.fd);
+	close(lease_fd);
+}
+
+static void multimaster_lease(data_t *data)
+{
+	int lease_fd, master2_fd, lease2_fd;
+
+	lease_fd = create_simple_lease(data->master.fd, data);
+
+	igt_assert(is_master(data->master.fd));
+	igt_assert(is_master(lease_fd));
+
+	master2_fd = drm_open_driver(DRIVER_ANY);
+
+	igt_assert(!is_master(master2_fd));
+
+	/* EBUSY looks wrong here, seems to indicate that we're checking against
+	 * the wrong master - ioctl fails because objects are leased already, it
+	 * should fail because we're not the current master */
+	_create_simple_lease(master2_fd, data, -EBUSY);
+
+	do_or_die(drmDropMaster(data->master.fd));
+	do_or_die(drmSetMaster(master2_fd));
+
+	igt_assert(!is_master(data->master.fd));
+	igt_assert(!is_master(lease_fd));
+	igt_assert(is_master(master2_fd));
+
+	/* this fails with -EPERM, despite that master2_fd is now master */
+	lease2_fd = create_simple_lease(master2_fd, data);
+
+	close(lease2_fd);
+	close(lease_fd);
+	close(master2_fd);
 }
 
 igt_main
@@ -917,4 +967,7 @@ igt_main
 
 	igt_subtest("master-vs-lease")
 		master_vs_lease(&data);
+
+	igt_subtest("multimaster-lease")
+		multimaster_lease(&data);
 }
-- 
GitLab