* [igt-dev] [PATCH i-g-t v4 0/3] Add GEM_MMAP_OFFSET support in IGT.
@ 2019-11-26 17:25 Zbigniew Kempczyński
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 1/3] include/drm-uapi/i915_drm: Add defs for mmap_offset Zbigniew Kempczyński
` (9 more replies)
0 siblings, 10 replies; 19+ messages in thread
From: Zbigniew Kempczyński @ 2019-11-26 17:25 UTC (permalink / raw)
To: igt-dev
Enable GEM_MMAP_OFFSET uAPI.
Series comes from split 'LMEM enabling in IGT'.
Mmap_offset will land before memory region so add support for it.
v2: Change WC -> WB according to review
v3: Remove "local" from i915_drm.h and push dummy commit to it.
(suggested by Petri).
Add mmap-offset-close-race test (suggested by Chris).
v4: Additional checks + fixing leak in __gem_mmap__has_wc()
Cc: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
Cc: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Vanshidhar Konda <vanshidhar.r.konda@intel.com>
Lukasz Kalamarz (2):
lib/i915/gem_mman: add mmap_offset support
tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset
Zbigniew Kempczyński (1):
include/drm-uapi/i915_drm: Add defs for mmap_offset
include/drm-uapi/i915_drm.h | 27 ++++
lib/i915/gem_mman.c | 232 +++++++++++++++++++++++++++++------
lib/i915/gem_mman.h | 16 ++-
tests/Makefile.sources | 3 +
tests/i915/gem_mmap_offset.c | 175 ++++++++++++++++++++++++++
tests/meson.build | 1 +
6 files changed, 414 insertions(+), 40 deletions(-)
create mode 100644 tests/i915/gem_mmap_offset.c
--
2.23.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
* [igt-dev] [PATCH i-g-t v4 1/3] include/drm-uapi/i915_drm: Add defs for mmap_offset
2019-11-26 17:25 [igt-dev] [PATCH i-g-t v4 0/3] Add GEM_MMAP_OFFSET support in IGT Zbigniew Kempczyński
@ 2019-11-26 17:25 ` Zbigniew Kempczyński
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 2/3] lib/i915/gem_mman: add mmap_offset support Zbigniew Kempczyński
` (8 subsequent siblings)
9 siblings, 0 replies; 19+ messages in thread
From: Zbigniew Kempczyński @ 2019-11-26 17:25 UTC (permalink / raw)
To: igt-dev; +Cc: Petri Latvala
Pre-merge dummy commit of kernel uAPI i915_drm.h file.
Required to use GEM_MMAP_OFFSET ioctl().
Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Suggested-by: Petri Latvala <petri.latvala@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
---
include/drm-uapi/i915_drm.h | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/include/drm-uapi/i915_drm.h b/include/drm-uapi/i915_drm.h
index ab899abb..8fb989f5 100644
--- a/include/drm-uapi/i915_drm.h
+++ b/include/drm-uapi/i915_drm.h
@@ -395,6 +395,7 @@ typedef struct _drm_i915_sarea {
#define DRM_IOCTL_I915_GEM_PWRITE DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_PWRITE, struct drm_i915_gem_pwrite)
#define DRM_IOCTL_I915_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP, struct drm_i915_gem_mmap)
#define DRM_IOCTL_I915_GEM_MMAP_GTT DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP_GTT, struct drm_i915_gem_mmap_gtt)
+#define DRM_IOCTL_I915_GEM_MMAP_OFFSET DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MMAP_GTT, struct drm_i915_gem_mmap_offset)
#define DRM_IOCTL_I915_GEM_SET_DOMAIN DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SET_DOMAIN, struct drm_i915_gem_set_domain)
#define DRM_IOCTL_I915_GEM_SW_FINISH DRM_IOW (DRM_COMMAND_BASE + DRM_I915_GEM_SW_FINISH, struct drm_i915_gem_sw_finish)
#define DRM_IOCTL_I915_GEM_SET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_SET_TILING, struct drm_i915_gem_set_tiling)
@@ -793,6 +794,32 @@ struct drm_i915_gem_mmap_gtt {
__u64 offset;
};
+struct drm_i915_gem_mmap_offset {
+ /** Handle for the object being mapped. */
+ __u32 handle;
+ __u32 pad;
+ /**
+ * Fake offset to use for subsequent mmap call
+ *
+ * This is a fixed-size type for 32/64 compatibility.
+ */
+ __u64 offset;
+
+ /**
+ * Flags for extended behaviour.
+ *
+ * It is mandatory that either one of the MMAP_OFFSET flags
+ * should be passed here.
+ */
+ __u64 flags;
+#define I915_MMAP_OFFSET_GTT 0
+#define I915_MMAP_OFFSET_WC 1
+#define I915_MMAP_OFFSET_WB 2
+#define I915_MMAP_OFFSET_UC 3
+
+ __u64 extensions;
+};
+
struct drm_i915_gem_set_domain {
/** Handle for the object */
__u32 handle;
--
2.23.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [igt-dev] [PATCH i-g-t v4 2/3] lib/i915/gem_mman: add mmap_offset support
2019-11-26 17:25 [igt-dev] [PATCH i-g-t v4 0/3] Add GEM_MMAP_OFFSET support in IGT Zbigniew Kempczyński
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 1/3] include/drm-uapi/i915_drm: Add defs for mmap_offset Zbigniew Kempczyński
@ 2019-11-26 17:25 ` Zbigniew Kempczyński
2019-11-28 14:38 ` Chris Wilson
2019-11-28 14:43 ` Chris Wilson
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 3/3] tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset Zbigniew Kempczyński
` (7 subsequent siblings)
9 siblings, 2 replies; 19+ messages in thread
From: Zbigniew Kempczyński @ 2019-11-26 17:25 UTC (permalink / raw)
To: igt-dev
From: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
With introduction of LMEM concept new IOCTL call were implemented
- gem_mmap_offset. This patch add support in IGT for it.
Signed-off-by: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
Signed-off-by: Antonio Argenziano <antonio.argenziano@intel.com>
Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Vanshidhar Konda <vanshidhar.r.konda@intel.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
---
lib/i915/gem_mman.c | 232 ++++++++++++++++++++++++++++++++++++--------
lib/i915/gem_mman.h | 16 ++-
2 files changed, 208 insertions(+), 40 deletions(-)
diff --git a/lib/i915/gem_mman.c b/lib/i915/gem_mman.c
index 6256627b..3b54b6c8 100644
--- a/lib/i915/gem_mman.c
+++ b/lib/i915/gem_mman.c
@@ -40,6 +40,31 @@
#define VG(x) do {} while (0)
#endif
+static int gem_mmap_gtt_version(int fd)
+{
+ struct drm_i915_getparam gp;
+ int gtt_version = -1;
+
+ memset(&gp, 0, sizeof(gp));
+ gp.param = I915_PARAM_MMAP_GTT_VERSION;
+ gp.value = >t_version;
+ ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
+
+ return gtt_version;
+}
+
+static bool gem_has_mmap_offset(int fd)
+{
+ int gtt_version = gem_mmap_gtt_version(fd);
+
+ return gtt_version >= 4;
+}
+
+void gem_require_mmap_offset(int i915)
+{
+ igt_require(gem_has_mmap_offset(i915));
+}
+
/**
* __gem_mmap__gtt:
* @fd: open i915 drm file descriptor
@@ -101,46 +126,66 @@ int gem_munmap(void *ptr, uint64_t size)
return ret;
}
-bool gem_mmap__has_wc(int fd)
+bool __gem_mmap__has_wc(int fd)
{
- static int has_wc = -1;
-
- if (has_wc == -1) {
- struct drm_i915_getparam gp;
- int mmap_version = -1;
- int gtt_version = -1;
-
- has_wc = 0;
-
- memset(&gp, 0, sizeof(gp));
- gp.param = I915_PARAM_MMAP_GTT_VERSION;
- gp.value = >t_version;
- ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
-
- memset(&gp, 0, sizeof(gp));
- gp.param = I915_PARAM_MMAP_VERSION;
- gp.value = &mmap_version;
- ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
-
- /* Do we have the new mmap_ioctl with DOMAIN_WC? */
- if (mmap_version >= 1 && gtt_version >= 2) {
- struct drm_i915_gem_mmap arg;
-
- /* Does this device support wc-mmaps ? */
- memset(&arg, 0, sizeof(arg));
- arg.handle = gem_create(fd, 4096);
- arg.offset = 0;
- arg.size = 4096;
- arg.flags = I915_MMAP_WC;
- has_wc = igt_ioctl(fd, DRM_IOCTL_I915_GEM_MMAP, &arg) == 0;
- gem_close(fd, arg.handle);
- }
- errno = 0;
+ int has_wc = 0;
+
+ struct drm_i915_getparam gp;
+ int mmap_version = -1;
+
+ memset(&gp, 0, sizeof(gp));
+ gp.param = I915_PARAM_MMAP_VERSION;
+ gp.value = &mmap_version;
+ ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
+
+ /* Do we have the mmap_ioctl with DOMAIN_WC? */
+ if (mmap_version >= 1 && gem_mmap_gtt_version(fd) >= 2) {
+ struct drm_i915_gem_mmap arg;
+
+ /* Does this device support wc-mmaps ? */
+ memset(&arg, 0, sizeof(arg));
+ arg.handle = gem_create(fd, 4096);
+ arg.offset = 0;
+ arg.size = 4096;
+ arg.flags = I915_MMAP_WC;
+ has_wc = igt_ioctl(fd, DRM_IOCTL_I915_GEM_MMAP, &arg) == 0;
+ gem_close(fd, arg.handle);
+
+ if (has_wc && from_user_pointer(arg.addr_ptr))
+ munmap(from_user_pointer(arg.addr_ptr), arg.size);
}
+ errno = 0;
+
+ return has_wc > 0;
+}
+
+bool __gem_mmap_offset__has_wc(int fd)
+{
+ int has_wc = 0;
+ struct drm_i915_gem_mmap_offset arg;
+
+ if (!gem_has_mmap_offset(fd))
+ return false;
+
+ /* Does this device support wc-mmaps ? */
+ memset(&arg, 0, sizeof(arg));
+ arg.handle = gem_create(fd, 4096);
+ arg.offset = 0;
+ arg.flags = I915_MMAP_OFFSET_WC;
+ has_wc = igt_ioctl(fd, DRM_IOCTL_I915_GEM_MMAP_OFFSET,
+ &arg) == 0;
+ gem_close(fd, arg.handle);
+
+ errno = 0;
return has_wc > 0;
}
+bool gem_mmap__has_wc(int fd)
+{
+ return __gem_mmap_offset__has_wc(fd) || __gem_mmap__has_wc(fd);
+}
+
/**
* __gem_mmap:
* @fd: open i915 drm file descriptor
@@ -157,11 +202,13 @@ bool gem_mmap__has_wc(int fd)
*
* Returns: A pointer to the created memory mapping, NULL on failure.
*/
-static void
-*__gem_mmap(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned int prot, uint64_t flags)
+void *__gem_mmap(int fd, uint32_t handle, uint64_t offset, uint64_t size,
+ unsigned int prot, uint64_t flags)
{
struct drm_i915_gem_mmap arg;
+ igt_assert(offset == 0);
+
memset(&arg, 0, sizeof(arg));
arg.handle = handle;
arg.offset = offset;
@@ -177,6 +224,50 @@ static void
return from_user_pointer(arg.addr_ptr);
}
+/**
+ * __gem_mmap_offset:
+ * @fd: open i915 drm file descriptor
+ * @handle: gem buffer object handle
+ * @offset: offset in the gem buffer of the mmap arena
+ * @size: size of the mmap arena
+ * @prot: memory protection bits as used by mmap()
+ * @flags: flags used to determine caching
+ *
+ * Mmap the gem buffer memory on offset returned in GEM_MMAP_OFFSET ioctl.
+ * Offset argument passed in function call must be 0. In the future
+ * when driver will allow slice mapping of buffer object this restriction
+ * will be removed.
+ *
+ * Returns: A pointer to the created memory mapping, NULL on failure.
+ */
+void *__gem_mmap_offset(int fd, uint32_t handle, uint64_t offset, uint64_t size,
+ unsigned int prot, uint64_t flags)
+{
+ struct drm_i915_gem_mmap_offset arg;
+ void *ptr;
+
+ if (!gem_has_mmap_offset(fd))
+ return NULL;
+
+ igt_assert(offset == 0);
+
+ memset(&arg, 0, sizeof(arg));
+ arg.handle = handle;
+ arg.flags = flags;
+
+ if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_MMAP_OFFSET, &arg))
+ return NULL;
+
+ ptr = mmap64(0, size, prot, MAP_SHARED, fd, arg.offset + offset);
+
+ if (ptr == MAP_FAILED)
+ ptr = NULL;
+ else
+ errno = 0;
+
+ return ptr;
+}
+
/**
* __gem_mmap__wc:
* @fd: open i915 drm file descriptor
@@ -194,7 +285,12 @@ static void
*/
void *__gem_mmap__wc(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot)
{
- return __gem_mmap(fd, handle, offset, size, prot, I915_MMAP_WC);
+ void *ptr = __gem_mmap_offset(fd, handle, offset, size, prot,
+ I915_MMAP_OFFSET_WC);
+ if (!ptr)
+ ptr = __gem_mmap(fd, handle, offset, size, prot, I915_MMAP_WC);
+
+ return ptr;
}
/**
@@ -205,17 +301,71 @@ void *__gem_mmap__wc(int fd, uint32_t handle, uint64_t offset, uint64_t size, un
* @size: size of the mmap arena
* @prot: memory protection bits as used by mmap()
*
- * Like __gem_mmap__wc() except we assert on failure.
+ * Try to __gem_mmap__wc(). Assert on failure.
*
* Returns: A pointer to the created memory mapping
*/
void *gem_mmap__wc(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot)
{
void *ptr = __gem_mmap__wc(fd, handle, offset, size, prot);
+
igt_assert(ptr);
return ptr;
}
+/**
+ * __gem_mmap__device_coherent:
+ * @fd: open i915 drm file descriptor
+ * @handle: gem buffer object handle
+ * @offset: offset in the gem buffer of the mmap arena
+ * @size: size of the mmap arena
+ * @prot: memory protection bits as used by mmap()
+ *
+ * Returns: A pointer to a block of linear device memory mapped into the
+ * process with WC semantics. When no WC is available try to mmap using GGTT.
+ */
+void *__gem_mmap__device_coherent(int fd, uint32_t handle, uint64_t offset,
+ uint64_t size, unsigned prot)
+{
+ void *ptr = __gem_mmap_offset(fd, handle, offset, size, prot,
+ I915_MMAP_OFFSET_WC);
+ if (!ptr)
+ ptr = __gem_mmap__wc(fd, handle, offset, size, prot);
+
+ if (!ptr)
+ ptr = __gem_mmap__gtt(fd, handle, size, prot);
+
+ return ptr;
+}
+
+/**
+ * gem_mmap__device_coherent:
+ * @fd: open i915 drm file descriptor
+ * @handle: gem buffer object handle
+ * @offset: offset in the gem buffer of the mmap arena
+ * @size: size of the mmap arena
+ * @prot: memory protection bits as used by mmap()
+ *
+ * Call __gem_mmap__device__coherent(), asserts on fail.
+ * Offset argument passed in function call must be 0. In the future
+ * when driver will allow slice mapping of buffer object this restriction
+ * will be removed.
+ *
+ * Returns: A pointer to the created memory mapping.
+ */
+void *gem_mmap__device_coherent(int fd, uint32_t handle, uint64_t offset,
+ uint64_t size, unsigned prot)
+{
+ void *ptr;
+
+ igt_assert(offset == 0);
+
+ ptr = gem_mmap__device_coherent(fd, handle, offset, size, prot);
+ igt_assert(ptr);
+
+ return ptr;
+}
+
/**
* __gem_mmap__cpu:
* @fd: open i915 drm file descriptor
@@ -248,7 +398,11 @@ void *__gem_mmap__cpu(int fd, uint32_t handle, uint64_t offset, uint64_t size, u
*/
void *gem_mmap__cpu(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot)
{
- void *ptr = __gem_mmap__cpu(fd, handle, offset, size, prot);
+ void *ptr = __gem_mmap_offset(fd, handle, offset, size, prot,
+ I915_MMAP_OFFSET_WB);
+ if (!ptr)
+ ptr = __gem_mmap__cpu(fd, handle, offset, size, prot);
+
igt_assert(ptr);
return ptr;
}
diff --git a/lib/i915/gem_mman.h b/lib/i915/gem_mman.h
index 096ff592..ea304dbf 100644
--- a/lib/i915/gem_mman.h
+++ b/lib/i915/gem_mman.h
@@ -25,12 +25,20 @@
#ifndef GEM_MMAN_H
#define GEM_MMAN_H
+#include <stdint.h>
+
+void gem_require_mmap_offset(int i915);
+bool gem_mmap_has_gtt(int fd);
+
void *gem_mmap__gtt(int fd, uint32_t handle, uint64_t size, unsigned prot);
void *gem_mmap__cpu(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot);
+bool __gem_mmap__has_wc(int fd);
+bool __gem_mmap_offset__has_wc(int fd);
bool gem_mmap__has_wc(int fd);
void *gem_mmap__wc(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot);
-
+void *gem_mmap__device_coherent(int fd, uint32_t handle, uint64_t offset,
+ uint64_t size, unsigned prot);
#ifndef I915_GEM_DOMAIN_WC
#define I915_GEM_DOMAIN_WC 0x80
#endif
@@ -38,9 +46,15 @@ void *gem_mmap__wc(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsi
bool gem_has_mappable_ggtt(int i915);
void gem_require_mappable_ggtt(int i915);
+void *__gem_mmap(int fd, uint32_t handle, uint64_t offset, uint64_t size,
+ unsigned int prot, uint64_t flags);
+void *__gem_mmap_offset(int fd, uint32_t handle, uint64_t offset, uint64_t size,
+ unsigned int prot, uint64_t flags);
void *__gem_mmap__gtt(int fd, uint32_t handle, uint64_t size, unsigned prot);
void *__gem_mmap__cpu(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot);
void *__gem_mmap__wc(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot);
+void *__gem_mmap__device_coherent(int fd, uint32_t handle, uint64_t offset,
+ uint64_t size, unsigned prot);
int gem_munmap(void *ptr, uint64_t size);
--
2.23.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [igt-dev] [PATCH i-g-t v4 3/3] tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset
2019-11-26 17:25 [igt-dev] [PATCH i-g-t v4 0/3] Add GEM_MMAP_OFFSET support in IGT Zbigniew Kempczyński
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 1/3] include/drm-uapi/i915_drm: Add defs for mmap_offset Zbigniew Kempczyński
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 2/3] lib/i915/gem_mman: add mmap_offset support Zbigniew Kempczyński
@ 2019-11-26 17:25 ` Zbigniew Kempczyński
2019-11-28 12:55 ` [igt-dev] [PATCH i-g-t] " Chris Wilson
` (2 more replies)
2019-11-26 18:24 ` [igt-dev] ✓ Fi.CI.BAT: success for Add GEM_MMAP_OFFSET support in IGT. (rev4) Patchwork
` (6 subsequent siblings)
9 siblings, 3 replies; 19+ messages in thread
From: Zbigniew Kempczyński @ 2019-11-26 17:25 UTC (permalink / raw)
To: igt-dev
From: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
Few simple tests which tries to create / mmap buffer objects
using GEM_MMAP_OFFSET uAPI.
v2: change from WC -> WB (according to Chris review comment)
v3: add mmap-offset-close-race test
Signed-off-by: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Vanshidhar Konda <vanshidhar.r.konda@intel.com>
---
tests/Makefile.sources | 3 +
tests/i915/gem_mmap_offset.c | 175 +++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
3 files changed, 179 insertions(+)
create mode 100644 tests/i915/gem_mmap_offset.c
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index d86f9c26..af464aef 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -323,6 +323,9 @@ gem_mmap_SOURCES = i915/gem_mmap.c
TESTS_progs += gem_mmap_gtt
gem_mmap_gtt_SOURCES = i915/gem_mmap_gtt.c
+TESTS_progs += gem_mmap_offset
+gem_mmap_offset_SOURCES = i915/gem_mmap_offset.c
+
TESTS_progs += gem_mmap_offset_exhaustion
gem_mmap_offset_exhaustion_SOURCES = i915/gem_mmap_offset_exhaustion.c
diff --git a/tests/i915/gem_mmap_offset.c b/tests/i915/gem_mmap_offset.c
new file mode 100644
index 00000000..d11f7f22
--- /dev/null
+++ b/tests/i915/gem_mmap_offset.c
@@ -0,0 +1,175 @@
+/*
+ * Copyright © 2019 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "igt.h"
+#include <errno.h>
+#include <stdatomic.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include "drm.h"
+
+IGT_TEST_DESCRIPTION("Basic MMAP_OFFSET IOCTL tests for mem regions\n");
+
+static int mmap_offset_ioctl(int fd, struct drm_i915_gem_mmap_offset *arg)
+{
+ int err = 0;
+
+ if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_MMAP_OFFSET, arg))
+ err = -errno;
+
+ errno = 0;
+ return err;
+}
+
+static void mmap_offset_bad_object(int fd)
+{
+ uint32_t real_handle;
+ uint32_t handles[20];
+ int i = 0;
+
+ real_handle = gem_create(fd, 4096);
+
+ handles[i++] = 0xdeadbeef;
+ for (int bit = 0; bit < 16; bit++)
+ handles[i++] = real_handle | (1 << (bit + 16));
+ handles[i] = real_handle + 1;
+
+ for (; i >= 0; i--) {
+ struct drm_i915_gem_mmap_offset arg = {
+ .handle = handles[i],
+ .flags = I915_MMAP_OFFSET_WB,
+ };
+
+ igt_debug("Trying MMAP IOCTL with handle %x\n",
+ handles[i]);
+ igt_assert_eq(mmap_offset_ioctl(fd, &arg),
+ -ENOENT);
+ }
+
+ gem_close(fd, real_handle);
+}
+
+static void mmap_offset_basic(int fd)
+{
+ uint64_t flags;
+ uint32_t handle, obj_size;
+ uint8_t *expected, *buf, *addr;
+
+ obj_size = 4096;
+ handle = gem_create(fd, obj_size);
+ flags = I915_MMAP_OFFSET_WB;
+ addr = __gem_mmap_offset(fd, handle, 0, obj_size,
+ PROT_READ | PROT_WRITE,
+ flags);
+ igt_assert(addr);
+
+ igt_debug("Testing contents of newly created object.\n");
+ expected = calloc(obj_size, sizeof(*expected));
+ igt_assert_eq(memcmp(addr, expected, obj_size), 0);
+ free(expected);
+
+ igt_debug("Testing coherency of writes and mmap reads.\n");
+ buf = calloc(obj_size, sizeof(*buf));
+ memset(buf + 1024, 0x01, 1024);
+ gem_write(fd, handle, 0, buf, obj_size);
+
+ igt_debug("Testing that mapping stays after close\n");
+ gem_close(fd, handle);
+ igt_assert_eq(memcmp(buf, addr, obj_size), 0);
+ free(buf);
+
+ igt_debug("Testing unmapping\n");
+ munmap(addr, obj_size);
+}
+
+static void mmap_offset_close_race(int i915)
+{
+ const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
+ _Atomic uint32_t *handles;
+ size_t len = ALIGN((ncpus + 1) * sizeof(uint32_t), 4096);
+
+ handles = mmap64(0, len, PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
+ igt_assert(handles != MAP_FAILED);
+
+ igt_fork(child, ncpus + 1) {
+ do {
+ struct drm_i915_gem_mmap_offset mmap_arg = {};
+ const int i = 1 + random() % ncpus;
+ uint32_t old;
+
+ mmap_arg.handle = gem_create(i915, 4096);
+ mmap_arg.flags = I915_MMAP_OFFSET_WB;
+ old = atomic_exchange(&handles[i], mmap_arg.handle);
+ ioctl(i915, DRM_IOCTL_GEM_CLOSE, &old);
+
+ if (ioctl(i915,
+ DRM_IOCTL_I915_GEM_MMAP_OFFSET,
+ &mmap_arg) != -1) {
+ void *ptr;
+
+ ptr = mmap64(0, 4096,
+ PROT_WRITE, MAP_SHARED, i915,
+ mmap_arg.offset);
+ if (ptr != MAP_FAILED) {
+ *(volatile uint32_t *)ptr = 0;
+ munmap(ptr, 4096);
+ }
+ }
+
+ } while (!READ_ONCE(handles[0]));
+ }
+
+ sleep(20);
+ handles[0] = 1;
+ igt_waitchildren();
+
+ for (int i = 1; i <= ncpus; i++)
+ ioctl(i915, DRM_IOCTL_GEM_CLOSE, handles[i]);
+ munmap(handles, len);
+}
+
+igt_main
+{
+ int fd;
+
+ igt_fixture {
+ fd = drm_open_driver(DRIVER_INTEL);
+ gem_require_mmap_offset(fd);
+ }
+
+ igt_describe("Verify mapping to invalid gem objects won't be created");
+ igt_subtest_f("mmap-offset-bad-object")
+ mmap_offset_bad_object(fd);
+
+ igt_describe("Check buffer object mapping persists after gem_close");
+ igt_subtest_f("mmap-offset-basic")
+ mmap_offset_basic(fd);
+
+ igt_describe("Check race between close and mmap offset between threads");
+ igt_subtest_f("mmap-offset-close-race")
+ mmap_offset_close_race(fd);
+
+ igt_fixture {
+ close(fd);
+ }
+}
diff --git a/tests/meson.build b/tests/meson.build
index a909d271..ad55f697 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -174,6 +174,7 @@ i915_progs = [
'gem_media_vme',
'gem_mmap',
'gem_mmap_gtt',
+ 'gem_mmap_offset',
'gem_mmap_offset_exhaustion',
'gem_mmap_wc',
'gem_partial_pwrite_pread',
--
2.23.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [igt-dev] ✓ Fi.CI.BAT: success for Add GEM_MMAP_OFFSET support in IGT. (rev4)
2019-11-26 17:25 [igt-dev] [PATCH i-g-t v4 0/3] Add GEM_MMAP_OFFSET support in IGT Zbigniew Kempczyński
` (2 preceding siblings ...)
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 3/3] tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset Zbigniew Kempczyński
@ 2019-11-26 18:24 ` Patchwork
2019-11-26 18:26 ` Chris Wilson
2019-11-27 5:22 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
` (5 subsequent siblings)
9 siblings, 1 reply; 19+ messages in thread
From: Patchwork @ 2019-11-26 18:24 UTC (permalink / raw)
To: Zbigniew Kempczyński; +Cc: igt-dev
== Series Details ==
Series: Add GEM_MMAP_OFFSET support in IGT. (rev4)
URL : https://patchwork.freedesktop.org/series/69973/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_7426 -> IGTPW_3761
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/index.html
Known issues
------------
Here are the changes found in IGTPW_3761 that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@i915_selftest@live_blt:
- fi-hsw-peppy: [PASS][1] -> [DMESG-FAIL][2] ([fdo#112147])
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/fi-hsw-peppy/igt@i915_selftest@live_blt.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/fi-hsw-peppy/igt@i915_selftest@live_blt.html
* igt@kms_chamelium@dp-crc-fast:
- fi-icl-u2: [PASS][3] -> [FAIL][4] ([fdo#109635 ] / [fdo#110387])
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/fi-icl-u2/igt@kms_chamelium@dp-crc-fast.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/fi-icl-u2/igt@kms_chamelium@dp-crc-fast.html
* igt@prime_self_import@basic-with_one_bo:
- fi-icl-dsi: [PASS][5] -> [DMESG-WARN][6] ([fdo#106107])
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/fi-icl-dsi/igt@prime_self_import@basic-with_one_bo.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/fi-icl-dsi/igt@prime_self_import@basic-with_one_bo.html
#### Warnings ####
* igt@kms_cursor_legacy@basic-flip-after-cursor-legacy:
- fi-kbl-x1275: [DMESG-WARN][7] ([fdo#103558] / [fdo#105602] / [fdo#105763]) -> [DMESG-WARN][8] ([fdo#103558] / [fdo#105602]) +7 similar issues
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/fi-kbl-x1275/igt@kms_cursor_legacy@basic-flip-after-cursor-legacy.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/fi-kbl-x1275/igt@kms_cursor_legacy@basic-flip-after-cursor-legacy.html
* igt@kms_flip@basic-flip-vs-modeset:
- fi-kbl-x1275: [DMESG-WARN][9] ([fdo#103558] / [fdo#105602]) -> [DMESG-WARN][10] ([fdo#103558] / [fdo#105602] / [fdo#105763]) +5 similar issues
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/fi-kbl-x1275/igt@kms_flip@basic-flip-vs-modeset.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/fi-kbl-x1275/igt@kms_flip@basic-flip-vs-modeset.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#103558]: https://bugs.freedesktop.org/show_bug.cgi?id=103558
[fdo#105602]: https://bugs.freedesktop.org/show_bug.cgi?id=105602
[fdo#105763]: https://bugs.freedesktop.org/show_bug.cgi?id=105763
[fdo#106107]: https://bugs.freedesktop.org/show_bug.cgi?id=106107
[fdo#109635 ]: https://bugs.freedesktop.org/show_bug.cgi?id=109635
[fdo#110387]: https://bugs.freedesktop.org/show_bug.cgi?id=110387
[fdo#112147]: https://bugs.freedesktop.org/show_bug.cgi?id=112147
[fdo#112261]: https://bugs.freedesktop.org/show_bug.cgi?id=112261
Participating hosts (49 -> 44)
------------------------------
Additional (1): fi-whl-u
Missing (6): fi-ilk-m540 fi-hsw-4200u fi-bsw-cyan fi-ctg-p8600 fi-byt-clapper fi-bdw-samus
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_5310 -> IGTPW_3761
CI-20190529: 20190529
CI_DRM_7426: b204d72d3485a148456e2077683974739b675b21 @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_3761: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/index.html
IGT_5310: d1ea62b3f759f10ff6860561ba82e5c4902511d3 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
== Testlist changes ==
+igt@gem_mmap_offset@mmap-offset-bad-object
+igt@gem_mmap_offset@mmap-offset-basic
+igt@gem_mmap_offset@mmap-offset-close-race
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [igt-dev] ✓ Fi.CI.BAT: success for Add GEM_MMAP_OFFSET support in IGT. (rev4)
2019-11-26 18:24 ` [igt-dev] ✓ Fi.CI.BAT: success for Add GEM_MMAP_OFFSET support in IGT. (rev4) Patchwork
@ 2019-11-26 18:26 ` Chris Wilson
0 siblings, 0 replies; 19+ messages in thread
From: Chris Wilson @ 2019-11-26 18:26 UTC (permalink / raw)
To: Zbigniew Kempczyński, Patchwork, igt-dev
Quoting Patchwork (2019-11-26 18:24:13)
> == Series Details ==
>
> Series: Add GEM_MMAP_OFFSET support in IGT. (rev4)
> URL : https://patchwork.freedesktop.org/series/69973/
> State : success
>
> == Summary ==
>
> CI Bug Log - changes from CI_DRM_7426 -> IGTPW_3761
> ====================================================
>
> Summary
> -------
>
> **SUCCESS**
>
> No regressions found.
>
> External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/index.html
Of course it is behoven on us to reproduce the previous failures in a
testcase for posterity.
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
* [igt-dev] ✗ Fi.CI.IGT: failure for Add GEM_MMAP_OFFSET support in IGT. (rev4)
2019-11-26 17:25 [igt-dev] [PATCH i-g-t v4 0/3] Add GEM_MMAP_OFFSET support in IGT Zbigniew Kempczyński
` (3 preceding siblings ...)
2019-11-26 18:24 ` [igt-dev] ✓ Fi.CI.BAT: success for Add GEM_MMAP_OFFSET support in IGT. (rev4) Patchwork
@ 2019-11-27 5:22 ` Patchwork
2019-11-28 13:05 ` [igt-dev] ✗ GitLab.Pipeline: warning for Add GEM_MMAP_OFFSET support in IGT. (rev5) Patchwork
` (4 subsequent siblings)
9 siblings, 0 replies; 19+ messages in thread
From: Patchwork @ 2019-11-27 5:22 UTC (permalink / raw)
To: Zbigniew Kempczyński; +Cc: igt-dev
== Series Details ==
Series: Add GEM_MMAP_OFFSET support in IGT. (rev4)
URL : https://patchwork.freedesktop.org/series/69973/
State : failure
== Summary ==
CI Bug Log - changes from CI_DRM_7426_full -> IGTPW_3761_full
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with IGTPW_3761_full absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in IGTPW_3761_full, please notify your bug team to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/index.html
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in IGTPW_3761_full:
### IGT changes ###
#### Possible regressions ####
* igt@gem_ctx_persistence@rcs0-hostile-preempt:
- shard-tglb: NOTRUN -> [FAIL][1] +2 similar issues
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb8/igt@gem_ctx_persistence@rcs0-hostile-preempt.html
* igt@gem_ctx_persistence@vecs0-hostile-preempt:
- shard-iclb: NOTRUN -> [FAIL][2] +4 similar issues
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-iclb1/igt@gem_ctx_persistence@vecs0-hostile-preempt.html
* {igt@gem_mmap_offset@mmap-offset-bad-object} (NEW):
- shard-iclb: NOTRUN -> [SKIP][3] +1 similar issue
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-iclb4/igt@gem_mmap_offset@mmap-offset-bad-object.html
* {igt@gem_mmap_offset@mmap-offset-basic} (NEW):
- shard-tglb: NOTRUN -> [SKIP][4] +1 similar issue
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb5/igt@gem_mmap_offset@mmap-offset-basic.html
* igt@gem_tiled_wb:
- shard-tglb: [PASS][5] -> [FAIL][6]
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-tglb6/igt@gem_tiled_wb.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb1/igt@gem_tiled_wb.html
- shard-kbl: [PASS][7] -> [FAIL][8] +1 similar issue
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-kbl4/igt@gem_tiled_wb.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-kbl3/igt@gem_tiled_wb.html
- shard-hsw: [PASS][9] -> [FAIL][10]
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-hsw7/igt@gem_tiled_wb.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-hsw5/igt@gem_tiled_wb.html
* igt@gem_tiled_wc:
- shard-glk: [PASS][11] -> [FAIL][12] +1 similar issue
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-glk1/igt@gem_tiled_wc.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-glk1/igt@gem_tiled_wc.html
- shard-apl: [PASS][13] -> [FAIL][14] +1 similar issue
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-apl4/igt@gem_tiled_wc.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-apl1/igt@gem_tiled_wc.html
- shard-hsw: NOTRUN -> [FAIL][15]
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-hsw2/igt@gem_tiled_wc.html
- shard-snb: [PASS][16] -> [FAIL][17] +1 similar issue
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-snb5/igt@gem_tiled_wc.html
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-snb1/igt@gem_tiled_wc.html
New tests
---------
New tests have been introduced between CI_DRM_7426_full and IGTPW_3761_full:
### New IGT tests (3) ###
* igt@gem_mmap_offset@mmap-offset-bad-object:
- Statuses : 5 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@mmap-offset-basic:
- Statuses : 7 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@mmap-offset-close-race:
- Statuses : 6 skip(s)
- Exec time: [0.0] s
Known issues
------------
Here are the changes found in IGTPW_3761_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_ctx_shared@q-smoketest-blt:
- shard-tglb: [PASS][18] -> [INCOMPLETE][19] ([fdo#111735])
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-tglb7/igt@gem_ctx_shared@q-smoketest-blt.html
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb6/igt@gem_ctx_shared@q-smoketest-blt.html
* igt@gem_exec_schedule@preempt-bsd:
- shard-iclb: [PASS][20] -> [SKIP][21] ([fdo#112146]) +1 similar issue
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-iclb8/igt@gem_exec_schedule@preempt-bsd.html
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-iclb1/igt@gem_exec_schedule@preempt-bsd.html
* igt@gem_persistent_relocs@forked-interruptible-thrash-inactive:
- shard-hsw: [PASS][22] -> [FAIL][23] ([fdo#112037])
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-hsw8/igt@gem_persistent_relocs@forked-interruptible-thrash-inactive.html
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-hsw2/igt@gem_persistent_relocs@forked-interruptible-thrash-inactive.html
* igt@gem_ppgtt@flink-and-close-vma-leak:
- shard-glk: [PASS][24] -> [FAIL][25] ([fdo#112392])
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-glk3/igt@gem_ppgtt@flink-and-close-vma-leak.html
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-glk5/igt@gem_ppgtt@flink-and-close-vma-leak.html
* igt@gem_userptr_blits@sync-unmap-cycles:
- shard-snb: [PASS][26] -> [DMESG-WARN][27] ([fdo#111870]) +1 similar issue
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-snb2/igt@gem_userptr_blits@sync-unmap-cycles.html
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-snb4/igt@gem_userptr_blits@sync-unmap-cycles.html
- shard-hsw: [PASS][28] -> [DMESG-WARN][29] ([fdo#111870]) +1 similar issue
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-hsw5/igt@gem_userptr_blits@sync-unmap-cycles.html
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-hsw2/igt@gem_userptr_blits@sync-unmap-cycles.html
* igt@gem_workarounds@suspend-resume-context:
- shard-tglb: [PASS][30] -> [INCOMPLETE][31] ([fdo#111832] / [fdo#111850])
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-tglb6/igt@gem_workarounds@suspend-resume-context.html
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb3/igt@gem_workarounds@suspend-resume-context.html
* igt@kms_cursor_crc@pipe-a-cursor-256x256-sliding:
- shard-apl: [PASS][32] -> [FAIL][33] ([fdo#103232])
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-apl6/igt@kms_cursor_crc@pipe-a-cursor-256x256-sliding.html
[33]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-apl4/igt@kms_cursor_crc@pipe-a-cursor-256x256-sliding.html
- shard-kbl: [PASS][34] -> [FAIL][35] ([fdo#103232])
[34]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-kbl7/igt@kms_cursor_crc@pipe-a-cursor-256x256-sliding.html
[35]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-kbl1/igt@kms_cursor_crc@pipe-a-cursor-256x256-sliding.html
* igt@kms_flip@flip-vs-suspend-interruptible:
- shard-tglb: [PASS][36] -> [INCOMPLETE][37] ([fdo#111832] / [fdo#111850] / [fdo#112031])
[36]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-tglb6/igt@kms_flip@flip-vs-suspend-interruptible.html
[37]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb5/igt@kms_flip@flip-vs-suspend-interruptible.html
* igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-blt:
- shard-glk: [PASS][38] -> [FAIL][39] ([fdo#103167])
[38]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-glk2/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-blt.html
[39]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-glk2/igt@kms_frontbuffer_tracking@fbc-2p-scndscrn-cur-indfb-draw-blt.html
* igt@kms_frontbuffer_tracking@fbc-rgb565-draw-mmap-cpu:
- shard-tglb: [PASS][40] -> [FAIL][41] ([fdo#103167]) +1 similar issue
[40]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-tglb3/igt@kms_frontbuffer_tracking@fbc-rgb565-draw-mmap-cpu.html
[41]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb4/igt@kms_frontbuffer_tracking@fbc-rgb565-draw-mmap-cpu.html
* igt@kms_frontbuffer_tracking@fbc-suspend:
- shard-kbl: [PASS][42] -> [DMESG-WARN][43] ([fdo#108566]) +5 similar issues
[42]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-kbl3/igt@kms_frontbuffer_tracking@fbc-suspend.html
[43]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-kbl7/igt@kms_frontbuffer_tracking@fbc-suspend.html
* igt@kms_frontbuffer_tracking@fbcpsr-suspend:
- shard-tglb: [PASS][44] -> [INCOMPLETE][45] ([fdo#111832] / [fdo#111850] / [fdo#111884])
[44]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-tglb6/igt@kms_frontbuffer_tracking@fbcpsr-suspend.html
[45]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb3/igt@kms_frontbuffer_tracking@fbcpsr-suspend.html
* igt@kms_plane@pixel-format-pipe-a-planes-source-clamping:
- shard-kbl: [PASS][46] -> [INCOMPLETE][47] ([fdo#103665])
[46]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-kbl2/igt@kms_plane@pixel-format-pipe-a-planes-source-clamping.html
[47]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-kbl4/igt@kms_plane@pixel-format-pipe-a-planes-source-clamping.html
* igt@kms_plane@plane-panning-bottom-right-suspend-pipe-a-planes:
- shard-apl: [PASS][48] -> [DMESG-WARN][49] ([fdo#108566]) +1 similar issue
[48]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-apl7/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-a-planes.html
[49]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-apl6/igt@kms_plane@plane-panning-bottom-right-suspend-pipe-a-planes.html
#### Possible fixes ####
* igt@drm_import_export@import-close-race-prime:
- shard-hsw: [INCOMPLETE][50] ([fdo#103540]) -> [PASS][51]
[50]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-hsw2/igt@drm_import_export@import-close-race-prime.html
[51]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-hsw8/igt@drm_import_export@import-close-race-prime.html
* igt@gem_ctx_isolation@vcs1-s3:
- shard-tglb: [INCOMPLETE][52] ([fdo#111832]) -> [PASS][53]
[52]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-tglb5/igt@gem_ctx_isolation@vcs1-s3.html
[53]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb6/igt@gem_ctx_isolation@vcs1-s3.html
* igt@gem_ctx_persistence@smoketest:
- shard-glk: [TIMEOUT][54] -> [PASS][55]
[54]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-glk7/igt@gem_ctx_persistence@smoketest.html
[55]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-glk5/igt@gem_ctx_persistence@smoketest.html
* igt@gem_ctx_switch@vcs1-heavy-queue:
- shard-iclb: [SKIP][56] ([fdo#112080]) -> [PASS][57] +1 similar issue
[56]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-iclb8/igt@gem_ctx_switch@vcs1-heavy-queue.html
[57]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-iclb4/igt@gem_ctx_switch@vcs1-heavy-queue.html
* igt@gem_eio@in-flight-suspend:
- shard-tglb: [INCOMPLETE][58] ([fdo#111832] / [fdo#111850] / [fdo#112081]) -> [PASS][59]
[58]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-tglb2/igt@gem_eio@in-flight-suspend.html
[59]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb1/igt@gem_eio@in-flight-suspend.html
* igt@gem_exec_schedule@preempt-queue-bsd2:
- shard-iclb: [SKIP][60] ([fdo#109276]) -> [PASS][61] +4 similar issues
[60]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-iclb3/igt@gem_exec_schedule@preempt-queue-bsd2.html
[61]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-iclb4/igt@gem_exec_schedule@preempt-queue-bsd2.html
* igt@gem_persistent_relocs@forked-interruptible-faulting-reloc-thrash-inactive:
- shard-hsw: [TIMEOUT][62] ([fdo#112068 ]) -> [PASS][63]
[62]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-hsw2/igt@gem_persistent_relocs@forked-interruptible-faulting-reloc-thrash-inactive.html
[63]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-hsw6/igt@gem_persistent_relocs@forked-interruptible-faulting-reloc-thrash-inactive.html
* igt@gem_ppgtt@flink-and-close-vma-leak:
- shard-kbl: [FAIL][64] ([fdo#112392]) -> [PASS][65]
[64]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-kbl4/igt@gem_ppgtt@flink-and-close-vma-leak.html
[65]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-kbl3/igt@gem_ppgtt@flink-and-close-vma-leak.html
* igt@gem_userptr_blits@map-fixed-invalidate-busy-gup:
- shard-snb: [DMESG-WARN][66] ([fdo#111870]) -> [PASS][67] +3 similar issues
[66]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-snb4/igt@gem_userptr_blits@map-fixed-invalidate-busy-gup.html
[67]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-snb4/igt@gem_userptr_blits@map-fixed-invalidate-busy-gup.html
* igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy:
- shard-hsw: [DMESG-WARN][68] ([fdo#111870]) -> [PASS][69] +3 similar issues
[68]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-hsw4/igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy.html
[69]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-hsw2/igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy.html
* igt@kms_cursor_crc@pipe-c-cursor-128x128-onscreen:
- shard-kbl: [FAIL][70] ([fdo#103232]) -> [PASS][71] +1 similar issue
[70]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-kbl1/igt@kms_cursor_crc@pipe-c-cursor-128x128-onscreen.html
[71]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-kbl4/igt@kms_cursor_crc@pipe-c-cursor-128x128-onscreen.html
- shard-apl: [FAIL][72] ([fdo#103232]) -> [PASS][73] +1 similar issue
[72]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-apl1/igt@kms_cursor_crc@pipe-c-cursor-128x128-onscreen.html
[73]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-apl6/igt@kms_cursor_crc@pipe-c-cursor-128x128-onscreen.html
- shard-glk: [FAIL][74] ([fdo#103232]) -> [PASS][75]
[74]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-glk4/igt@kms_cursor_crc@pipe-c-cursor-128x128-onscreen.html
[75]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-glk5/igt@kms_cursor_crc@pipe-c-cursor-128x128-onscreen.html
* igt@kms_cursor_legacy@cursor-vs-flip-varying-size:
- shard-hsw: [FAIL][76] ([fdo#103355]) -> [PASS][77]
[76]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-hsw5/igt@kms_cursor_legacy@cursor-vs-flip-varying-size.html
[77]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-hsw7/igt@kms_cursor_legacy@cursor-vs-flip-varying-size.html
* igt@kms_flip@flip-vs-suspend-interruptible:
- shard-apl: [DMESG-WARN][78] ([fdo#108566]) -> [PASS][79] +1 similar issue
[78]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-apl4/igt@kms_flip@flip-vs-suspend-interruptible.html
[79]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-apl2/igt@kms_flip@flip-vs-suspend-interruptible.html
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite:
- shard-tglb: [INCOMPLETE][80] ([fdo#111884]) -> [PASS][81]
[80]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-tglb4/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite.html
[81]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-pwrite.html
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-msflip-blt:
- shard-tglb: [FAIL][82] ([fdo#103167]) -> [PASS][83] +1 similar issue
[82]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-tglb3/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-msflip-blt.html
[83]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb6/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-indfb-msflip-blt.html
* igt@kms_frontbuffer_tracking@fbc-indfb-scaledprimary:
- shard-kbl: [INCOMPLETE][84] ([fdo#103665]) -> [PASS][85] +1 similar issue
[84]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-kbl7/igt@kms_frontbuffer_tracking@fbc-indfb-scaledprimary.html
[85]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-kbl1/igt@kms_frontbuffer_tracking@fbc-indfb-scaledprimary.html
* igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-pwrite:
- shard-iclb: [FAIL][86] ([fdo#103167]) -> [PASS][87] +1 similar issue
[86]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-iclb8/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-pwrite.html
[87]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-iclb1/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-indfb-draw-pwrite.html
* igt@kms_setmode@basic:
- shard-kbl: [FAIL][88] ([fdo#99912]) -> [PASS][89]
[88]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-kbl2/igt@kms_setmode@basic.html
[89]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-kbl7/igt@kms_setmode@basic.html
* igt@kms_vblank@pipe-a-ts-continuation-suspend:
- shard-kbl: [DMESG-WARN][90] ([fdo#108566]) -> [PASS][91] +8 similar issues
[90]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-kbl4/igt@kms_vblank@pipe-a-ts-continuation-suspend.html
[91]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-kbl3/igt@kms_vblank@pipe-a-ts-continuation-suspend.html
#### Warnings ####
* igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-move:
- shard-tglb: [INCOMPLETE][92] ([fdo#111884]) -> [FAIL][93] ([fdo#103167])
[92]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7426/shard-tglb3/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-move.html
[93]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/shard-tglb1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-spr-indfb-move.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#103167]: https://bugs.freedesktop.org/show_bug.cgi?id=103167
[fdo#103232]: https://bugs.freedesktop.org/show_bug.cgi?id=103232
[fdo#103355]: https://bugs.freedesktop.org/show_bug.cgi?id=103355
[fdo#103540]: https://bugs.freedesktop.org/show_bug.cgi?id=103540
[fdo#103665]: https://bugs.freedesktop.org/show_bug.cgi?id=103665
[fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
[fdo#109276]: https://bugs.freedesktop.org/show_bug.cgi?id=109276
[fdo#111735]: https://bugs.freedesktop.org/show_bug.cgi?id=111735
[fdo#111832]: https://bugs.freedesktop.org/show_bug.cgi?id=111832
[fdo#111850]: https://bugs.freedesktop.org/show_bug.cgi?id=111850
[fdo#111870]: https://bugs.freedesktop.org/show_bug.cgi?id=111870
[fdo#111884]: https://bugs.freedesktop.org/show_bug.cgi?id=111884
[fdo#112031]: https://bugs.freedesktop.org/show_bug.cgi?id=112031
[fdo#112037]: https://bugs.freedesktop.org/show_bug.cgi?id=112037
[fdo#112068 ]: https://bugs.freedesktop.org/show_bug.cgi?id=112068
[fdo#112080]: https://bugs.freedesktop.org/show_bug.cgi?id=112080
[fdo#112081]: https://bugs.freedesktop.org/show_bug.cgi?id=112081
[fdo#112146]: https://bugs.freedesktop.org/show_bug.cgi?id=112146
[fdo#112271]: https://bugs.freedesktop.org/show_bug.cgi?id=112271
[fdo#112392]: https://bugs.freedesktop.org/show_bug.cgi?id=112392
[fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3761/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
* [igt-dev] [PATCH i-g-t] tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 3/3] tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset Zbigniew Kempczyński
@ 2019-11-28 12:55 ` Chris Wilson
2019-11-28 12:59 ` Chris Wilson
2019-11-28 13:38 ` Petri Latvala
2019-11-28 13:05 ` Chris Wilson
2019-11-28 13:10 ` Chris Wilson
2 siblings, 2 replies; 19+ messages in thread
From: Chris Wilson @ 2019-11-28 12:55 UTC (permalink / raw)
To: intel-gfx; +Cc: igt-dev
From: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
Few simple tests which tries to create / mmap buffer objects
using GEM_MMAP_OFFSET uAPI.
v2: change from WC -> WB (according to Chris review comment)
v3: add mmap-offset-close-race test
Signed-off-by: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Vanshidhar Konda <vanshidhar.r.konda@intel.com>
---
Required (look to gem_mmap_(gtt,wc,cpu) for ideas):
size - check we can handle objects beyond a reasonable limit (note the
kernel fails at beyond RAM)
forked - interactions with pagefault + new mmap_offsets across
threads/processes
suspend - check speed is consistent before/after suspend
coherency - combinatorial checker between all pointer types, prw and gpu
---
tests/Makefile.sources | 3 +
tests/i915/gem_mmap_offset.c | 416 +++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
3 files changed, 420 insertions(+)
create mode 100644 tests/i915/gem_mmap_offset.c
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index a211851cf..ddbc69bc8 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -325,6 +325,9 @@ gem_mmap_SOURCES = i915/gem_mmap.c
TESTS_progs += gem_mmap_gtt
gem_mmap_gtt_SOURCES = i915/gem_mmap_gtt.c
+TESTS_progs += gem_mmap_offset
+gem_mmap_offset_SOURCES = i915/gem_mmap_offset.c
+
TESTS_progs += gem_mmap_offset_exhaustion
gem_mmap_offset_exhaustion_SOURCES = i915/gem_mmap_offset_exhaustion.c
diff --git a/tests/i915/gem_mmap_offset.c b/tests/i915/gem_mmap_offset.c
new file mode 100644
index 000000000..e75c3fd17
--- /dev/null
+++ b/tests/i915/gem_mmap_offset.c
@@ -0,0 +1,416 @@
+/*
+ * Copyright © 2019 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include <errno.h>
+#include <pthread.h>
+#include <stdatomic.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include "drm.h"
+
+#include "igt.h"
+#include "igt_x86.h"
+
+IGT_TEST_DESCRIPTION("Basic MMAP_OFFSET IOCTL tests for mem regions\n");
+
+static const struct mmap_offset {
+ const char *name;
+ unsigned int type;
+ unsigned int domain;
+} mmap_offset_types[] = {
+ { "gtt", I915_MMAP_OFFSET_GTT, I915_GEM_DOMAIN_GTT },
+ { "wb", I915_MMAP_OFFSET_WB, I915_GEM_DOMAIN_CPU },
+ { "wc", I915_MMAP_OFFSET_WC, I915_GEM_DOMAIN_WC },
+ { "uc", I915_MMAP_OFFSET_UC, I915_GEM_DOMAIN_WC },
+ {},
+};
+
+#define for_each_mmap_offset_type(__t) \
+ for (const struct mmap_offset *__t = mmap_offset_types; \
+ (__t)->name; \
+ (__t)++)
+
+static int mmap_offset_ioctl(int i915, struct drm_i915_gem_mmap_offset *arg)
+{
+ int err = 0;
+
+ if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_MMAP_OFFSET, arg)) {
+ err = -errno;
+ igt_assume(err);
+ }
+
+ errno = 0;
+ return err;
+}
+
+static void bad_object(int i915)
+{
+ uint32_t real_handle;
+ uint32_t handles[20];
+ int i = 0;
+
+ real_handle = gem_create(i915, 4096);
+
+ handles[i++] = 0xdeadbeef;
+ for (int bit = 0; bit < 16; bit++)
+ handles[i++] = real_handle | (1 << (bit + 16));
+ handles[i] = real_handle + 1;
+
+ for (; i >= 0; i--) {
+ struct drm_i915_gem_mmap_offset arg = {
+ .handle = handles[i],
+ .flags = I915_MMAP_OFFSET_WB,
+ };
+
+ igt_debug("Trying MMAP IOCTL with handle %x\n",
+ handles[i]);
+ igt_assert_eq(mmap_offset_ioctl(i915, &arg),
+ -ENOENT);
+ }
+
+ gem_close(i915, real_handle);
+}
+
+static void bad_flags(int i915)
+{
+ struct drm_i915_gem_mmap_offset arg = {
+ .handle = gem_create(i915, 4096),
+ .flags = -1ull,
+ };
+
+ igt_assert_eq(mmap_offset_ioctl(i915, &arg), -EINVAL);
+ gem_close(i915, arg.handle);
+}
+
+static void basic_uaf(int i915)
+{
+ const uint32_t obj_size = 4096;
+
+ for_each_mmap_offset_type(t) {
+ uint32_t handle = gem_create(i915, obj_size);
+ uint8_t *expected, *buf, *addr;
+
+ addr = __gem_mmap_offset(i915, handle, 0, obj_size,
+ PROT_READ | PROT_WRITE,
+ t->type);
+ if (!addr) {
+ gem_close(i915, handle);
+ continue;
+ }
+
+ expected = calloc(obj_size, sizeof(*expected));
+ gem_set_domain(i915, handle, t->domain, 0);
+ igt_assert_f(memcmp(addr, expected, obj_size) == 0,
+ "mmap(%s) not clear on gem_create()\n",
+ t->name);
+ free(expected);
+
+ buf = calloc(obj_size, sizeof(*buf));
+ memset(buf + 1024, 0x01, 1024);
+ gem_write(i915, handle, 0, buf, obj_size);
+ gem_set_domain(i915, handle, t->domain, 0);
+ igt_assert_f(memcmp(buf, addr, obj_size) == 0,
+ "mmap(%s) not coherent with gem_write()\n",
+ t->name);
+
+ gem_set_domain(i915, handle, t->domain, t->domain);
+ memset(addr + 2048, 0xff, 1024);
+ gem_read(i915, handle, 0, buf, obj_size);
+ gem_set_domain(i915, handle, t->domain, 0);
+ igt_assert_f(memcmp(buf, addr, obj_size) == 0,
+ "mmap(%s) not coherent with gem_read()\n",
+ t->name);
+
+ gem_close(i915, handle);
+ igt_assert_f(memcmp(buf, addr, obj_size) == 0,
+ "mmap(%s) not resident after gem_close()\n",
+ t->name);
+ free(buf);
+
+ igt_debug("Testing unmapping\n");
+ munmap(addr, obj_size);
+ }
+}
+
+static void isolation(int i915)
+{
+ for_each_mmap_offset_type(t) {
+ struct drm_i915_gem_mmap_offset mmap_arg = {
+ .flags = t->type
+ };
+ int A = gem_reopen_driver(i915);
+ int B = gem_reopen_driver(i915);
+ uint64_t offset_a, offset_b;
+ uint32_t a, b;
+ void *ptr;
+
+ a = gem_create(A, 4096);
+ b = gem_open(B, gem_flink(A, a));
+
+ mmap_arg.handle = a;
+ igt_assert_eq(mmap_offset_ioctl(i915, &mmap_arg), 0);
+ offset_a = mmap_arg.offset;
+
+ mmap_arg.handle = b;
+ igt_assert_eq(mmap_offset_ioctl(i915, &mmap_arg), 0);
+ offset_b = mmap_arg.offset;
+
+ igt_info("A[%s]: {fd:%d, handle:%d, offset:%"PRIx64"}\n",
+ t->name, A, a, offset_a);
+ igt_info("B[%s]: {fd:%d, handle:%d, offset:%"PRIx64"}\n",
+ t->name, B, b, offset_b);
+
+ close(B);
+
+ ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_a);
+ igt_assert(ptr != MAP_FAILED);
+ munmap(ptr, 4096);
+
+ close(A);
+
+ ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_a);
+ igt_assert(ptr == MAP_FAILED);
+ }
+}
+
+static void pf_nonblock(int i915)
+{
+ igt_spin_t *spin = igt_spin_new(i915);
+
+ for_each_mmap_offset_type(t) {
+ uint32_t *ptr;
+
+ ptr = __gem_mmap_offset(i915, spin->handle, 0, 4096,
+ PROT_READ | PROT_WRITE,
+ t->type);
+ if (!ptr)
+ continue;
+
+ igt_set_timeout(1, t->name);
+ /* no set-domain as we want to verify the pagefault is async */
+ ptr[256] = 0;
+ igt_reset_timeout();
+
+ munmap(ptr, 4096);
+ }
+
+ igt_spin_free(i915, spin);
+}
+
+static void close_race(int i915, int timeout)
+{
+ const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
+ _Atomic uint32_t *handles;
+ size_t len = ALIGN((ncpus + 1) * sizeof(uint32_t), 4096);
+
+ handles = mmap64(0, len, PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
+ igt_assert(handles != MAP_FAILED);
+
+ igt_fork(child, ncpus + 1) {
+ do {
+ struct drm_i915_gem_mmap_offset mmap_arg = {};
+ const int i = 1 + random() % ncpus;
+ uint32_t old;
+
+ mmap_arg.handle = gem_create(i915, 4096);
+ mmap_arg.flags = I915_MMAP_OFFSET_WB;
+ old = atomic_exchange(&handles[i], mmap_arg.handle);
+ ioctl(i915, DRM_IOCTL_GEM_CLOSE, &old);
+
+ if (ioctl(i915,
+ DRM_IOCTL_I915_GEM_MMAP_OFFSET,
+ &mmap_arg) != -1) {
+ void *ptr;
+
+ ptr = mmap64(0, 4096,
+ PROT_WRITE, MAP_SHARED, i915,
+ mmap_arg.offset);
+ if (ptr != MAP_FAILED) {
+ *(volatile uint32_t *)ptr = 0;
+ munmap(ptr, 4096);
+ }
+ }
+
+ } while (!READ_ONCE(handles[0]));
+ }
+
+ sleep(timeout);
+ handles[0] = 1;
+ igt_waitchildren();
+
+ for (int i = 1; i <= ncpus; i++)
+ ioctl(i915, DRM_IOCTL_GEM_CLOSE, handles[i]);
+ munmap(handles, len);
+}
+
+static uint64_t atomic_compare_swap_u64(_Atomic(uint64_t) *ptr,
+ uint64_t oldval, uint64_t newval)
+{
+ atomic_compare_exchange_strong(ptr, &oldval, newval);
+ return oldval;
+}
+
+static uint64_t get_npages(_Atomic(uint64_t) *global, uint64_t npages)
+{
+ uint64_t try, old, max;
+
+ max = *global;
+ do {
+ old = max;
+ try = 1 + npages % (max / 2);
+ max -= try;
+ } while ((max = atomic_compare_swap_u64(global, old, max)) != old);
+
+ return try;
+}
+
+struct thread_clear {
+ _Atomic(uint64_t) max;
+ int timeout;
+ int i915;
+};
+
+static int create_ioctl(int i915, struct drm_i915_gem_create *create)
+{
+ int err = 0;
+
+ if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_CREATE, create)) {
+ err = -errno;
+ igt_assume(err != 0);
+ }
+
+ errno = 0;
+ return err;
+}
+
+static void *thread_clear(void *data)
+{
+ struct thread_clear *arg = data;
+ const struct mmap_offset *t;
+ unsigned long checked = 0;
+ int i915 = arg->i915;
+
+ t = mmap_offset_types;
+ igt_until_timeout(arg->timeout) {
+ struct drm_i915_gem_create create = {};
+ uint64_t npages;
+ void *ptr;
+
+ npages = random();
+ npages <<= 32;
+ npages |= random();
+ npages = get_npages(&arg->max, npages);
+ create.size = npages << 12;
+
+ create_ioctl(i915, &create);
+ ptr = __gem_mmap_offset(i915, create.handle, 0, create.size,
+ PROT_READ | PROT_WRITE,
+ t->type);
+ /* No set-domains as we are being as naughty as possible */
+ for (uint64_t page = 0; ptr && page < npages; page++) {
+ uint64_t x[8] = {
+ page * 4096 +
+ sizeof(x) * ((page % (4096 - sizeof(x)) / sizeof(x)))
+ };
+
+ if (page & 1)
+ igt_memcpy_from_wc(x, ptr + x[0], sizeof(x));
+ else
+ memcpy(x, ptr + x[0], sizeof(x));
+
+ for (int i = 0; i < ARRAY_SIZE(x); i++)
+ igt_assert_eq_u64(x[i], 0);
+ }
+ if (ptr)
+ munmap(ptr, create.size);
+ gem_close(i915, create.handle);
+ checked += npages;
+
+ atomic_fetch_add(&arg->max, npages);
+
+ if (!(++t)->name)
+ t = mmap_offset_types;
+ }
+
+ return (void *)(uintptr_t)checked;
+}
+
+static void always_clear(int i915, int timeout)
+{
+ struct thread_clear arg = {
+ .i915 = i915,
+ .timeout = timeout,
+ .max = intel_get_avail_ram_mb() << (20 - 12), /* in pages */
+ };
+ const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
+ unsigned long checked;
+ pthread_t thread[ncpus];
+ void *result;
+
+ for (int i = 0; i < ncpus; i++)
+ pthread_create(&thread[i], NULL, thread_clear, &arg);
+
+ checked = 0;
+ for (int i = 0; i < ncpus; i++) {
+ pthread_join(thread[i], &result);
+ checked += (uintptr_t)result;
+ }
+ igt_info("Checked %'lu page allocations\n", checked);
+}
+
+
+igt_main
+{
+ int i915;
+
+ igt_fixture {
+ i915 = drm_open_driver(DRIVER_INTEL);
+ gem_require_mmap_offset(i915);
+ }
+
+ igt_describe("Verify mapping to invalid gem objects won't be created");
+ igt_subtest_f("bad-object")
+ bad_object(i915);
+ igt_subtest_f("bad-flags")
+ bad_flags(i915);
+
+ igt_describe("Check buffer object mapping persists after gem_close");
+ igt_subtest_f("basic-uaf")
+ basic_uaf(i915);
+
+ igt_subtest_f("isolation")
+ isolation(i915);
+ igt_subtest_f("pf-nonblock")
+ pf_nonblock(i915);
+
+ igt_describe("Check race between close and mmap offset between threads");
+ igt_subtest_f("close-race")
+ close_race(i915, 20);
+
+ igt_subtest_f("clear")
+ always_clear(i915, 20);
+
+ igt_fixture {
+ close(i915);
+ }
+}
diff --git a/tests/meson.build b/tests/meson.build
index 18788d44b..05dea1f4e 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -174,6 +174,7 @@ i915_progs = [
'gem_media_vme',
'gem_mmap',
'gem_mmap_gtt',
+ 'gem_mmap_offset',
'gem_mmap_offset_exhaustion',
'gem_mmap_wc',
'gem_partial_pwrite_pread',
--
2.24.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 19+ messages in thread
* Re: [igt-dev] [PATCH i-g-t] tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset
2019-11-28 12:55 ` [igt-dev] [PATCH i-g-t] " Chris Wilson
@ 2019-11-28 12:59 ` Chris Wilson
2019-11-28 13:38 ` Petri Latvala
1 sibling, 0 replies; 19+ messages in thread
From: Chris Wilson @ 2019-11-28 12:59 UTC (permalink / raw)
To: intel-gfx; +Cc: igt-dev
Quoting Chris Wilson (2019-11-28 12:55:02)
> +static void isolation(int i915)
> +{
> + for_each_mmap_offset_type(t) {
> + struct drm_i915_gem_mmap_offset mmap_arg = {
> + .flags = t->type
> + };
> + int A = gem_reopen_driver(i915);
> + int B = gem_reopen_driver(i915);
> + uint64_t offset_a, offset_b;
> + uint32_t a, b;
> + void *ptr;
> +
> + a = gem_create(A, 4096);
> + b = gem_open(B, gem_flink(A, a));
> +
> + mmap_arg.handle = a;
> + igt_assert_eq(mmap_offset_ioctl(i915, &mmap_arg), 0);
First ioctl should skip if type is not supported.
> + offset_a = mmap_arg.offset;
> +
> + mmap_arg.handle = b;
> + igt_assert_eq(mmap_offset_ioctl(i915, &mmap_arg), 0);
Then second must succeed.
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
* [igt-dev] [PATCH i-g-t] tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 3/3] tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset Zbigniew Kempczyński
2019-11-28 12:55 ` [igt-dev] [PATCH i-g-t] " Chris Wilson
@ 2019-11-28 13:05 ` Chris Wilson
2019-11-28 13:10 ` Chris Wilson
2 siblings, 0 replies; 19+ messages in thread
From: Chris Wilson @ 2019-11-28 13:05 UTC (permalink / raw)
To: intel-gfx; +Cc: igt-dev
From: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
Few simple tests which tries to create / mmap buffer objects
using GEM_MMAP_OFFSET uAPI.
v2: change from WC -> WB (according to Chris review comment)
v3: add mmap-offset-close-race test
Signed-off-by: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Vanshidhar Konda <vanshidhar.r.konda@intel.com>
---
Required (look to gem_mmap_(gtt,wc,cpu) for ideas):
size - check we can handle objects beyond a reasonable limit (note the
kernel fails at beyond RAM)
forked - interactions with pagefault + new mmap_offsets across
threads/processes
suspend - check speed is consistent before/after suspend
coherency - combinatorial checker between all pointer types, prw and gpu
---
tests/Makefile.sources | 3 +
tests/i915/gem_mmap_offset.c | 420 +++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
3 files changed, 424 insertions(+)
create mode 100644 tests/i915/gem_mmap_offset.c
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index a211851cf..ddbc69bc8 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -325,6 +325,9 @@ gem_mmap_SOURCES = i915/gem_mmap.c
TESTS_progs += gem_mmap_gtt
gem_mmap_gtt_SOURCES = i915/gem_mmap_gtt.c
+TESTS_progs += gem_mmap_offset
+gem_mmap_offset_SOURCES = i915/gem_mmap_offset.c
+
TESTS_progs += gem_mmap_offset_exhaustion
gem_mmap_offset_exhaustion_SOURCES = i915/gem_mmap_offset_exhaustion.c
diff --git a/tests/i915/gem_mmap_offset.c b/tests/i915/gem_mmap_offset.c
new file mode 100644
index 000000000..f0ffc3cd9
--- /dev/null
+++ b/tests/i915/gem_mmap_offset.c
@@ -0,0 +1,420 @@
+/*
+ * Copyright © 2019 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include <errno.h>
+#include <pthread.h>
+#include <stdatomic.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include "drm.h"
+
+#include "igt.h"
+#include "igt_x86.h"
+
+IGT_TEST_DESCRIPTION("Basic MMAP_OFFSET IOCTL tests for mem regions\n");
+
+static const struct mmap_offset {
+ const char *name;
+ unsigned int type;
+ unsigned int domain;
+} mmap_offset_types[] = {
+ { "gtt", I915_MMAP_OFFSET_GTT, I915_GEM_DOMAIN_GTT },
+ { "wb", I915_MMAP_OFFSET_WB, I915_GEM_DOMAIN_CPU },
+ { "wc", I915_MMAP_OFFSET_WC, I915_GEM_DOMAIN_WC },
+ { "uc", I915_MMAP_OFFSET_UC, I915_GEM_DOMAIN_WC },
+ {},
+};
+
+#define for_each_mmap_offset_type(__t) \
+ for (const struct mmap_offset *__t = mmap_offset_types; \
+ (__t)->name; \
+ (__t)++)
+
+static int mmap_offset_ioctl(int i915, struct drm_i915_gem_mmap_offset *arg)
+{
+ int err = 0;
+
+ if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_MMAP_OFFSET, arg)) {
+ err = -errno;
+ igt_assume(err);
+ }
+
+ errno = 0;
+ return err;
+}
+
+static void bad_object(int i915)
+{
+ uint32_t real_handle;
+ uint32_t handles[20];
+ int i = 0;
+
+ real_handle = gem_create(i915, 4096);
+
+ handles[i++] = 0xdeadbeef;
+ for (int bit = 0; bit < 16; bit++)
+ handles[i++] = real_handle | (1 << (bit + 16));
+ handles[i] = real_handle + 1;
+
+ for (; i >= 0; i--) {
+ struct drm_i915_gem_mmap_offset arg = {
+ .handle = handles[i],
+ .flags = I915_MMAP_OFFSET_WB,
+ };
+
+ igt_debug("Trying MMAP IOCTL with handle %x\n",
+ handles[i]);
+ igt_assert_eq(mmap_offset_ioctl(i915, &arg),
+ -ENOENT);
+ }
+
+ gem_close(i915, real_handle);
+}
+
+static void bad_flags(int i915)
+{
+ struct drm_i915_gem_mmap_offset arg = {
+ .handle = gem_create(i915, 4096),
+ .flags = -1ull,
+ };
+
+ igt_assert_eq(mmap_offset_ioctl(i915, &arg), -EINVAL);
+ gem_close(i915, arg.handle);
+}
+
+static void basic_uaf(int i915)
+{
+ const uint32_t obj_size = 4096;
+
+ for_each_mmap_offset_type(t) {
+ uint32_t handle = gem_create(i915, obj_size);
+ uint8_t *expected, *buf, *addr;
+
+ addr = __gem_mmap_offset(i915, handle, 0, obj_size,
+ PROT_READ | PROT_WRITE,
+ t->type);
+ if (!addr) {
+ gem_close(i915, handle);
+ continue;
+ }
+
+ expected = calloc(obj_size, sizeof(*expected));
+ gem_set_domain(i915, handle, t->domain, 0);
+ igt_assert_f(memcmp(addr, expected, obj_size) == 0,
+ "mmap(%s) not clear on gem_create()\n",
+ t->name);
+ free(expected);
+
+ buf = calloc(obj_size, sizeof(*buf));
+ memset(buf + 1024, 0x01, 1024);
+ gem_write(i915, handle, 0, buf, obj_size);
+ gem_set_domain(i915, handle, t->domain, 0);
+ igt_assert_f(memcmp(buf, addr, obj_size) == 0,
+ "mmap(%s) not coherent with gem_write()\n",
+ t->name);
+
+ gem_set_domain(i915, handle, t->domain, t->domain);
+ memset(addr + 2048, 0xff, 1024);
+ gem_read(i915, handle, 0, buf, obj_size);
+ gem_set_domain(i915, handle, t->domain, 0);
+ igt_assert_f(memcmp(buf, addr, obj_size) == 0,
+ "mmap(%s) not coherent with gem_read()\n",
+ t->name);
+
+ gem_close(i915, handle);
+ igt_assert_f(memcmp(buf, addr, obj_size) == 0,
+ "mmap(%s) not resident after gem_close()\n",
+ t->name);
+ free(buf);
+
+ igt_debug("Testing unmapping\n");
+ munmap(addr, obj_size);
+ }
+}
+
+static void isolation(int i915)
+{
+ for_each_mmap_offset_type(t) {
+ struct drm_i915_gem_mmap_offset mmap_arg = {
+ .flags = t->type
+ };
+ int A = gem_reopen_driver(i915);
+ int B = gem_reopen_driver(i915);
+ uint64_t offset_a, offset_b;
+ uint32_t a, b;
+ void *ptr;
+
+ a = gem_create(A, 4096);
+ b = gem_open(B, gem_flink(A, a));
+
+ mmap_arg.handle = a;
+ if (mmap_offset_ioctl(i915, &mmap_arg)) {
+ close(A);
+ close(B);
+ continue;
+ }
+ offset_a = mmap_arg.offset;
+
+ mmap_arg.handle = b;
+ igt_assert_eq(mmap_offset_ioctl(i915, &mmap_arg), 0);
+ offset_b = mmap_arg.offset;
+
+ igt_info("A[%s]: {fd:%d, handle:%d, offset:%"PRIx64"}\n",
+ t->name, A, a, offset_a);
+ igt_info("B[%s]: {fd:%d, handle:%d, offset:%"PRIx64"}\n",
+ t->name, B, b, offset_b);
+
+ close(B);
+
+ ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_a);
+ igt_assert(ptr != MAP_FAILED);
+ munmap(ptr, 4096);
+
+ close(A);
+
+ ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_a);
+ igt_assert(ptr == MAP_FAILED);
+ }
+}
+
+static void pf_nonblock(int i915)
+{
+ igt_spin_t *spin = igt_spin_new(i915);
+
+ for_each_mmap_offset_type(t) {
+ uint32_t *ptr;
+
+ ptr = __gem_mmap_offset(i915, spin->handle, 0, 4096,
+ PROT_READ | PROT_WRITE,
+ t->type);
+ if (!ptr)
+ continue;
+
+ igt_set_timeout(1, t->name);
+ /* no set-domain as we want to verify the pagefault is async */
+ ptr[256] = 0;
+ igt_reset_timeout();
+
+ munmap(ptr, 4096);
+ }
+
+ igt_spin_free(i915, spin);
+}
+
+static void close_race(int i915, int timeout)
+{
+ const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
+ _Atomic uint32_t *handles;
+ size_t len = ALIGN((ncpus + 1) * sizeof(uint32_t), 4096);
+
+ handles = mmap64(0, len, PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
+ igt_assert(handles != MAP_FAILED);
+
+ igt_fork(child, ncpus + 1) {
+ do {
+ struct drm_i915_gem_mmap_offset mmap_arg = {};
+ const int i = 1 + random() % ncpus;
+ uint32_t old;
+
+ mmap_arg.handle = gem_create(i915, 4096);
+ mmap_arg.flags = I915_MMAP_OFFSET_WB;
+ old = atomic_exchange(&handles[i], mmap_arg.handle);
+ ioctl(i915, DRM_IOCTL_GEM_CLOSE, &old);
+
+ if (ioctl(i915,
+ DRM_IOCTL_I915_GEM_MMAP_OFFSET,
+ &mmap_arg) != -1) {
+ void *ptr;
+
+ ptr = mmap64(0, 4096,
+ PROT_WRITE, MAP_SHARED, i915,
+ mmap_arg.offset);
+ if (ptr != MAP_FAILED) {
+ *(volatile uint32_t *)ptr = 0;
+ munmap(ptr, 4096);
+ }
+ }
+
+ } while (!READ_ONCE(handles[0]));
+ }
+
+ sleep(timeout);
+ handles[0] = 1;
+ igt_waitchildren();
+
+ for (int i = 1; i <= ncpus; i++)
+ ioctl(i915, DRM_IOCTL_GEM_CLOSE, handles[i]);
+ munmap(handles, len);
+}
+
+static uint64_t atomic_compare_swap_u64(_Atomic(uint64_t) *ptr,
+ uint64_t oldval, uint64_t newval)
+{
+ atomic_compare_exchange_strong(ptr, &oldval, newval);
+ return oldval;
+}
+
+static uint64_t get_npages(_Atomic(uint64_t) *global, uint64_t npages)
+{
+ uint64_t try, old, max;
+
+ max = *global;
+ do {
+ old = max;
+ try = 1 + npages % (max / 2);
+ max -= try;
+ } while ((max = atomic_compare_swap_u64(global, old, max)) != old);
+
+ return try;
+}
+
+struct thread_clear {
+ _Atomic(uint64_t) max;
+ int timeout;
+ int i915;
+};
+
+static int create_ioctl(int i915, struct drm_i915_gem_create *create)
+{
+ int err = 0;
+
+ if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_CREATE, create)) {
+ err = -errno;
+ igt_assume(err != 0);
+ }
+
+ errno = 0;
+ return err;
+}
+
+static void *thread_clear(void *data)
+{
+ struct thread_clear *arg = data;
+ const struct mmap_offset *t;
+ unsigned long checked = 0;
+ int i915 = arg->i915;
+
+ t = mmap_offset_types;
+ igt_until_timeout(arg->timeout) {
+ struct drm_i915_gem_create create = {};
+ uint64_t npages;
+ void *ptr;
+
+ npages = random();
+ npages <<= 32;
+ npages |= random();
+ npages = get_npages(&arg->max, npages);
+ create.size = npages << 12;
+
+ create_ioctl(i915, &create);
+ ptr = __gem_mmap_offset(i915, create.handle, 0, create.size,
+ PROT_READ | PROT_WRITE,
+ t->type);
+ /* No set-domains as we are being as naughty as possible */
+ for (uint64_t page = 0; ptr && page < npages; page++) {
+ uint64_t x[8] = {
+ page * 4096 +
+ sizeof(x) * ((page % (4096 - sizeof(x)) / sizeof(x)))
+ };
+
+ if (page & 1)
+ igt_memcpy_from_wc(x, ptr + x[0], sizeof(x));
+ else
+ memcpy(x, ptr + x[0], sizeof(x));
+
+ for (int i = 0; i < ARRAY_SIZE(x); i++)
+ igt_assert_eq_u64(x[i], 0);
+ }
+ if (ptr)
+ munmap(ptr, create.size);
+ gem_close(i915, create.handle);
+ checked += npages;
+
+ atomic_fetch_add(&arg->max, npages);
+
+ if (!(++t)->name)
+ t = mmap_offset_types;
+ }
+
+ return (void *)(uintptr_t)checked;
+}
+
+static void always_clear(int i915, int timeout)
+{
+ struct thread_clear arg = {
+ .i915 = i915,
+ .timeout = timeout,
+ .max = intel_get_avail_ram_mb() << (20 - 12), /* in pages */
+ };
+ const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
+ unsigned long checked;
+ pthread_t thread[ncpus];
+ void *result;
+
+ for (int i = 0; i < ncpus; i++)
+ pthread_create(&thread[i], NULL, thread_clear, &arg);
+
+ checked = 0;
+ for (int i = 0; i < ncpus; i++) {
+ pthread_join(thread[i], &result);
+ checked += (uintptr_t)result;
+ }
+ igt_info("Checked %'lu page allocations\n", checked);
+}
+
+
+igt_main
+{
+ int i915;
+
+ igt_fixture {
+ i915 = drm_open_driver(DRIVER_INTEL);
+ gem_require_mmap_offset(i915);
+ }
+
+ igt_describe("Verify mapping to invalid gem objects won't be created");
+ igt_subtest_f("bad-object")
+ bad_object(i915);
+ igt_subtest_f("bad-flags")
+ bad_flags(i915);
+
+ igt_describe("Check buffer object mapping persists after gem_close");
+ igt_subtest_f("basic-uaf")
+ basic_uaf(i915);
+
+ igt_subtest_f("isolation")
+ isolation(i915);
+ igt_subtest_f("pf-nonblock")
+ pf_nonblock(i915);
+
+ igt_describe("Check race between close and mmap offset between threads");
+ igt_subtest_f("close-race")
+ close_race(i915, 20);
+
+ igt_subtest_f("clear")
+ always_clear(i915, 20);
+
+ igt_fixture {
+ close(i915);
+ }
+}
diff --git a/tests/meson.build b/tests/meson.build
index 18788d44b..05dea1f4e 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -174,6 +174,7 @@ i915_progs = [
'gem_media_vme',
'gem_mmap',
'gem_mmap_gtt',
+ 'gem_mmap_offset',
'gem_mmap_offset_exhaustion',
'gem_mmap_wc',
'gem_partial_pwrite_pread',
--
2.24.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [igt-dev] ✗ GitLab.Pipeline: warning for Add GEM_MMAP_OFFSET support in IGT. (rev5)
2019-11-26 17:25 [igt-dev] [PATCH i-g-t v4 0/3] Add GEM_MMAP_OFFSET support in IGT Zbigniew Kempczyński
` (4 preceding siblings ...)
2019-11-27 5:22 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
@ 2019-11-28 13:05 ` Patchwork
2019-11-28 13:20 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
` (3 subsequent siblings)
9 siblings, 0 replies; 19+ messages in thread
From: Patchwork @ 2019-11-28 13:05 UTC (permalink / raw)
To: Chris Wilson; +Cc: igt-dev
== Series Details ==
Series: Add GEM_MMAP_OFFSET support in IGT. (rev5)
URL : https://patchwork.freedesktop.org/series/69973/
State : warning
== Summary ==
Did not get list of undocumented tests for this run, something is wrong!
Other than that, pipeline status: FAILED.
see https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/pipelines/83695 for the overview.
build:tests-debian-meson-mips has failed (https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/-/jobs/1033878):
FAILED: tests/gem_mmap_offset
/usr/bin/mips-linux-gnu-gcc -o tests/gem_mmap_offset 'tests/59830eb@@gem_mmap_offset@exe/i915_gem_mmap_offset.c.o' -Wl,--no-undefined -Wl,--as-needed -Wl,--start-group lib/libigt.so.0 /usr/lib/mips-linux-gnu/libcairo.so /usr/lib/mips-linux-gnu/libglib-2.0.so /usr/lib/mips-linux-gnu/libdrm.so /usr/lib/mips-linux-gnu/libdw.so /usr/lib/mips-linux-gnu/libelf.so /usr/lib/mips-linux-gnu/libkmod.so /usr/lib/mips-linux-gnu/libprocps.so /lib/mips-linux-gnu/libudev.so -lm /usr/lib/mips-linux-gnu/libpciaccess.so /usr/lib/mips-linux-gnu/libpixman-1.so -lrt -lz /usr/lib/mips-linux-gnu/libunwind.so /usr/lib/mips-linux-gnu/libgsl.so /usr/lib/mips-linux-gnu/libgslcblas.so -lm /usr/lib/mips-linux-gnu/libasound.so /usr/lib/mips-linux-gnu/libdrm_nouveau.so -Wl,--end-group -pthread '-Wl,-rpath,$ORIGIN/../lib' -Wl,-rpath-link,/builds/gfx-ci/igt-ci-tags/build/lib
tests/59830eb@@gem_mmap_offset@exe/i915_gem_mmap_offset.c.o: In function `get_npages':
/builds/gfx-ci/igt-ci-tags/build/../tests/i915/gem_mmap_offset.c:277: undefined reference to `__atomic_load_8'
/builds/gfx-ci/igt-ci-tags/build/../tests/i915/gem_mmap_offset.c:277: undefined reference to `__atomic_load_8'
tests/59830eb@@gem_mmap_offset@exe/i915_gem_mmap_offset.c.o: In function `atomic_compare_swap_u64':
/builds/gfx-ci/igt-ci-tags/build/../tests/i915/gem_mmap_offset.c:269: undefined reference to `__atomic_compare_exchange_8'
/builds/gfx-ci/igt-ci-tags/build/../tests/i915/gem_mmap_offset.c:269: undefined reference to `__atomic_compare_exchange_8'
tests/59830eb@@gem_mmap_offset@exe/i915_gem_mmap_offset.c.o: In function `thread_clear':
/builds/gfx-ci/igt-ci-tags/build/../tests/i915/gem_mmap_offset.c:349: undefined reference to `__atomic_fetch_add_8'
/builds/gfx-ci/igt-ci-tags/build/../tests/i915/gem_mmap_offset.c:349: undefined reference to `__atomic_fetch_add_8'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
section_end:1574946023:build_script
^[[0Ksection_start:1574946023:after_script
^[[0Ksection_end:1574946025:after_script
^[[0Ksection_start:1574946025:upload_artifacts_on_failure
^[[0Ksection_end:1574946026:upload_artifacts_on_failure
^[[0K^[[31;1mERROR: Job failed: exit code 1
^[[0;m
== Logs ==
For more details see: https://gitlab.freedesktop.org/gfx-ci/igt-ci-tags/pipelines/83695
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
* [igt-dev] [PATCH i-g-t] tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 3/3] tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset Zbigniew Kempczyński
2019-11-28 12:55 ` [igt-dev] [PATCH i-g-t] " Chris Wilson
2019-11-28 13:05 ` Chris Wilson
@ 2019-11-28 13:10 ` Chris Wilson
2 siblings, 0 replies; 19+ messages in thread
From: Chris Wilson @ 2019-11-28 13:10 UTC (permalink / raw)
To: intel-gfx; +Cc: igt-dev
From: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
Few simple tests which tries to create / mmap buffer objects
using GEM_MMAP_OFFSET uAPI.
v2: change from WC -> WB (according to Chris review comment)
v3: add mmap-offset-close-race test
Signed-off-by: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Vanshidhar Konda <vanshidhar.r.konda@intel.com>
---
Required (look to gem_mmap_(gtt,wc,cpu) for ideas):
size - check we can handle objects beyond a reasonable limit (note the
kernel fails at beyond RAM)
forked - interactions with pagefault + new mmap_offsets across
threads/processes
suspend - check speed is consistent before/after suspend
coherency - combinatorial checker between all pointer types, prw and gpu
---
tests/Makefile.sources | 3 +
tests/i915/gem_mmap_offset.c | 426 +++++++++++++++++++++++++++++++++++
tests/meson.build | 1 +
3 files changed, 430 insertions(+)
create mode 100644 tests/i915/gem_mmap_offset.c
diff --git a/tests/Makefile.sources b/tests/Makefile.sources
index a211851cf..ddbc69bc8 100644
--- a/tests/Makefile.sources
+++ b/tests/Makefile.sources
@@ -325,6 +325,9 @@ gem_mmap_SOURCES = i915/gem_mmap.c
TESTS_progs += gem_mmap_gtt
gem_mmap_gtt_SOURCES = i915/gem_mmap_gtt.c
+TESTS_progs += gem_mmap_offset
+gem_mmap_offset_SOURCES = i915/gem_mmap_offset.c
+
TESTS_progs += gem_mmap_offset_exhaustion
gem_mmap_offset_exhaustion_SOURCES = i915/gem_mmap_offset_exhaustion.c
diff --git a/tests/i915/gem_mmap_offset.c b/tests/i915/gem_mmap_offset.c
new file mode 100644
index 000000000..e02f0fb60
--- /dev/null
+++ b/tests/i915/gem_mmap_offset.c
@@ -0,0 +1,426 @@
+/*
+ * Copyright © 2019 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include <errno.h>
+#include <pthread.h>
+#include <stdatomic.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include "drm.h"
+
+#include "igt.h"
+#include "igt_x86.h"
+
+IGT_TEST_DESCRIPTION("Basic MMAP_OFFSET IOCTL tests for mem regions\n");
+
+static const struct mmap_offset {
+ const char *name;
+ unsigned int type;
+ unsigned int domain;
+} mmap_offset_types[] = {
+ { "gtt", I915_MMAP_OFFSET_GTT, I915_GEM_DOMAIN_GTT },
+ { "wb", I915_MMAP_OFFSET_WB, I915_GEM_DOMAIN_CPU },
+ { "wc", I915_MMAP_OFFSET_WC, I915_GEM_DOMAIN_WC },
+ { "uc", I915_MMAP_OFFSET_UC, I915_GEM_DOMAIN_WC },
+ {},
+};
+
+#define for_each_mmap_offset_type(__t) \
+ for (const struct mmap_offset *__t = mmap_offset_types; \
+ (__t)->name; \
+ (__t)++)
+
+static int mmap_offset_ioctl(int i915, struct drm_i915_gem_mmap_offset *arg)
+{
+ int err = 0;
+
+ if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_MMAP_OFFSET, arg)) {
+ err = -errno;
+ igt_assume(err);
+ }
+
+ errno = 0;
+ return err;
+}
+
+static void bad_object(int i915)
+{
+ uint32_t real_handle;
+ uint32_t handles[20];
+ int i = 0;
+
+ real_handle = gem_create(i915, 4096);
+
+ handles[i++] = 0xdeadbeef;
+ for (int bit = 0; bit < 16; bit++)
+ handles[i++] = real_handle | (1 << (bit + 16));
+ handles[i] = real_handle + 1;
+
+ for (; i >= 0; i--) {
+ struct drm_i915_gem_mmap_offset arg = {
+ .handle = handles[i],
+ .flags = I915_MMAP_OFFSET_WB,
+ };
+
+ igt_debug("Trying MMAP IOCTL with handle %x\n",
+ handles[i]);
+ igt_assert_eq(mmap_offset_ioctl(i915, &arg),
+ -ENOENT);
+ }
+
+ gem_close(i915, real_handle);
+}
+
+static void bad_flags(int i915)
+{
+ struct drm_i915_gem_mmap_offset arg = {
+ .handle = gem_create(i915, 4096),
+ .flags = -1ull,
+ };
+
+ igt_assert_eq(mmap_offset_ioctl(i915, &arg), -EINVAL);
+ gem_close(i915, arg.handle);
+}
+
+static void basic_uaf(int i915)
+{
+ const uint32_t obj_size = 4096;
+
+ for_each_mmap_offset_type(t) {
+ uint32_t handle = gem_create(i915, obj_size);
+ uint8_t *expected, *buf, *addr;
+
+ addr = __gem_mmap_offset(i915, handle, 0, obj_size,
+ PROT_READ | PROT_WRITE,
+ t->type);
+ if (!addr) {
+ gem_close(i915, handle);
+ continue;
+ }
+
+ expected = calloc(obj_size, sizeof(*expected));
+ gem_set_domain(i915, handle, t->domain, 0);
+ igt_assert_f(memcmp(addr, expected, obj_size) == 0,
+ "mmap(%s) not clear on gem_create()\n",
+ t->name);
+ free(expected);
+
+ buf = calloc(obj_size, sizeof(*buf));
+ memset(buf + 1024, 0x01, 1024);
+ gem_write(i915, handle, 0, buf, obj_size);
+ gem_set_domain(i915, handle, t->domain, 0);
+ igt_assert_f(memcmp(buf, addr, obj_size) == 0,
+ "mmap(%s) not coherent with gem_write()\n",
+ t->name);
+
+ gem_set_domain(i915, handle, t->domain, t->domain);
+ memset(addr + 2048, 0xff, 1024);
+ gem_read(i915, handle, 0, buf, obj_size);
+ gem_set_domain(i915, handle, t->domain, 0);
+ igt_assert_f(memcmp(buf, addr, obj_size) == 0,
+ "mmap(%s) not coherent with gem_read()\n",
+ t->name);
+
+ gem_close(i915, handle);
+ igt_assert_f(memcmp(buf, addr, obj_size) == 0,
+ "mmap(%s) not resident after gem_close()\n",
+ t->name);
+ free(buf);
+
+ igt_debug("Testing unmapping\n");
+ munmap(addr, obj_size);
+ }
+}
+
+static void isolation(int i915)
+{
+ for_each_mmap_offset_type(t) {
+ struct drm_i915_gem_mmap_offset mmap_arg = {
+ .flags = t->type
+ };
+ int A = gem_reopen_driver(i915);
+ int B = gem_reopen_driver(i915);
+ uint64_t offset_a, offset_b;
+ uint32_t a, b;
+ void *ptr;
+
+ a = gem_create(A, 4096);
+ b = gem_open(B, gem_flink(A, a));
+
+ mmap_arg.handle = a;
+ if (mmap_offset_ioctl(i915, &mmap_arg)) {
+ close(A);
+ close(B);
+ continue;
+ }
+ offset_a = mmap_arg.offset;
+
+ mmap_arg.handle = b;
+ igt_assert_eq(mmap_offset_ioctl(i915, &mmap_arg), 0);
+ offset_b = mmap_arg.offset;
+
+ igt_info("A[%s]: {fd:%d, handle:%d, offset:%"PRIx64"}\n",
+ t->name, A, a, offset_a);
+ igt_info("B[%s]: {fd:%d, handle:%d, offset:%"PRIx64"}\n",
+ t->name, B, b, offset_b);
+
+ ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, B, offset_a);
+ igt_assert(ptr == MAP_FAILED);
+
+ ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_b);
+ igt_assert(ptr == MAP_FAILED);
+
+ close(B);
+
+ ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_a);
+ igt_assert(ptr != MAP_FAILED);
+ munmap(ptr, 4096);
+
+ close(A);
+
+ ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_a);
+ igt_assert(ptr == MAP_FAILED);
+ }
+}
+
+static void pf_nonblock(int i915)
+{
+ igt_spin_t *spin = igt_spin_new(i915);
+
+ for_each_mmap_offset_type(t) {
+ uint32_t *ptr;
+
+ ptr = __gem_mmap_offset(i915, spin->handle, 0, 4096,
+ PROT_READ | PROT_WRITE,
+ t->type);
+ if (!ptr)
+ continue;
+
+ igt_set_timeout(1, t->name);
+ /* no set-domain as we want to verify the pagefault is async */
+ ptr[256] = 0;
+ igt_reset_timeout();
+
+ munmap(ptr, 4096);
+ }
+
+ igt_spin_free(i915, spin);
+}
+
+static void close_race(int i915, int timeout)
+{
+ const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
+ _Atomic uint32_t *handles;
+ size_t len = ALIGN((ncpus + 1) * sizeof(uint32_t), 4096);
+
+ handles = mmap64(0, len, PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
+ igt_assert(handles != MAP_FAILED);
+
+ igt_fork(child, ncpus + 1) {
+ do {
+ struct drm_i915_gem_mmap_offset mmap_arg = {};
+ const int i = 1 + random() % ncpus;
+ uint32_t old;
+
+ mmap_arg.handle = gem_create(i915, 4096);
+ mmap_arg.flags = I915_MMAP_OFFSET_WB;
+ old = atomic_exchange(&handles[i], mmap_arg.handle);
+ ioctl(i915, DRM_IOCTL_GEM_CLOSE, &old);
+
+ if (ioctl(i915,
+ DRM_IOCTL_I915_GEM_MMAP_OFFSET,
+ &mmap_arg) != -1) {
+ void *ptr;
+
+ ptr = mmap64(0, 4096,
+ PROT_WRITE, MAP_SHARED, i915,
+ mmap_arg.offset);
+ if (ptr != MAP_FAILED) {
+ *(volatile uint32_t *)ptr = 0;
+ munmap(ptr, 4096);
+ }
+ }
+
+ } while (!READ_ONCE(handles[0]));
+ }
+
+ sleep(timeout);
+ handles[0] = 1;
+ igt_waitchildren();
+
+ for (int i = 1; i <= ncpus; i++)
+ ioctl(i915, DRM_IOCTL_GEM_CLOSE, handles[i]);
+ munmap(handles, len);
+}
+
+static uint64_t atomic_compare_swap_u64(_Atomic(uint64_t) *ptr,
+ uint64_t oldval, uint64_t newval)
+{
+ atomic_compare_exchange_strong(ptr, &oldval, newval);
+ return oldval;
+}
+
+static uint64_t get_npages(_Atomic(uint64_t) *global, uint64_t npages)
+{
+ uint64_t try, old, max;
+
+ max = *global;
+ do {
+ old = max;
+ try = 1 + npages % (max / 2);
+ max -= try;
+ } while ((max = atomic_compare_swap_u64(global, old, max)) != old);
+
+ return try;
+}
+
+struct thread_clear {
+ _Atomic(uint64_t) max;
+ int timeout;
+ int i915;
+};
+
+static int create_ioctl(int i915, struct drm_i915_gem_create *create)
+{
+ int err = 0;
+
+ if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_CREATE, create)) {
+ err = -errno;
+ igt_assume(err != 0);
+ }
+
+ errno = 0;
+ return err;
+}
+
+static void *thread_clear(void *data)
+{
+ struct thread_clear *arg = data;
+ const struct mmap_offset *t;
+ unsigned long checked = 0;
+ int i915 = arg->i915;
+
+ t = mmap_offset_types;
+ igt_until_timeout(arg->timeout) {
+ struct drm_i915_gem_create create = {};
+ uint64_t npages;
+ void *ptr;
+
+ npages = random();
+ npages <<= 32;
+ npages |= random();
+ npages = get_npages(&arg->max, npages);
+ create.size = npages << 12;
+
+ create_ioctl(i915, &create);
+ ptr = __gem_mmap_offset(i915, create.handle, 0, create.size,
+ PROT_READ | PROT_WRITE,
+ t->type);
+ /* No set-domains as we are being as naughty as possible */
+ for (uint64_t page = 0; ptr && page < npages; page++) {
+ uint64_t x[8] = {
+ page * 4096 +
+ sizeof(x) * ((page % (4096 - sizeof(x)) / sizeof(x)))
+ };
+
+ if (page & 1)
+ igt_memcpy_from_wc(x, ptr + x[0], sizeof(x));
+ else
+ memcpy(x, ptr + x[0], sizeof(x));
+
+ for (int i = 0; i < ARRAY_SIZE(x); i++)
+ igt_assert_eq_u64(x[i], 0);
+ }
+ if (ptr)
+ munmap(ptr, create.size);
+ gem_close(i915, create.handle);
+ checked += npages;
+
+ atomic_fetch_add(&arg->max, npages);
+
+ if (!(++t)->name)
+ t = mmap_offset_types;
+ }
+
+ return (void *)(uintptr_t)checked;
+}
+
+static void always_clear(int i915, int timeout)
+{
+ struct thread_clear arg = {
+ .i915 = i915,
+ .timeout = timeout,
+ .max = intel_get_avail_ram_mb() << (20 - 12), /* in pages */
+ };
+ const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
+ unsigned long checked;
+ pthread_t thread[ncpus];
+ void *result;
+
+ for (int i = 0; i < ncpus; i++)
+ pthread_create(&thread[i], NULL, thread_clear, &arg);
+
+ checked = 0;
+ for (int i = 0; i < ncpus; i++) {
+ pthread_join(thread[i], &result);
+ checked += (uintptr_t)result;
+ }
+ igt_info("Checked %'lu page allocations\n", checked);
+}
+
+
+igt_main
+{
+ int i915;
+
+ igt_fixture {
+ i915 = drm_open_driver(DRIVER_INTEL);
+ gem_require_mmap_offset(i915);
+ }
+
+ igt_describe("Verify mapping to invalid gem objects won't be created");
+ igt_subtest_f("bad-object")
+ bad_object(i915);
+ igt_subtest_f("bad-flags")
+ bad_flags(i915);
+
+ igt_describe("Check buffer object mapping persists after gem_close");
+ igt_subtest_f("basic-uaf")
+ basic_uaf(i915);
+
+ igt_subtest_f("isolation")
+ isolation(i915);
+ igt_subtest_f("pf-nonblock")
+ pf_nonblock(i915);
+
+ igt_describe("Check race between close and mmap offset between threads");
+ igt_subtest_f("close-race")
+ close_race(i915, 20);
+
+ igt_subtest_f("clear")
+ always_clear(i915, 20);
+
+ igt_fixture {
+ close(i915);
+ }
+}
diff --git a/tests/meson.build b/tests/meson.build
index 18788d44b..05dea1f4e 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -174,6 +174,7 @@ i915_progs = [
'gem_media_vme',
'gem_mmap',
'gem_mmap_gtt',
+ 'gem_mmap_offset',
'gem_mmap_offset_exhaustion',
'gem_mmap_wc',
'gem_partial_pwrite_pread',
--
2.24.0
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply related [flat|nested] 19+ messages in thread
* [igt-dev] ✓ Fi.CI.BAT: success for Add GEM_MMAP_OFFSET support in IGT. (rev5)
2019-11-26 17:25 [igt-dev] [PATCH i-g-t v4 0/3] Add GEM_MMAP_OFFSET support in IGT Zbigniew Kempczyński
` (5 preceding siblings ...)
2019-11-28 13:05 ` [igt-dev] ✗ GitLab.Pipeline: warning for Add GEM_MMAP_OFFSET support in IGT. (rev5) Patchwork
@ 2019-11-28 13:20 ` Patchwork
2019-11-28 13:43 ` [igt-dev] ✓ Fi.CI.BAT: success for Add GEM_MMAP_OFFSET support in IGT. (rev7) Patchwork
` (2 subsequent siblings)
9 siblings, 0 replies; 19+ messages in thread
From: Patchwork @ 2019-11-28 13:20 UTC (permalink / raw)
To: Chris Wilson; +Cc: igt-dev
== Series Details ==
Series: Add GEM_MMAP_OFFSET support in IGT. (rev5)
URL : https://patchwork.freedesktop.org/series/69973/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_7438 -> IGTPW_3778
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/index.html
Known issues
------------
Here are the changes found in IGTPW_3778 that come from known issues:
### IGT changes ###
#### Possible fixes ####
* igt@gem_ctx_create@basic-files:
- {fi-tgl-u}: [INCOMPLETE][1] ([fdo#111735]) -> [PASS][2]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/fi-tgl-u/igt@gem_ctx_create@basic-files.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/fi-tgl-u/igt@gem_ctx_create@basic-files.html
* igt@i915_pm_rpm@module-reload:
- fi-skl-6770hq: [FAIL][3] ([fdo#108511]) -> [PASS][4]
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/fi-skl-6770hq/igt@i915_pm_rpm@module-reload.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/fi-skl-6770hq/igt@i915_pm_rpm@module-reload.html
#### Warnings ####
* igt@kms_busy@basic-flip-pipe-b:
- fi-kbl-x1275: [DMESG-WARN][5] ([fdo#103558] / [fdo#105602] / [fdo#105763]) -> [DMESG-WARN][6] ([fdo#103558] / [fdo#105602]) +6 similar issues
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/fi-kbl-x1275/igt@kms_busy@basic-flip-pipe-b.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/fi-kbl-x1275/igt@kms_busy@basic-flip-pipe-b.html
* igt@kms_flip@basic-flip-vs-dpms:
- fi-icl-dsi: [INCOMPLETE][7] ([fdo#107713]) -> [DMESG-WARN][8] ([fdo#107724])
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/fi-icl-dsi/igt@kms_flip@basic-flip-vs-dpms.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/fi-icl-dsi/igt@kms_flip@basic-flip-vs-dpms.html
* igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a:
- fi-kbl-x1275: [DMESG-WARN][9] ([fdo#103558] / [fdo#105602]) -> [DMESG-WARN][10] ([fdo#103558] / [fdo#105602] / [fdo#105763]) +9 similar issues
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/fi-kbl-x1275/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/fi-kbl-x1275/igt@kms_pipe_crc_basic@suspend-read-crc-pipe-a.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#103558]: https://bugs.freedesktop.org/show_bug.cgi?id=103558
[fdo#105602]: https://bugs.freedesktop.org/show_bug.cgi?id=105602
[fdo#105763]: https://bugs.freedesktop.org/show_bug.cgi?id=105763
[fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
[fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
[fdo#108511]: https://bugs.freedesktop.org/show_bug.cgi?id=108511
[fdo#109964]: https://bugs.freedesktop.org/show_bug.cgi?id=109964
[fdo#111735]: https://bugs.freedesktop.org/show_bug.cgi?id=111735
[fdo#112260]: https://bugs.freedesktop.org/show_bug.cgi?id=112260
[fdo#112298]: https://bugs.freedesktop.org/show_bug.cgi?id=112298
Participating hosts (51 -> 45)
------------------------------
Missing (6): fi-ilk-m540 fi-hsw-4200u fi-bsw-cyan fi-ctg-p8600 fi-byt-clapper fi-bdw-samus
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_5313 -> IGTPW_3778
CI-20190529: 20190529
CI_DRM_7438: 8a2661592e79e48bcba9c24565b2b16edafbcbaa @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_3778: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/index.html
IGT_5313: 92caadb4e551ba05aa6e6e567ef69da96ca7e328 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
== Testlist changes ==
+igt@gem_mmap_offset@bad-flags
+igt@gem_mmap_offset@bad-object
+igt@gem_mmap_offset@basic-uaf
+igt@gem_mmap_offset@clear
+igt@gem_mmap_offset@close-race
+igt@gem_mmap_offset@isolation
+igt@gem_mmap_offset@pf-nonblock
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [igt-dev] [PATCH i-g-t] tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset
2019-11-28 12:55 ` [igt-dev] [PATCH i-g-t] " Chris Wilson
2019-11-28 12:59 ` Chris Wilson
@ 2019-11-28 13:38 ` Petri Latvala
1 sibling, 0 replies; 19+ messages in thread
From: Petri Latvala @ 2019-11-28 13:38 UTC (permalink / raw)
To: Chris Wilson; +Cc: igt-dev, intel-gfx
On Thu, Nov 28, 2019 at 12:55:02PM +0000, Chris Wilson wrote:
> From: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
>
> Few simple tests which tries to create / mmap buffer objects
> using GEM_MMAP_OFFSET uAPI.
>
> v2: change from WC -> WB (according to Chris review comment)
> v3: add mmap-offset-close-race test
>
> Signed-off-by: Lukasz Kalamarz <lukasz.kalamarz@intel.com>
> Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski@intel.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Vanshidhar Konda <vanshidhar.r.konda@intel.com>
> ---
> Required (look to gem_mmap_(gtt,wc,cpu) for ideas):
> size - check we can handle objects beyond a reasonable limit (note the
> kernel fails at beyond RAM)
> forked - interactions with pagefault + new mmap_offsets across
> threads/processes
> suspend - check speed is consistent before/after suspend
> coherency - combinatorial checker between all pointer types, prw and gpu
> ---
> tests/Makefile.sources | 3 +
> tests/i915/gem_mmap_offset.c | 416 +++++++++++++++++++++++++++++++++++
> tests/meson.build | 1 +
> 3 files changed, 420 insertions(+)
> create mode 100644 tests/i915/gem_mmap_offset.c
>
> diff --git a/tests/Makefile.sources b/tests/Makefile.sources
> index a211851cf..ddbc69bc8 100644
> --- a/tests/Makefile.sources
> +++ b/tests/Makefile.sources
> @@ -325,6 +325,9 @@ gem_mmap_SOURCES = i915/gem_mmap.c
> TESTS_progs += gem_mmap_gtt
> gem_mmap_gtt_SOURCES = i915/gem_mmap_gtt.c
>
> +TESTS_progs += gem_mmap_offset
> +gem_mmap_offset_SOURCES = i915/gem_mmap_offset.c
> +
> TESTS_progs += gem_mmap_offset_exhaustion
> gem_mmap_offset_exhaustion_SOURCES = i915/gem_mmap_offset_exhaustion.c
>
> diff --git a/tests/i915/gem_mmap_offset.c b/tests/i915/gem_mmap_offset.c
> new file mode 100644
> index 000000000..e75c3fd17
> --- /dev/null
> +++ b/tests/i915/gem_mmap_offset.c
> @@ -0,0 +1,416 @@
> +/*
> + * Copyright © 2019 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + */
> +
> +#include <errno.h>
> +#include <pthread.h>
> +#include <stdatomic.h>
> +#include <sys/stat.h>
> +#include <sys/ioctl.h>
> +#include "drm.h"
> +
> +#include "igt.h"
> +#include "igt_x86.h"
> +
> +IGT_TEST_DESCRIPTION("Basic MMAP_OFFSET IOCTL tests for mem regions\n");
> +
> +static const struct mmap_offset {
> + const char *name;
> + unsigned int type;
> + unsigned int domain;
> +} mmap_offset_types[] = {
> + { "gtt", I915_MMAP_OFFSET_GTT, I915_GEM_DOMAIN_GTT },
> + { "wb", I915_MMAP_OFFSET_WB, I915_GEM_DOMAIN_CPU },
> + { "wc", I915_MMAP_OFFSET_WC, I915_GEM_DOMAIN_WC },
> + { "uc", I915_MMAP_OFFSET_UC, I915_GEM_DOMAIN_WC },
> + {},
> +};
> +
> +#define for_each_mmap_offset_type(__t) \
> + for (const struct mmap_offset *__t = mmap_offset_types; \
> + (__t)->name; \
> + (__t)++)
> +
> +static int mmap_offset_ioctl(int i915, struct drm_i915_gem_mmap_offset *arg)
> +{
> + int err = 0;
> +
> + if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_MMAP_OFFSET, arg)) {
> + err = -errno;
> + igt_assume(err);
> + }
> +
> + errno = 0;
> + return err;
> +}
> +
> +static void bad_object(int i915)
> +{
> + uint32_t real_handle;
> + uint32_t handles[20];
> + int i = 0;
> +
> + real_handle = gem_create(i915, 4096);
> +
> + handles[i++] = 0xdeadbeef;
> + for (int bit = 0; bit < 16; bit++)
> + handles[i++] = real_handle | (1 << (bit + 16));
> + handles[i] = real_handle + 1;
> +
> + for (; i >= 0; i--) {
> + struct drm_i915_gem_mmap_offset arg = {
> + .handle = handles[i],
> + .flags = I915_MMAP_OFFSET_WB,
> + };
> +
> + igt_debug("Trying MMAP IOCTL with handle %x\n",
> + handles[i]);
> + igt_assert_eq(mmap_offset_ioctl(i915, &arg),
> + -ENOENT);
> + }
> +
> + gem_close(i915, real_handle);
> +}
> +
> +static void bad_flags(int i915)
> +{
> + struct drm_i915_gem_mmap_offset arg = {
> + .handle = gem_create(i915, 4096),
> + .flags = -1ull,
> + };
> +
> + igt_assert_eq(mmap_offset_ioctl(i915, &arg), -EINVAL);
> + gem_close(i915, arg.handle);
> +}
> +
> +static void basic_uaf(int i915)
> +{
> + const uint32_t obj_size = 4096;
> +
> + for_each_mmap_offset_type(t) {
> + uint32_t handle = gem_create(i915, obj_size);
> + uint8_t *expected, *buf, *addr;
> +
> + addr = __gem_mmap_offset(i915, handle, 0, obj_size,
> + PROT_READ | PROT_WRITE,
> + t->type);
> + if (!addr) {
> + gem_close(i915, handle);
> + continue;
> + }
> +
> + expected = calloc(obj_size, sizeof(*expected));
> + gem_set_domain(i915, handle, t->domain, 0);
> + igt_assert_f(memcmp(addr, expected, obj_size) == 0,
> + "mmap(%s) not clear on gem_create()\n",
> + t->name);
> + free(expected);
> +
> + buf = calloc(obj_size, sizeof(*buf));
> + memset(buf + 1024, 0x01, 1024);
> + gem_write(i915, handle, 0, buf, obj_size);
> + gem_set_domain(i915, handle, t->domain, 0);
> + igt_assert_f(memcmp(buf, addr, obj_size) == 0,
> + "mmap(%s) not coherent with gem_write()\n",
> + t->name);
> +
> + gem_set_domain(i915, handle, t->domain, t->domain);
> + memset(addr + 2048, 0xff, 1024);
> + gem_read(i915, handle, 0, buf, obj_size);
> + gem_set_domain(i915, handle, t->domain, 0);
> + igt_assert_f(memcmp(buf, addr, obj_size) == 0,
> + "mmap(%s) not coherent with gem_read()\n",
> + t->name);
> +
> + gem_close(i915, handle);
> + igt_assert_f(memcmp(buf, addr, obj_size) == 0,
> + "mmap(%s) not resident after gem_close()\n",
> + t->name);
> + free(buf);
> +
> + igt_debug("Testing unmapping\n");
> + munmap(addr, obj_size);
> + }
> +}
> +
> +static void isolation(int i915)
> +{
> + for_each_mmap_offset_type(t) {
> + struct drm_i915_gem_mmap_offset mmap_arg = {
> + .flags = t->type
> + };
> + int A = gem_reopen_driver(i915);
> + int B = gem_reopen_driver(i915);
> + uint64_t offset_a, offset_b;
> + uint32_t a, b;
> + void *ptr;
> +
> + a = gem_create(A, 4096);
> + b = gem_open(B, gem_flink(A, a));
> +
> + mmap_arg.handle = a;
> + igt_assert_eq(mmap_offset_ioctl(i915, &mmap_arg), 0);
> + offset_a = mmap_arg.offset;
> +
> + mmap_arg.handle = b;
> + igt_assert_eq(mmap_offset_ioctl(i915, &mmap_arg), 0);
> + offset_b = mmap_arg.offset;
> +
> + igt_info("A[%s]: {fd:%d, handle:%d, offset:%"PRIx64"}\n",
> + t->name, A, a, offset_a);
> + igt_info("B[%s]: {fd:%d, handle:%d, offset:%"PRIx64"}\n",
> + t->name, B, b, offset_b);
> +
> + close(B);
> +
> + ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_a);
> + igt_assert(ptr != MAP_FAILED);
> + munmap(ptr, 4096);
> +
> + close(A);
> +
> + ptr = mmap64(0, 4096, PROT_READ, MAP_SHARED, A, offset_a);
> + igt_assert(ptr == MAP_FAILED);
> + }
> +}
> +
> +static void pf_nonblock(int i915)
> +{
> + igt_spin_t *spin = igt_spin_new(i915);
> +
> + for_each_mmap_offset_type(t) {
> + uint32_t *ptr;
> +
> + ptr = __gem_mmap_offset(i915, spin->handle, 0, 4096,
> + PROT_READ | PROT_WRITE,
> + t->type);
> + if (!ptr)
> + continue;
> +
> + igt_set_timeout(1, t->name);
> + /* no set-domain as we want to verify the pagefault is async */
> + ptr[256] = 0;
> + igt_reset_timeout();
> +
> + munmap(ptr, 4096);
> + }
> +
> + igt_spin_free(i915, spin);
> +}
> +
> +static void close_race(int i915, int timeout)
> +{
> + const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
> + _Atomic uint32_t *handles;
> + size_t len = ALIGN((ncpus + 1) * sizeof(uint32_t), 4096);
> +
> + handles = mmap64(0, len, PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
> + igt_assert(handles != MAP_FAILED);
> +
> + igt_fork(child, ncpus + 1) {
> + do {
> + struct drm_i915_gem_mmap_offset mmap_arg = {};
> + const int i = 1 + random() % ncpus;
> + uint32_t old;
> +
> + mmap_arg.handle = gem_create(i915, 4096);
> + mmap_arg.flags = I915_MMAP_OFFSET_WB;
> + old = atomic_exchange(&handles[i], mmap_arg.handle);
This will require adding libatomic to this executable's dependencies
with meson. Look to handling of gem_create.c for an example.
--
Petri Latvala
> + ioctl(i915, DRM_IOCTL_GEM_CLOSE, &old);
> +
> + if (ioctl(i915,
> + DRM_IOCTL_I915_GEM_MMAP_OFFSET,
> + &mmap_arg) != -1) {
> + void *ptr;
> +
> + ptr = mmap64(0, 4096,
> + PROT_WRITE, MAP_SHARED, i915,
> + mmap_arg.offset);
> + if (ptr != MAP_FAILED) {
> + *(volatile uint32_t *)ptr = 0;
> + munmap(ptr, 4096);
> + }
> + }
> +
> + } while (!READ_ONCE(handles[0]));
> + }
> +
> + sleep(timeout);
> + handles[0] = 1;
> + igt_waitchildren();
> +
> + for (int i = 1; i <= ncpus; i++)
> + ioctl(i915, DRM_IOCTL_GEM_CLOSE, handles[i]);
> + munmap(handles, len);
> +}
> +
> +static uint64_t atomic_compare_swap_u64(_Atomic(uint64_t) *ptr,
> + uint64_t oldval, uint64_t newval)
> +{
> + atomic_compare_exchange_strong(ptr, &oldval, newval);
> + return oldval;
> +}
> +
> +static uint64_t get_npages(_Atomic(uint64_t) *global, uint64_t npages)
> +{
> + uint64_t try, old, max;
> +
> + max = *global;
> + do {
> + old = max;
> + try = 1 + npages % (max / 2);
> + max -= try;
> + } while ((max = atomic_compare_swap_u64(global, old, max)) != old);
> +
> + return try;
> +}
> +
> +struct thread_clear {
> + _Atomic(uint64_t) max;
> + int timeout;
> + int i915;
> +};
> +
> +static int create_ioctl(int i915, struct drm_i915_gem_create *create)
> +{
> + int err = 0;
> +
> + if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_CREATE, create)) {
> + err = -errno;
> + igt_assume(err != 0);
> + }
> +
> + errno = 0;
> + return err;
> +}
> +
> +static void *thread_clear(void *data)
> +{
> + struct thread_clear *arg = data;
> + const struct mmap_offset *t;
> + unsigned long checked = 0;
> + int i915 = arg->i915;
> +
> + t = mmap_offset_types;
> + igt_until_timeout(arg->timeout) {
> + struct drm_i915_gem_create create = {};
> + uint64_t npages;
> + void *ptr;
> +
> + npages = random();
> + npages <<= 32;
> + npages |= random();
> + npages = get_npages(&arg->max, npages);
> + create.size = npages << 12;
> +
> + create_ioctl(i915, &create);
> + ptr = __gem_mmap_offset(i915, create.handle, 0, create.size,
> + PROT_READ | PROT_WRITE,
> + t->type);
> + /* No set-domains as we are being as naughty as possible */
> + for (uint64_t page = 0; ptr && page < npages; page++) {
> + uint64_t x[8] = {
> + page * 4096 +
> + sizeof(x) * ((page % (4096 - sizeof(x)) / sizeof(x)))
> + };
> +
> + if (page & 1)
> + igt_memcpy_from_wc(x, ptr + x[0], sizeof(x));
> + else
> + memcpy(x, ptr + x[0], sizeof(x));
> +
> + for (int i = 0; i < ARRAY_SIZE(x); i++)
> + igt_assert_eq_u64(x[i], 0);
> + }
> + if (ptr)
> + munmap(ptr, create.size);
> + gem_close(i915, create.handle);
> + checked += npages;
> +
> + atomic_fetch_add(&arg->max, npages);
> +
> + if (!(++t)->name)
> + t = mmap_offset_types;
> + }
> +
> + return (void *)(uintptr_t)checked;
> +}
> +
> +static void always_clear(int i915, int timeout)
> +{
> + struct thread_clear arg = {
> + .i915 = i915,
> + .timeout = timeout,
> + .max = intel_get_avail_ram_mb() << (20 - 12), /* in pages */
> + };
> + const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
> + unsigned long checked;
> + pthread_t thread[ncpus];
> + void *result;
> +
> + for (int i = 0; i < ncpus; i++)
> + pthread_create(&thread[i], NULL, thread_clear, &arg);
> +
> + checked = 0;
> + for (int i = 0; i < ncpus; i++) {
> + pthread_join(thread[i], &result);
> + checked += (uintptr_t)result;
> + }
> + igt_info("Checked %'lu page allocations\n", checked);
> +}
> +
> +
> +igt_main
> +{
> + int i915;
> +
> + igt_fixture {
> + i915 = drm_open_driver(DRIVER_INTEL);
> + gem_require_mmap_offset(i915);
> + }
> +
> + igt_describe("Verify mapping to invalid gem objects won't be created");
> + igt_subtest_f("bad-object")
> + bad_object(i915);
> + igt_subtest_f("bad-flags")
> + bad_flags(i915);
> +
> + igt_describe("Check buffer object mapping persists after gem_close");
> + igt_subtest_f("basic-uaf")
> + basic_uaf(i915);
> +
> + igt_subtest_f("isolation")
> + isolation(i915);
> + igt_subtest_f("pf-nonblock")
> + pf_nonblock(i915);
> +
> + igt_describe("Check race between close and mmap offset between threads");
> + igt_subtest_f("close-race")
> + close_race(i915, 20);
> +
> + igt_subtest_f("clear")
> + always_clear(i915, 20);
> +
> + igt_fixture {
> + close(i915);
> + }
> +}
> diff --git a/tests/meson.build b/tests/meson.build
> index 18788d44b..05dea1f4e 100644
> --- a/tests/meson.build
> +++ b/tests/meson.build
> @@ -174,6 +174,7 @@ i915_progs = [
> 'gem_media_vme',
> 'gem_mmap',
> 'gem_mmap_gtt',
> + 'gem_mmap_offset',
> 'gem_mmap_offset_exhaustion',
> 'gem_mmap_wc',
> 'gem_partial_pwrite_pread',
> --
> 2.24.0
>
> _______________________________________________
> igt-dev mailing list
> igt-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/igt-dev
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
* [igt-dev] ✓ Fi.CI.BAT: success for Add GEM_MMAP_OFFSET support in IGT. (rev7)
2019-11-26 17:25 [igt-dev] [PATCH i-g-t v4 0/3] Add GEM_MMAP_OFFSET support in IGT Zbigniew Kempczyński
` (6 preceding siblings ...)
2019-11-28 13:20 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
@ 2019-11-28 13:43 ` Patchwork
2019-11-29 19:26 ` [igt-dev] ✗ Fi.CI.IGT: failure for Add GEM_MMAP_OFFSET support in IGT. (rev5) Patchwork
2019-11-29 19:35 ` [igt-dev] ✗ Fi.CI.IGT: failure for Add GEM_MMAP_OFFSET support in IGT. (rev7) Patchwork
9 siblings, 0 replies; 19+ messages in thread
From: Patchwork @ 2019-11-28 13:43 UTC (permalink / raw)
To: Chris Wilson; +Cc: igt-dev
== Series Details ==
Series: Add GEM_MMAP_OFFSET support in IGT. (rev7)
URL : https://patchwork.freedesktop.org/series/69973/
State : success
== Summary ==
CI Bug Log - changes from CI_DRM_7438 -> IGTPW_3779
====================================================
Summary
-------
**SUCCESS**
No regressions found.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/index.html
Known issues
------------
Here are the changes found in IGTPW_3779 that come from known issues:
### IGT changes ###
#### Possible fixes ####
* igt@gem_ctx_create@basic-files:
- {fi-tgl-u}: [INCOMPLETE][1] ([fdo#111735]) -> [PASS][2]
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/fi-tgl-u/igt@gem_ctx_create@basic-files.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/fi-tgl-u/igt@gem_ctx_create@basic-files.html
* igt@i915_pm_rpm@module-reload:
- fi-skl-6770hq: [FAIL][3] ([fdo#108511]) -> [PASS][4]
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/fi-skl-6770hq/igt@i915_pm_rpm@module-reload.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/fi-skl-6770hq/igt@i915_pm_rpm@module-reload.html
#### Warnings ####
* igt@kms_busy@basic-flip-pipe-b:
- fi-kbl-x1275: [DMESG-WARN][5] ([fdo#103558] / [fdo#105602] / [fdo#105763]) -> [DMESG-WARN][6] ([fdo#103558] / [fdo#105602]) +3 similar issues
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/fi-kbl-x1275/igt@kms_busy@basic-flip-pipe-b.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/fi-kbl-x1275/igt@kms_busy@basic-flip-pipe-b.html
* igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy:
- fi-kbl-x1275: [DMESG-WARN][7] ([fdo#103558] / [fdo#105602]) -> [DMESG-WARN][8] ([fdo#103558] / [fdo#105602] / [fdo#105763]) +6 similar issues
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/fi-kbl-x1275/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/fi-kbl-x1275/igt@kms_cursor_legacy@basic-busy-flip-before-cursor-legacy.html
* igt@kms_flip@basic-flip-vs-dpms:
- fi-icl-dsi: [INCOMPLETE][9] ([fdo#107713]) -> [DMESG-WARN][10] ([fdo#107724])
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/fi-icl-dsi/igt@kms_flip@basic-flip-vs-dpms.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/fi-icl-dsi/igt@kms_flip@basic-flip-vs-dpms.html
{name}: This element is suppressed. This means it is ignored when computing
the status of the difference (SUCCESS, WARNING, or FAILURE).
[fdo#103558]: https://bugs.freedesktop.org/show_bug.cgi?id=103558
[fdo#105602]: https://bugs.freedesktop.org/show_bug.cgi?id=105602
[fdo#105763]: https://bugs.freedesktop.org/show_bug.cgi?id=105763
[fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
[fdo#107724]: https://bugs.freedesktop.org/show_bug.cgi?id=107724
[fdo#108511]: https://bugs.freedesktop.org/show_bug.cgi?id=108511
[fdo#111735]: https://bugs.freedesktop.org/show_bug.cgi?id=111735
Participating hosts (51 -> 45)
------------------------------
Missing (6): fi-ilk-m540 fi-hsw-4200u fi-bsw-cyan fi-ctg-p8600 fi-byt-clapper fi-bdw-samus
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_5313 -> IGTPW_3779
CI-20190529: 20190529
CI_DRM_7438: 8a2661592e79e48bcba9c24565b2b16edafbcbaa @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_3779: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/index.html
IGT_5313: 92caadb4e551ba05aa6e6e567ef69da96ca7e328 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
== Testlist changes ==
+igt@gem_mmap_offset@bad-flags
+igt@gem_mmap_offset@bad-object
+igt@gem_mmap_offset@basic-uaf
+igt@gem_mmap_offset@clear
+igt@gem_mmap_offset@close-race
+igt@gem_mmap_offset@isolation
+igt@gem_mmap_offset@pf-nonblock
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [igt-dev] [PATCH i-g-t v4 2/3] lib/i915/gem_mman: add mmap_offset support
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 2/3] lib/i915/gem_mman: add mmap_offset support Zbigniew Kempczyński
@ 2019-11-28 14:38 ` Chris Wilson
2019-11-28 14:43 ` Chris Wilson
1 sibling, 0 replies; 19+ messages in thread
From: Chris Wilson @ 2019-11-28 14:38 UTC (permalink / raw)
To: Zbigniew Kempczyński, igt-dev
Quoting Zbigniew Kempczyński (2019-11-26 17:25:55)
> /**
> * __gem_mmap__wc:
> * @fd: open i915 drm file descriptor
> @@ -194,7 +285,12 @@ static void
> */
> void *__gem_mmap__wc(int fd, uint32_t handle, uint64_t offset, uint64_t size, unsigned prot)
> {
> - return __gem_mmap(fd, handle, offset, size, prot, I915_MMAP_WC);
> + void *ptr = __gem_mmap_offset(fd, handle, offset, size, prot,
> + I915_MMAP_OFFSET_WC);
> + if (!ptr)
> + ptr = __gem_mmap(fd, handle, offset, size, prot, I915_MMAP_WC);
This subverts the tests/i915/gem_mmap_wc.c so we lose coverage of the
legacy API.
Yikes.
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: [igt-dev] [PATCH i-g-t v4 2/3] lib/i915/gem_mman: add mmap_offset support
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 2/3] lib/i915/gem_mman: add mmap_offset support Zbigniew Kempczyński
2019-11-28 14:38 ` Chris Wilson
@ 2019-11-28 14:43 ` Chris Wilson
1 sibling, 0 replies; 19+ messages in thread
From: Chris Wilson @ 2019-11-28 14:43 UTC (permalink / raw)
To: Zbigniew Kempczyński, igt-dev
Quoting Zbigniew Kempczyński (2019-11-26 17:25:55)
> +void *gem_mmap__device_coherent(int fd, uint32_t handle, uint64_t offset,
> + uint64_t size, unsigned prot)
> +{
> + void *ptr;
> +
> + igt_assert(offset == 0);
> +
> + ptr = gem_mmap__device_coherent(fd, handle, offset, size, prot);
You meant __gem_mmap__device_coherent()
> + igt_assert(ptr);
> +
> + return ptr;
> +}
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
* [igt-dev] ✗ Fi.CI.IGT: failure for Add GEM_MMAP_OFFSET support in IGT. (rev5)
2019-11-26 17:25 [igt-dev] [PATCH i-g-t v4 0/3] Add GEM_MMAP_OFFSET support in IGT Zbigniew Kempczyński
` (7 preceding siblings ...)
2019-11-28 13:43 ` [igt-dev] ✓ Fi.CI.BAT: success for Add GEM_MMAP_OFFSET support in IGT. (rev7) Patchwork
@ 2019-11-29 19:26 ` Patchwork
2019-11-29 19:35 ` [igt-dev] ✗ Fi.CI.IGT: failure for Add GEM_MMAP_OFFSET support in IGT. (rev7) Patchwork
9 siblings, 0 replies; 19+ messages in thread
From: Patchwork @ 2019-11-29 19:26 UTC (permalink / raw)
To: Chris Wilson; +Cc: igt-dev
== Series Details ==
Series: Add GEM_MMAP_OFFSET support in IGT. (rev5)
URL : https://patchwork.freedesktop.org/series/69973/
State : failure
== Summary ==
CI Bug Log - changes from CI_DRM_7438_full -> IGTPW_3778_full
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with IGTPW_3778_full absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in IGTPW_3778_full, please notify your bug team to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/index.html
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in IGTPW_3778_full:
### IGT changes ###
#### Possible regressions ####
* igt@gem_tiled_wb:
- shard-hsw: [PASS][1] -> [FAIL][2] +1 similar issue
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-hsw2/igt@gem_tiled_wb.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-hsw1/igt@gem_tiled_wb.html
* igt@gem_tiled_wc:
- shard-glk: [PASS][3] -> [FAIL][4] +1 similar issue
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-glk8/igt@gem_tiled_wc.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-glk3/igt@gem_tiled_wc.html
- shard-apl: [PASS][5] -> [FAIL][6] +1 similar issue
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl1/igt@gem_tiled_wc.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-apl1/igt@gem_tiled_wc.html
- shard-snb: [PASS][7] -> [FAIL][8] +1 similar issue
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-snb6/igt@gem_tiled_wc.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-snb2/igt@gem_tiled_wc.html
New tests
---------
New tests have been introduced between CI_DRM_7438_full and IGTPW_3778_full:
### New IGT tests (7) ###
* igt@gem_mmap_offset@bad-flags:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@bad-object:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@basic-uaf:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@clear:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@close-race:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@isolation:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@pf-nonblock:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
Known issues
------------
Here are the changes found in IGTPW_3778_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_ctx_isolation@bcs0-s3:
- shard-apl: [PASS][9] -> [DMESG-WARN][10] ([fdo#108566]) +2 similar issues
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl3/igt@gem_ctx_isolation@bcs0-s3.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-apl6/igt@gem_ctx_isolation@bcs0-s3.html
* igt@kms_setmode@basic:
- shard-apl: [PASS][11] -> [FAIL][12] ([fdo#99912])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl7/igt@kms_setmode@basic.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-apl8/igt@kms_setmode@basic.html
#### Possible fixes ####
* igt@gem_ctx_persistence@rcs0-mixed-process:
- shard-apl: [FAIL][13] -> [PASS][14]
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl7/igt@gem_ctx_persistence@rcs0-mixed-process.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-apl2/igt@gem_ctx_persistence@rcs0-mixed-process.html
* igt@gem_eio@unwedge-stress:
- shard-snb: [FAIL][15] ([fdo#109661]) -> [PASS][16]
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-snb7/igt@gem_eio@unwedge-stress.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-snb2/igt@gem_eio@unwedge-stress.html
* igt@gem_userptr_blits@map-fixed-invalidate-busy-gup:
- shard-hsw: [DMESG-WARN][17] ([fdo#111870]) -> [PASS][18] +1 similar issue
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-hsw2/igt@gem_userptr_blits@map-fixed-invalidate-busy-gup.html
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-hsw7/igt@gem_userptr_blits@map-fixed-invalidate-busy-gup.html
- shard-snb: [DMESG-WARN][19] ([fdo#111870]) -> [PASS][20]
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-snb6/igt@gem_userptr_blits@map-fixed-invalidate-busy-gup.html
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-snb5/igt@gem_userptr_blits@map-fixed-invalidate-busy-gup.html
* igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy:
- shard-snb: [DMESG-WARN][21] ([fdo#110789] / [fdo#111870]) -> [PASS][22]
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-snb1/igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy.html
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-snb7/igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy.html
* igt@i915_suspend@sysfs-reader:
- shard-apl: [DMESG-WARN][23] ([fdo#108566]) -> [PASS][24] +1 similar issue
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl1/igt@i915_suspend@sysfs-reader.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-apl7/igt@i915_suspend@sysfs-reader.html
* igt@kms_cursor_crc@pipe-b-cursor-128x42-random:
- shard-apl: [FAIL][25] ([fdo#103232]) -> [PASS][26]
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl6/igt@kms_cursor_crc@pipe-b-cursor-128x42-random.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-apl2/igt@kms_cursor_crc@pipe-b-cursor-128x42-random.html
* igt@kms_flip@flip-vs-suspend:
- shard-hsw: [INCOMPLETE][27] ([fdo#103540]) -> [PASS][28]
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-hsw7/igt@kms_flip@flip-vs-suspend.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-hsw8/igt@kms_flip@flip-vs-suspend.html
#### Warnings ####
* igt@gem_eio@kms:
- shard-snb: [INCOMPLETE][29] ([fdo#105411]) -> [DMESG-WARN][30] ([fdo#111780] / [fdo#111781])
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-snb1/igt@gem_eio@kms.html
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/shard-snb4/igt@gem_eio@kms.html
[fdo#103232]: https://bugs.freedesktop.org/show_bug.cgi?id=103232
[fdo#103540]: https://bugs.freedesktop.org/show_bug.cgi?id=103540
[fdo#105411]: https://bugs.freedesktop.org/show_bug.cgi?id=105411
[fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
[fdo#109661]: https://bugs.freedesktop.org/show_bug.cgi?id=109661
[fdo#110789]: https://bugs.freedesktop.org/show_bug.cgi?id=110789
[fdo#111780]: https://bugs.freedesktop.org/show_bug.cgi?id=111780
[fdo#111781]: https://bugs.freedesktop.org/show_bug.cgi?id=111781
[fdo#111870]: https://bugs.freedesktop.org/show_bug.cgi?id=111870
[fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912
Participating hosts (11 -> 8)
------------------------------
Missing (3): pig-skl-6260u pig-glk-j5005 pig-hsw-4770r
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_5313 -> IGTPW_3778
* Piglit: piglit_4509 -> None
CI-20190529: 20190529
CI_DRM_7438: 8a2661592e79e48bcba9c24565b2b16edafbcbaa @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_3778: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/index.html
IGT_5313: 92caadb4e551ba05aa6e6e567ef69da96ca7e328 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3778/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
* [igt-dev] ✗ Fi.CI.IGT: failure for Add GEM_MMAP_OFFSET support in IGT. (rev7)
2019-11-26 17:25 [igt-dev] [PATCH i-g-t v4 0/3] Add GEM_MMAP_OFFSET support in IGT Zbigniew Kempczyński
` (8 preceding siblings ...)
2019-11-29 19:26 ` [igt-dev] ✗ Fi.CI.IGT: failure for Add GEM_MMAP_OFFSET support in IGT. (rev5) Patchwork
@ 2019-11-29 19:35 ` Patchwork
9 siblings, 0 replies; 19+ messages in thread
From: Patchwork @ 2019-11-29 19:35 UTC (permalink / raw)
To: Chris Wilson; +Cc: igt-dev
== Series Details ==
Series: Add GEM_MMAP_OFFSET support in IGT. (rev7)
URL : https://patchwork.freedesktop.org/series/69973/
State : failure
== Summary ==
CI Bug Log - changes from CI_DRM_7438_full -> IGTPW_3779_full
====================================================
Summary
-------
**FAILURE**
Serious unknown changes coming with IGTPW_3779_full absolutely need to be
verified manually.
If you think the reported changes have nothing to do with the changes
introduced in IGTPW_3779_full, please notify your bug team to allow them
to document this new failure mode, which will reduce false positives in CI.
External URL: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/index.html
Possible new issues
-------------------
Here are the unknown changes that may have been introduced in IGTPW_3779_full:
### IGT changes ###
#### Possible regressions ####
* igt@gem_tiled_wb:
- shard-hsw: [PASS][1] -> [FAIL][2] +1 similar issue
[1]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-hsw2/igt@gem_tiled_wb.html
[2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-hsw8/igt@gem_tiled_wb.html
* igt@gem_tiled_wc:
- shard-glk: [PASS][3] -> [FAIL][4] +1 similar issue
[3]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-glk8/igt@gem_tiled_wc.html
[4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-glk1/igt@gem_tiled_wc.html
- shard-apl: [PASS][5] -> [FAIL][6] +1 similar issue
[5]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl1/igt@gem_tiled_wc.html
[6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-apl4/igt@gem_tiled_wc.html
- shard-snb: [PASS][7] -> [FAIL][8] +1 similar issue
[7]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-snb6/igt@gem_tiled_wc.html
[8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-snb1/igt@gem_tiled_wc.html
New tests
---------
New tests have been introduced between CI_DRM_7438_full and IGTPW_3779_full:
### New IGT tests (7) ###
* igt@gem_mmap_offset@bad-flags:
- Statuses : 3 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@bad-object:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@basic-uaf:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@clear:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@close-race:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@isolation:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
* igt@gem_mmap_offset@pf-nonblock:
- Statuses : 4 skip(s)
- Exec time: [0.0] s
Known issues
------------
Here are the changes found in IGTPW_3779_full that come from known issues:
### IGT changes ###
#### Issues hit ####
* igt@gem_ctx_isolation@bcs0-s3:
- shard-apl: [PASS][9] -> [DMESG-WARN][10] ([fdo#108566]) +4 similar issues
[9]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl3/igt@gem_ctx_isolation@bcs0-s3.html
[10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-apl4/igt@gem_ctx_isolation@bcs0-s3.html
* igt@gem_userptr_blits@dmabuf-sync:
- shard-snb: [PASS][11] -> [DMESG-WARN][12] ([fdo#111870])
[11]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-snb5/igt@gem_userptr_blits@dmabuf-sync.html
[12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-snb6/igt@gem_userptr_blits@dmabuf-sync.html
* igt@i915_selftest@live_perf:
- shard-hsw: [PASS][13] -> [INCOMPLETE][14] ([fdo#103540])
[13]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-hsw2/igt@i915_selftest@live_perf.html
[14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-hsw2/igt@i915_selftest@live_perf.html
* igt@kms_cursor_crc@pipe-b-cursor-256x85-random:
- shard-apl: [PASS][15] -> [FAIL][16] ([fdo#103232])
[15]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl1/igt@kms_cursor_crc@pipe-b-cursor-256x85-random.html
[16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-apl1/igt@kms_cursor_crc@pipe-b-cursor-256x85-random.html
* igt@kms_setmode@basic:
- shard-apl: [PASS][17] -> [FAIL][18] ([fdo#99912])
[17]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl7/igt@kms_setmode@basic.html
[18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-apl1/igt@kms_setmode@basic.html
#### Possible fixes ####
* igt@gem_ctx_persistence@rcs0-mixed-process:
- shard-apl: [FAIL][19] -> [PASS][20]
[19]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl7/igt@gem_ctx_persistence@rcs0-mixed-process.html
[20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-apl8/igt@gem_ctx_persistence@rcs0-mixed-process.html
* igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy:
- shard-snb: [DMESG-WARN][21] ([fdo#110789] / [fdo#111870]) -> [PASS][22]
[21]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-snb1/igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy.html
[22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-snb1/igt@gem_userptr_blits@map-fixed-invalidate-overlap-busy.html
* igt@gem_userptr_blits@sync-unmap-cycles:
- shard-snb: [DMESG-WARN][23] ([fdo#111870]) -> [PASS][24] +1 similar issue
[23]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-snb4/igt@gem_userptr_blits@sync-unmap-cycles.html
[24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-snb1/igt@gem_userptr_blits@sync-unmap-cycles.html
- shard-hsw: [DMESG-WARN][25] ([fdo#111870]) -> [PASS][26] +3 similar issues
[25]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-hsw4/igt@gem_userptr_blits@sync-unmap-cycles.html
[26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-hsw8/igt@gem_userptr_blits@sync-unmap-cycles.html
* igt@i915_suspend@sysfs-reader:
- shard-apl: [DMESG-WARN][27] ([fdo#108566]) -> [PASS][28] +1 similar issue
[27]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl1/igt@i915_suspend@sysfs-reader.html
[28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-apl7/igt@i915_suspend@sysfs-reader.html
* igt@kms_cursor_crc@pipe-b-cursor-128x42-random:
- shard-apl: [FAIL][29] ([fdo#103232]) -> [PASS][30]
[29]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-apl6/igt@kms_cursor_crc@pipe-b-cursor-128x42-random.html
[30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-apl3/igt@kms_cursor_crc@pipe-b-cursor-128x42-random.html
* igt@kms_flip@flip-vs-suspend:
- shard-hsw: [INCOMPLETE][31] ([fdo#103540]) -> [PASS][32]
[31]: https://intel-gfx-ci.01.org/tree/drm-tip/CI_DRM_7438/shard-hsw7/igt@kms_flip@flip-vs-suspend.html
[32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/shard-hsw7/igt@kms_flip@flip-vs-suspend.html
[fdo#103232]: https://bugs.freedesktop.org/show_bug.cgi?id=103232
[fdo#103540]: https://bugs.freedesktop.org/show_bug.cgi?id=103540
[fdo#108566]: https://bugs.freedesktop.org/show_bug.cgi?id=108566
[fdo#110789]: https://bugs.freedesktop.org/show_bug.cgi?id=110789
[fdo#111870]: https://bugs.freedesktop.org/show_bug.cgi?id=111870
[fdo#99912]: https://bugs.freedesktop.org/show_bug.cgi?id=99912
Participating hosts (11 -> 8)
------------------------------
Missing (3): pig-skl-6260u pig-glk-j5005 pig-hsw-4770r
Build changes
-------------
* CI: CI-20190529 -> None
* IGT: IGT_5313 -> IGTPW_3779
* Piglit: piglit_4509 -> None
CI-20190529: 20190529
CI_DRM_7438: 8a2661592e79e48bcba9c24565b2b16edafbcbaa @ git://anongit.freedesktop.org/gfx-ci/linux
IGTPW_3779: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/index.html
IGT_5313: 92caadb4e551ba05aa6e6e567ef69da96ca7e328 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools
piglit_4509: fdc5a4ca11124ab8413c7988896eec4c97336694 @ git://anongit.freedesktop.org/piglit
== Logs ==
For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_3779/index.html
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
^ permalink raw reply [flat|nested] 19+ messages in thread
end of thread, other threads:[~2019-11-29 19:35 UTC | newest]
Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-11-26 17:25 [igt-dev] [PATCH i-g-t v4 0/3] Add GEM_MMAP_OFFSET support in IGT Zbigniew Kempczyński
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 1/3] include/drm-uapi/i915_drm: Add defs for mmap_offset Zbigniew Kempczyński
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 2/3] lib/i915/gem_mman: add mmap_offset support Zbigniew Kempczyński
2019-11-28 14:38 ` Chris Wilson
2019-11-28 14:43 ` Chris Wilson
2019-11-26 17:25 ` [igt-dev] [PATCH i-g-t v4 3/3] tests/i915/gem_mmap_offset: Add new API test for gem_mmap_offset Zbigniew Kempczyński
2019-11-28 12:55 ` [igt-dev] [PATCH i-g-t] " Chris Wilson
2019-11-28 12:59 ` Chris Wilson
2019-11-28 13:38 ` Petri Latvala
2019-11-28 13:05 ` Chris Wilson
2019-11-28 13:10 ` Chris Wilson
2019-11-26 18:24 ` [igt-dev] ✓ Fi.CI.BAT: success for Add GEM_MMAP_OFFSET support in IGT. (rev4) Patchwork
2019-11-26 18:26 ` Chris Wilson
2019-11-27 5:22 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
2019-11-28 13:05 ` [igt-dev] ✗ GitLab.Pipeline: warning for Add GEM_MMAP_OFFSET support in IGT. (rev5) Patchwork
2019-11-28 13:20 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
2019-11-28 13:43 ` [igt-dev] ✓ Fi.CI.BAT: success for Add GEM_MMAP_OFFSET support in IGT. (rev7) Patchwork
2019-11-29 19:26 ` [igt-dev] ✗ Fi.CI.IGT: failure for Add GEM_MMAP_OFFSET support in IGT. (rev5) Patchwork
2019-11-29 19:35 ` [igt-dev] ✗ Fi.CI.IGT: failure for Add GEM_MMAP_OFFSET support in IGT. (rev7) Patchwork
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox