tests/gem_flink: check flink lifetime rules
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Sat, 1 Dec 2012 12:07:45 +0000 (13:07 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Sat, 1 Dec 2012 12:07:45 +0000 (13:07 +0100)
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

tests/gem_flink.c

index 885cdd4..137d882 100644 (file)
@@ -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;
 }