[Intel-gfx] [PATCH 5/7] drm/i915/vlv: Increase the utilization of stolen memory on VLV.

Daniel Vetter daniel at ffwll.ch
Fri Jan 10 10:26:52 CET 2014


On Fri, Jan 10, 2014 at 08:40:34AM +0000, Goel, Akash wrote:
> >> For your usecase, have you tried to simply reduce the stolen area as
> >>  much as possible? Our friendly competition on ARM SoCs seems to have
> >>  mostly moved away from gfx reserved chunks towards more flexible
> >>  approaches like CMA. Giving stolen back to the linux page allocator
> >>  should be possible, but I haven't really looked into that yet all that
> >>  much ...
> 
> This is the first option we explored, as it would have made our task
> also simple. There is a Hw bug on BYT, due to which either the
> allocation of Stolen area can be completely disabled or the next
> allocation has to be of 64 MB only.  But this limitation will not be
> present on upcoming platforms.
> 
> >> - object_pin is the wrong place to change the backing storage since
> >>  someone else could already have pinned the it (e.g. through dma-buf). We
> >>  need to do this earlier before calling down into ->get_pages.
> 
> We had an option to allocate the backing storage from stolen area, at
> the time when a GEM object is associated with a User created frame
> buffer (drm_mode_addfb2).  But we often saw that pool of Frame buffer
> objects were getting created, but not all them were getting used. So we
> thought that it will be more optimal, if we reserve the stolen space
> when the object actually starts to gets used, i.e. when it is being
> mapped to GTT.  In order to handle the dma-buf case (for User frame
> buffers) we can add a new check, so as not to consider using stolen area
> for such objects.

Correct purgeable semantics with shared objects is still an open for
shared buffers. An option would be to introduce the concept of weak/strong
userspace references to dma-buf/gem objects and allow a buffer to be
purged if there's no strong reference. A bit more work though.

> >> - If we allow opportunistical placement of objects into stolen memory I
> >>  think we should also fully support purgeable objects so that we can
> >>  dynamically scale to workloads. Or at least to be able to kick out stuff
> >>  in case the kernel needs the contiguous memory for something more
> >>  important. So if we couldn't find a suitable stolen block we'd scan
> >>  through all objects with stolen memory backing and check whether any
> >>   purgeable objects could be kicked out.
> 
> Actually we didn't expected much value-add on having the
> purging/truncate logic for Frame buffer objects also allocated from
> stolen area.  We saw that Frame buffer objects were being used as shared
> objects only & not as local objects. So the cacheing/purging logic in
> libdrm will not really apply to them, until unless the gem_madvise ioctl
> call is used to truncate the objects.  But on our UFO (OGL & Media)
> drivers side, currently the gem_madvise ioctl call is not being used.
> So until the frame buffer object itself is destroyed, it cannot be
> purged before that.  On Android side, as the 'swap' is disabled, the
> physical space of the GEM objects cannot be reclaimed by releasing the
> ref count on the underlying Physical pages (put_pages).  The purging
> from the GEM shrinker side, will be really effective in relinquishing
> the backing physical space, only when the objects are marked as
> purgeable.  We can try to add the support to purge/truncate logic for
> the stolen objects, in order to create room in stolen space for a new
> frame buffer. 

Well the caching/purging will be interesting once we have use stolen in
general where it's useful, e.g. for accelarated media decode using large
page ptes.

> >> For upstream I think changing the personality of buffer objects behind
> >>  userspace's back is a bit too frisky wrt breaking something. I prefer if
> >>  userspace opts-in explicitly by passing a flag to the create ioctl
> >>  stating that stolen memory is allowed/preferred for this allocation.
> >>  Chris Wilson posted an rfc patch a while back to add a create2 ioctl
> >>  (which at the same time also allows us to set the caching, tiling and
> >>  any other object parameters).
> 
> Yes, agree that is not cleanest of a solution, but we didn't had an
> option of introducing a new API/interface.  But the change is limited
> only to User created frame buffer GEM objects.  What new constraints we
> will be introducing if we go ahead with this design for Frame buffers.
> The mmap_gtt interface can still be used for these GEM objects.

It breaks pwrite/pread and cpu mmaps. Yes, we've had old userspace that
uses this on X-tiled buffers and breaking them isn't an option for
upstream really.

One thing I don't understand is why you can't use a new ioctl. You've
emphasised this point a few times by now, but I don't understand the
reasons for it ... Please elaborate.

Cheers, Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch



More information about the Intel-gfx mailing list