From 7b46ae1ba16082669dc7947b290e327a86b68afa Mon Sep 17 00:00:00 2001 From: Michał Winiarski Date: Tue, 30 Jun 2015 17:01:10 +0200 Subject: tests/gem_userptr_blits: subtests for MAP_FIXED mappings of regular BO MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When the memory backing the userptr object is released by the user, but the BO itself is not closed, it's possible to trigger recursive deadlock caused by operations done on different BO mapped in that region. Testcases are simulating such behaviour by using MAP_FIXED mmap flag. Signed-off-by: Michał Winiarski Cc: Chris Wilson Cc: Tvrtko Ursulin --- lib/ioctl_wrappers.c | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) (limited to 'lib/ioctl_wrappers.c') diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c index 32cb0f36..4d30443f 100644 --- a/lib/ioctl_wrappers.c +++ b/lib/ioctl_wrappers.c @@ -403,29 +403,38 @@ void gem_read(int fd, uint32_t handle, uint64_t offset, void *buf, uint64_t leng igt_assert_eq(__gem_read(fd, handle, offset, buf, length), 0); } +int __gem_set_domain(int fd, uint32_t handle, uint32_t read, uint32_t write) +{ + struct drm_i915_gem_set_domain set_domain; + int err; + + memset(&set_domain, 0, sizeof(set_domain)); + set_domain.handle = handle; + set_domain.read_domains = read; + set_domain.write_domain = write; + + err = 0; + if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain)) + err = -errno; + + return err; +} + /** * gem_set_domain: * @fd: open i915 drm file descriptor * @handle: gem buffer object handle - * @read_domains: gem domain bits for read access - * @write_domain: gem domain bit for write access + * @read: gem domain bits for read access + * @write: gem domain bit for write access * * This wraps the SET_DOMAIN ioctl, which is used to control the coherency of * the gem buffer object between the cpu and gtt mappings. It is also use to * synchronize with outstanding rendering in general, but for that use-case * please have a look at gem_sync(). */ -void gem_set_domain(int fd, uint32_t handle, - uint32_t read_domains, uint32_t write_domain) +void gem_set_domain(int fd, uint32_t handle, uint32_t read, uint32_t write) { - struct drm_i915_gem_set_domain set_domain; - - memset(&set_domain, 0, sizeof(set_domain)); - set_domain.handle = handle; - set_domain.read_domains = read_domains; - set_domain.write_domain = write_domain; - - do_ioctl(fd, DRM_IOCTL_I915_GEM_SET_DOMAIN, &set_domain); + igt_assert_eq(__gem_set_domain(fd, handle, read, write), 0); } /** -- cgit v1.2.3