[Intel-gfx] [RFC PATCH i-g-t v4 2/4] lib: Add minimum GTT alignment helper
Janusz Krzysztofik
janusz.krzysztofik at linux.intel.com
Mon Nov 4 14:40:05 UTC 2019
Hi Vanshi,
On Thursday, October 31, 2019 5:58:31 PM CET Vanshidhar Konda wrote:
> On Thu, Oct 31, 2019 at 04:28:55PM +0100, Janusz Krzysztofik wrote:
> >Some tests assume 4kB offset alignment while using softpin. That
> >assumption may be wrong on future GEM backends with possibly larger
> >minimum page sizes. As a result, those tests may either fail on
> >softpin at offsets which are incorrectly aligned, may silently skip
> >such incorrectly aligned addresses assuming them occupied by other
> >users if incorrect detection method is used, or may always succeed
> >when examining invalid use patterns.
> >
> >Provide a helper function that detects minimum GTT alignment. Tests
> >may use it to calculate softpin offsets valid for actually used backing
> >store.
> >
> >v2: Rename the helper, use 'minimum GTT alignment' term across the
> > change (Chris),
> > - use error numbers to distinguish between invalid offsets and
> > addresses occupied by other users, then
> > - simplify the code (Chris).
> >
> >Signed-off-by: Janusz Krzysztofik <janusz.krzysztofik at linux.intel.com>
> >Cc: Chris Wilson <chris at chris-wilson.co.uk>
> >Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> >Cc: Stuart Summers <stuart.summers at intel.com>
> >---
> > lib/ioctl_wrappers.c | 46 ++++++++++++++++++++++++++++++++++++++++++++
> > lib/ioctl_wrappers.h | 2 ++
> > 2 files changed, 48 insertions(+)
> >
> >diff --git a/lib/ioctl_wrappers.c b/lib/ioctl_wrappers.c
> >index 628f8b83..f0ef8b2e 100644
> >--- a/lib/ioctl_wrappers.c
> >+++ b/lib/ioctl_wrappers.c
> >@@ -54,6 +54,7 @@
> > #include "intel_io.h"
> > #include "igt_debugfs.h"
> > #include "igt_sysfs.h"
> >+#include "igt_x86.h"
> > #include "config.h"
> >
> > #ifdef HAVE_VALGRIND
> >@@ -1158,6 +1159,51 @@ bool gem_has_softpin(int fd)
> > return has_softpin;
> > }
> >
> >+/**
> >+ * gem_gtt_min_alignment_order:
> >+ * @fd: open i915 drm file descriptor
> >+ *
> >+ * This function detects the minimum possible alignment of a soft-pinned gem
> >+ * object allocated from a default backing store. It is useful for calculating
> >+ * correctly aligned softpin offsets.
> >+ * Since size order to size conversion (size = 1 << order) is less trivial
> >+ * than the opposite, the function returns the alignment order as more handy.
> >+ *
> >+ * Returns:
> >+ * Size order of the minimum GTT alignment
> >+ */
> >+int gem_gtt_min_alignment_order(int fd)
> >+{
> >+ struct drm_i915_gem_exec_object2 obj;
> >+ struct drm_i915_gem_execbuffer2 eb;
> >+ const uint32_t bbe = MI_BATCH_BUFFER_END;
> >+ int order;
> >+
> >+ /* no softpin => 4kB page size */
> >+ if (!gem_has_softpin(fd))
> >+ return 12;
> >+
> >+ memset(&obj, 0, sizeof(obj));
> >+ memset(&eb, 0, sizeof(eb));
> >+
> >+ obj.handle = gem_create(fd, 4096);
> >+ obj.flags = EXEC_OBJECT_PINNED | EXEC_OBJECT_SUPPORTS_48B_ADDRESS;
> >+ eb.buffers_ptr = to_user_pointer(&obj);
> >+ eb.buffer_count = 1;
> >+ gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
>
> I think it will be safer to create a new context to execute this
> execbuffer. For a new context the address space should be empty reducing
> the chance that there is another object mapped by the caller of the
> helper function at the address we start testing.
AFAICU, that shouldn't matter. Object attributes are validated and possibly
-EINVAL is returned already before an eviction is possibly attempted. The
algorithm assumes an offset is valid if any error code other than -EINVAL
(including no error) is returned.
Thanks,
Janusz
>
> Otherwise it looks good to me.
>
> Vanshi
>
> >+
> >+ for (order = 12; order < 64; order++) {
> >+ obj.offset = 1ull << order;
> >+ if (__gem_execbuf(fd, &eb) != -EINVAL)
> >+ break;
> >+ }
> >+ igt_assert(obj.offset < gem_aperture_size(fd));
> >+
> >+ gem_close(fd, obj.handle);
> >+ igt_debug("minimum GTT alignment is %#llx\n", (long long)obj.offset);
> >+ return order;
> >+}
> >+
> > /**
> > * gem_has_exec_fence:
> > * @fd: open i915 drm file descriptor
> >diff --git a/lib/ioctl_wrappers.h b/lib/ioctl_wrappers.h
> >index 03211c97..c8d57a7c 100644
> >--- a/lib/ioctl_wrappers.h
> >+++ b/lib/ioctl_wrappers.h
> >@@ -138,6 +138,8 @@ uint64_t gem_aperture_size(int fd);
> > uint64_t gem_global_aperture_size(int fd);
> > uint64_t gem_mappable_aperture_size(void);
> > bool gem_has_softpin(int fd);
> >+int gem_gtt_min_alignment_order(int fd);
> >+#define gem_gtt_min_alignment(fd) (1ull << gem_gtt_min_alignment_order(fd))
> > bool gem_has_exec_fence(int fd);
> >
> > /* check functions which auto-skip tests by calling igt_skip() */
>
More information about the Intel-gfx
mailing list