[igt-dev] [PATCH i-g-t 1/2] lib/i915/gem_mman: Add coherent mmap api support with set domain
Telukuntla, Sreedhar
sreedhar.telukuntla at intel.com
Tue Feb 18 03:53:28 UTC 2020
> -----Original Message-----
> From: Chris Wilson <chris at chris-wilson.co.uk>
> Sent: Monday, February 17, 2020 9:59 PM
> To: Telukuntla, Sreedhar <sreedhar.telukuntla at intel.com>; igt-
> dev at lists.freedesktop.org
> Cc: Ursulin, Tvrtko <tvrtko.ursulin at intel.com>
> Subject: Re: [igt-dev] [PATCH i-g-t 1/2] lib/i915/gem_mman: Add coherent
> mmap api support with set domain
>
> Quoting Sreedhar Telukuntla (2020-02-18 00:17:09)
> > gem_mmap__device_coherent_domain api maps buffer object and returns
> > the memory domain to be used by the caller for subsequent set_domain
> > call for cpu access.
> >
> > gem_mmap__device_coherent_sync api maps buffer object and also does
> > set_domain to make the memory ready for cpu access.
> >
> > Signed-off-by: Sreedhar Telukuntla <sreedhar.telukuntla at intel.com>
> > Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> > ---
> > lib/i915/gem_mman.c | 76
> > ++++++++++++++++++++++++++++++++++++++++++---
> > lib/i915/gem_mman.h | 6 +++-
> > 2 files changed, 77 insertions(+), 5 deletions(-)
> >
> > diff --git a/lib/i915/gem_mman.c b/lib/i915/gem_mman.c index
> > 08ae6769..b8d20c07 100644
> > --- a/lib/i915/gem_mman.c
> > +++ b/lib/i915/gem_mman.c
> > @@ -345,21 +345,25 @@ void *gem_mmap_offset__wc(int fd, uint32_t
> handle, uint64_t offset,
> > * @offset: offset in the gem buffer of the mmap arena
> > * @size: size of the mmap arena
> > * @prot: memory protection bits as used by mmap()
> > + * @domain: cache domain used for 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)
> > + uint64_t size, unsigned prot,
> > + uint32_t *domain)
> > {
> > 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);
> > + *domain = I915_GEM_DOMAIN_WC;
> >
> > + if (!ptr) {
> > + ptr = __gem_mmap__gtt(fd, handle, size, prot);
> > + *domain = I915_GEM_DOMAIN_GTT;
> > + }
> > return ptr;
> > }
> >
> > @@ -382,15 +386,79 @@ void *gem_mmap__device_coherent(int fd,
> uint32_t handle, uint64_t offset,
> > uint64_t size, unsigned prot) {
> > void *ptr;
> > + uint32_t domain;
> >
> > igt_assert(offset == 0);
> >
> > - ptr = __gem_mmap__device_coherent(fd, handle, offset, size, prot);
> > + ptr = __gem_mmap__device_coherent(fd, handle, offset, size,
> > + prot, &domain);
> > igt_assert(ptr);
> >
> > return ptr;
> > }
> >
> > +/**
> > + * gem_mmap__device_coherent_domain:
> > + * @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()
> > + * @domain: memory domain to be used by the caller for set_domain
> > +after mmap
> > + *
> > + * Call __gem_mmap__device__coherent_domain(), 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_domain(int fd, uint32_t handle,
> uint64_t offset,
> > + uint64_t size, unsigned prot, uint32_t
> > +*domain) {
> > + void *ptr;
> > +
> > + igt_assert(offset == 0);
> > +
> > + ptr = __gem_mmap__device_coherent(fd, handle, offset, size, prot,
> domain);
> > + igt_assert(ptr);
> > +
> > + return ptr;
> > +}
> > +
> > +/**
> > + * gem_mmap__device_coherent_sync:
> > + * @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_sync(), 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.
> > + *
> > + * This function sets appropriate memory domain as well once the
> > +mapping is
> > + * complete and makes the memory ready for cpu access
> > + *
> > + * Returns: A pointer to the created memory mapping.
> > + */
> > +void *gem_mmap__device_coherent_sync(int fd, uint32_t handle, uint64_t
> offset,
> > + uint64_t size, unsigned prot) {
> > + void *ptr;
> > + uint32_t domain;
> > +
> > + igt_assert(offset == 0);
> > +
> > + ptr = gem_mmap__device_coherent_domain(fd, handle, offset, size,
> prot, &domain);
> > + igt_assert(ptr);
> > +
> > + gem_set_domain(fd, handle, domain, domain);
>
> No. Read/write is important, especially when there are comments indicating
> that the api is being subverted and abused.
I didn’t understand your comment. Is it about read/write domain usage here? Are you suggesting not to use gem_set_domain in this way?
Regards,
Sreedhar
> -Chris
More information about the igt-dev
mailing list