summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-12-01 13:07:45 +0100
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-12-01 13:07:45 +0100
commit6daae8bcb6b4a930c9677f87fa24675581b69072 (patch)
treea6ab34c38c1103ccaf6294ef25487cac03fa68be
parentd8df90dc6bce77842c781aa0907147cecce4b5f6 (diff)
tests/gem_flink: check flink lifetime rules
flink names may not be destroyed while there's still a userspace handle around. Test this by - exporting an flink name from fd2 - open a gem bo from that name in fd - close fd2, then open a new drm file (so that the original handle disappears) - check whether the same flink name still works
-rw-r--r--tests/gem_flink.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/gem_flink.c b/tests/gem_flink.c
index 885cdd42..137d8822 100644
--- a/tests/gem_flink.c
+++ b/tests/gem_flink.c
@@ -115,6 +115,41 @@ test_bad_open(int fd)
assert(ret == -1 && errno == ENOENT);
}
+static void
+test_flink_lifetime(int fd)
+{
+ struct drm_i915_gem_create create;
+ struct drm_gem_flink flink;
+ struct drm_gem_open gem_open;
+ int ret, fd2;
+
+ printf("Testing flink lifetime.\n");
+
+ fd2 = drm_open_any();
+
+ memset(&create, 0, sizeof(create));
+ create.size = 16 * 1024;
+ ret = ioctl(fd2, DRM_IOCTL_I915_GEM_CREATE, &create);
+ assert(ret == 0);
+
+ flink.handle = create.handle;
+ ret = ioctl(fd2, DRM_IOCTL_GEM_FLINK, &flink);
+ assert(ret == 0);
+
+ gem_open.name = flink.name;
+ ret = ioctl(fd, DRM_IOCTL_GEM_OPEN, &gem_open);
+ assert(ret == 0);
+ assert(gem_open.handle != 0);
+
+ close(fd2);
+ fd2 = drm_open_any();
+
+ gem_open.name = flink.name;
+ ret = ioctl(fd2, DRM_IOCTL_GEM_OPEN, &gem_open);
+ assert(ret == 0);
+ assert(gem_open.handle != 0);
+}
+
int main(int argc, char **argv)
{
int fd;
@@ -131,6 +166,8 @@ int main(int argc, char **argv)
test_bad_flink(fd);
if (drmtest_run_subtest("bad-open"))
test_bad_open(fd);
+ if (drmtest_run_subtest("flink-lifetime"))
+ test_bad_open(fd);
return 0;
}