From: Daniel Vetter <daniel@ffwll.ch>
To: Chris Wilson <chris@chris-wilson.co.uk>,
Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>,
Intel-gfx@lists.freedesktop.org,
Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Subject: Re: [PATCH i-g-t] tests/gem_ppgtt: Check for vm leaks with flink and ppgtt
Date: Mon, 20 Apr 2015 09:25:53 -0700 [thread overview]
Message-ID: <20150420162553.GH14565@bremse> (raw)
In-Reply-To: <20150420125048.GB17348@nuc-i3427.alporthouse.com>
On Mon, Apr 20, 2015 at 01:50:48PM +0100, Chris Wilson wrote:
> On Mon, Apr 20, 2015 at 01:14:14PM +0100, Tvrtko Ursulin wrote:
> > From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> >
> > Using imported objects should not leak i915 vmas (and vms).
> >
> > In practice this simulates Xorg importing fbcon and leaking (or not) one vma
> > per Xorg startup cycle.
> >
> > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > Cc: Chris Wilson <chris@chris-wilson.co.uk>
> > ---
> > tests/gem_ppgtt.c | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 100 insertions(+)
> >
> > diff --git a/tests/gem_ppgtt.c b/tests/gem_ppgtt.c
> > index 5bf773c..9b5b3ee 100644
> > --- a/tests/gem_ppgtt.c
> > +++ b/tests/gem_ppgtt.c
> > @@ -200,6 +200,103 @@ static void surfaces_check(dri_bo **bo, int count, uint32_t expected)
> > }
> > }
> >
> > +static void flink_and_contexts(void)
> > +{
> > + drm_intel_bufmgr *bufmgr;
> > + int fd, fd2;
> > + dri_bo *bo;
> > + uint32_t flink_name;
> > + unsigned int max_line = 0, num_lines = 0, cnt = 0;
> > + int ret;
> > +
> > + /*
> > + * Export a bo via flink and access it from a child process via a
> > + * different ppggtt context. Make sure when child exists that the vma
> > + * (and hence the vm), associated with its ppgtt context, is torn down.
> > + */
> > +
> > + fd = drm_open_any();
> > +
> > + bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
> > + igt_assert(bufmgr);
> > +
> > + bo = create_bo(bufmgr, 0);
> > + igt_assert(bo);
> > +
> > + ret = drm_intel_bo_flink(bo, &flink_name);
> > + igt_assert(ret == 0);
> > +
> > + igt_fork(child, 20) {
> > + int devid;
> > + drm_intel_bufmgr *bufmgr;
> > + int fd;
> > + dri_bo *bo, *import;
> > + struct intel_batchbuffer *batch;
> > +
> > + fd = drm_open_any();
> > + devid = intel_get_drm_devid(fd);
> > +
> > + bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
> > + igt_assert(bufmgr);
> > +
> > + bo = create_bo(bufmgr, 0);
> > + import = drm_intel_bo_gem_create_from_name(bufmgr,
> > + "flink_and_contexts",
> > + flink_name);
> > + igt_assert(bo && import);
> > +
> > + batch = intel_batchbuffer_alloc(bufmgr, devid);
> > + igt_assert(batch);
> > +
> > + intel_copy_bo(batch, bo, import, SIZE);
>
> Do we care about any differentiation between the default per-file
> context and explicitly created contexts?
>
> > + intel_batchbuffer_free(batch);
> > +
> > + dri_bo_unreference(import);
> > + dri_bo_unreference(bo);
> > +
> > + drm_intel_bufmgr_destroy(bufmgr);
> > + close(fd);
> > +
> > + exit(0);
> > + }
> > +
> > + igt_waitchildren();
> > +
> > + /*
> > + * Count the longest line in the file which lists the vmas per object.
> > + * This might be a bit fragile so maybe there is a better way.
> > + */
>
> So what I was thinking was something along the lines of:
>
> /* record the return value from exec[0].offset */
> intel_copy_bo(&leaked_vma_offset);
>
> gem_close(exec[0].handle);
>
> /* flush execbuffer and the vma should be gone */
> gem_sync();
>
> intel_copy_bo(&new_vma_offset);
> igt_assert(new_vma_offset == leaked_vma_offset);
>
> Will take a bit of judicious planning (like doing a self-copy on the dst
> first to make sure it bound ahead of the leak and not reallocating the
> batch handle)
>
> Or alternatively, we know the name of the flinked object, so we can do
> an explicit search! Ok, that seems more robust, but you do some sync
> point in there (either gem_sync() every child before exit or
> gem_quiescent_gpu()).
Another option for making the leak check more robust is to allocate a few
test objects and double-check that the count we deduce
incremented/decremented by the correct amount. But checking the offsets
the kernel hands out from execbuf should work well too, we have a few
other tests relying upon that.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2015-04-20 16:25 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-20 12:14 [PATCH i-g-t] tests/gem_ppgtt: Check for vm leaks with flink and ppgtt Tvrtko Ursulin
2015-04-20 12:50 ` Chris Wilson
2015-04-20 14:56 ` Tvrtko Ursulin
2015-04-20 15:01 ` Chris Wilson
2015-04-20 16:25 ` Daniel Vetter [this message]
2015-04-23 9:30 ` [PATCH v2] [i-g-t] " daniele.ceraolospurio
2015-04-23 9:43 ` Chris Wilson
2015-04-23 10:14 ` Ceraolo Spurio, Daniele
2015-04-23 10:31 ` Chris Wilson
2015-04-23 11:23 ` [PATCH v3] " daniele.ceraolospurio
2015-04-23 11:36 ` Chris Wilson
2015-04-23 13:01 ` Ceraolo Spurio, Daniele
2015-04-23 13:09 ` Chris Wilson
2015-04-23 11:46 ` Tvrtko Ursulin
2015-04-23 14:39 ` [PATCH v4] " daniele.ceraolospurio
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150420162553.GH14565@bremse \
--to=daniel@ffwll.ch \
--cc=Intel-gfx@lists.freedesktop.org \
--cc=chris@chris-wilson.co.uk \
--cc=tvrtko.ursulin@intel.com \
--cc=tvrtko.ursulin@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.