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