diff options
| author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-12-01 13:07:45 +0100 |
|---|---|---|
| committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-12-01 13:07:45 +0100 |
| commit | 6daae8bcb6b4a930c9677f87fa24675581b69072 (patch) | |
| tree | a6ab34c38c1103ccaf6294ef25487cac03fa68be | |
| parent | d8df90dc6bce77842c781aa0907147cecce4b5f6 (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.c | 37 |
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; } |
