[Intel-gfx] [PATCH 17/25] drm/i915/selftests: Fill all the drm_vma_manager holes
Chris Wilson
chris at chris-wilson.co.uk
Mon Nov 11 12:09:02 UTC 2019
Quoting Matthew Auld (2019-11-11 12:01:54)
> On 10/11/2019 18:57, Chris Wilson wrote:
> > To test mmap_offset_exhaustion, we first have to fill the entire vma
> > manager leaving a single page. Don't assume that the vma manager is not
> > already fragment, and fill all the holes.
> >
> > Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> > Cc: Matthew Auld <matthew.auld at intel.com>
>
> Why is there anything in vm_addr_space_mm at this point? Just leftovers
> from a previous test which have yet to be cleaned up?
Looks at Matthew, yes why is there anything here? :-p
If it helps, the issue is only on lmem and goes away after flushing all
the requests -- so some object we used during GT init had an
mmap_offset.
> > ---
> > .../drm/i915/gem/selftests/i915_gem_mman.c | 45 ++++++++++++++-----
> > 1 file changed, 33 insertions(+), 12 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
> > index cabf45b1403f..b307574e3f3b 100644
> > --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
> > +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_mman.c
> > @@ -607,28 +607,43 @@ static int igt_mmap_offset_exhaustion(void *arg)
> > struct drm_i915_private *i915 = arg;
> > struct drm_mm *mm = &i915->drm.vma_offset_manager->vm_addr_space_mm;
> > struct drm_i915_gem_object *obj;
> > - struct drm_mm_node resv, *hole;
> > - u64 hole_start, hole_end;
> > + struct drm_mm_node *hole, *next;
> > int loop, err;
> >
> > /* Disable background reaper */
> > disable_retire_worker(i915);
> > GEM_BUG_ON(!i915->gt.awake);
> > + intel_gt_retire_requests(&i915->gt);
> > + i915_gem_drain_freed_objects(i915);
> >
> > /* Trim the device mmap space to only a page */
> > - memset(&resv, 0, sizeof(resv));
> > - drm_mm_for_each_hole(hole, mm, hole_start, hole_end) {
> > - resv.start = hole_start;
> > - resv.size = hole_end - hole_start - 1; /* PAGE_SIZE units */
> > - mmap_offset_lock(i915);
> > - err = drm_mm_reserve_node(mm, &resv);
> > - mmap_offset_unlock(i915);
> > + mmap_offset_lock(i915);
> > + loop = 1; /* PAGE_SIZE units */
> > + list_for_each_entry_safe(hole, next, &mm->hole_stack, hole_stack) {
> > + struct drm_mm_node *resv;
> > +
> > + resv = kzalloc(sizeof(*resv), GFP_NOWAIT);
> > + if (!resv) {
> > + err = -ENOMEM;
> > + goto out_park;
> > + }
> > +
> > + resv->start = drm_mm_hole_node_start(hole) + loop;
> > + resv->size = hole->hole_size - loop;
> > + resv->color = -1ul;
> > + loop = 0;
>
> Praying that there isn't a one page hole at the start.
True, unlikely but easy enough to skip.
-Chris
More information about the Intel-gfx
mailing list