From: Daniel Vetter <daniel@ffwll.ch>
To: DRI Development <dri-devel@lists.freedesktop.org>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Subject: Re: [PATCH] drm/gem: fix up flink name create race
Date: Wed, 24 Jul 2013 14:13:04 +0200 [thread overview]
Message-ID: <20130724121304.GS5939@phenom.ffwll.local> (raw)
In-Reply-To: <CAKMK7uF6VxbEfAqWzqXKST2kDha_LtKtO0sOaAWu4cELkxooxg@mail.gmail.com>
On Wed, Jul 24, 2013 at 11:02:02AM +0200, Daniel Vetter wrote:
> On Wed, Jul 24, 2013 at 8:04 AM, Daniel Vetter <daniel.vetter@ffwll.ch> wrote:
> > This is the 2nd attempt, I've always been a bit dissatisified with the
> > tricky nature of the first one:
> >
> > http://lists.freedesktop.org/archives/dri-devel/2012-July/025451.html
> >
> > The issue is that the flink ioctl can race with calling gem_close on
> > the last gem handle. In that case we'll end up with a zero handle
> > count, but an flink name (and it's corresponding reference). Which
> > results in a neat space leak.
> >
> > In my first attempt I've solved this by rechecking the handle count.
> > But fundamentally the issue is that ->handle_count isn't your usual
> > refcount - it can be resurrected from 0 among other things.
> >
> > For those special beasts atomic_t often suggest way more ordering that
> > it actually guarantees. To prevent being tricked by those hairy
> > semantics take the easy way out and simply protect the handle with the
> > existing dev->object_name_lock.
> >
> > With that change implemented it's dead easy to fix the flink vs. gem
> > close reace: When we try to create the name we simply have to check
> > whether there's still officially a gem handle around and if not refuse
> > to create the flink name. Since the handle count decrement and flink
> > name destruction is now also protected by that lock the reace is gone
> > and we can't ever leak the flink reference again.
> >
> > Outside of the drm core only the exynos driver looks at the handle
> > count, and tbh I have no idea why (it's just for debug dmesg output
> > luckily).
> >
> > I've considered inlining the drm_gem_object_handle_free, but I plan to
> > add more name-like things (like the exported dma_buf) to this scheme,
> > so it's clearer to leave the handle freeing in its own function.
> >
> > This is exercised by the new gem_flink_race i-g-t testcase, which on
> > my snb leaks gem objects at a rate of roughly 1k objects/s.
>
> That's actually incorrect since the leak I've found is just a race in
> the drm/i915 object tracking. So I need to go back to the drawing
> board and figure out which are the ghosts and which the dragons here.
>
> I've turned that testcase into an exercise for "drm/gem: completely
> close gem_open vs. gem_close races", but that race only results in
> userspace seeing different flink names for the same object. And that
> only happens if userspace is racy already.
>
> For this patch here I still think there's an issue, but I seriously
> need to restart my brain first and flush out the bogons with some
> coffee before I try again ;-)
Ok, I've written a second subtest now, and the race is indeed there and
I've managed to leak a few objects. It's rather hard to hit though, I get
a leak for roughly ever 1M attempts to provoke the race. But I'm rather
convinced now that the leak is indeed there ;-)
So I think the patch as-is stands as correct and required to block off
evil usespace.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
next prev parent reply other threads:[~2013-07-24 12:13 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-07-16 7:11 [PATCH 00/20] prime/flink fixes and related stuff Daniel Vetter
2013-07-16 7:11 ` [PATCH 01/20] drm: use common drm_gem_dmabuf_release in i915/exynos drivers Daniel Vetter
2013-07-16 7:11 ` [PATCH 02/20] drm/i915: unpin backing storage in dmabuf_unmap Daniel Vetter
2013-07-16 7:11 ` [PATCH 03/20] drm/i915: explicit store base gem object in dma_buf->priv Daniel Vetter
2013-07-16 7:11 ` [PATCH 04/20] drm/prime: add a bit of documentation about gem_obj->import_attach Daniel Vetter
2013-07-22 22:56 ` Rob Clark
2013-07-16 7:11 ` [PATCH 05/20] drm/gem: remove drm_gem_object_handle_unreference Daniel Vetter
2013-07-23 1:17 ` Rob Clark
2013-07-16 7:11 ` [PATCH 06/20] drm/gem: inline drm_gem_object_handle_reference Daniel Vetter
2013-07-23 12:07 ` Rob Clark
2013-07-23 12:31 ` Daniel Vetter
2013-07-23 12:43 ` Rob Clark
2013-07-24 0:00 ` Dave Airlie
2013-07-24 5:23 ` Daniel Vetter
2013-07-16 7:11 ` [PATCH 07/20] drm/gem: move drm_gem_object_handle_unreference_unlocked into drm_gem.c Daniel Vetter
2013-07-16 7:11 ` [PATCH 08/20] drm/gem: remove bogus NULL check from drm_gem_object_handle_unreference_unlocked Daniel Vetter
2013-07-16 7:12 ` [PATCH 09/20] drm/gem: WARN about unbalanced handle refcounts Daniel Vetter
2013-07-16 7:12 ` [PATCH 10/20] drm/gem: fix up flink name create race Daniel Vetter
2013-07-17 16:38 ` David Herrmann
2013-07-17 18:38 ` Daniel Vetter
2013-07-24 6:04 ` [PATCH] " Daniel Vetter
2013-07-24 9:02 ` Daniel Vetter
2013-07-24 12:13 ` Daniel Vetter [this message]
2013-07-16 7:12 ` [PATCH 11/20] drm/prime: fix error path in drm_gem_prime_fd_to_handle Daniel Vetter
2013-07-16 7:12 ` [PATCH 12/20] drm/gem: make drm_gem_object_handle_unreference_unlocked static Daniel Vetter
2013-07-17 16:41 ` David Herrmann
2013-07-17 18:40 ` Daniel Vetter
2013-07-16 7:12 ` [PATCH 13/20] drm/gem: create drm_gem_dumb_destroy Daniel Vetter
2013-07-22 22:52 ` Rob Clark
2013-07-23 6:24 ` Laurent Pinchart
2013-07-23 7:15 ` Inki Dae
2013-08-01 11:41 ` Patrik Jakobsson
2013-07-16 7:12 ` [PATCH 14/20] drm/prime: use proper pointer in drm_gem_prime_handle_to_fd Daniel Vetter
2013-07-16 7:12 ` [PATCH 15/20] drm/prime: shrink critical section protected by prime lock Daniel Vetter
2013-07-16 7:12 ` [PATCH 16/20] drm/prime: clarify logic a bit in drm_gem_prime_fd_to_handle Daniel Vetter
2013-07-16 7:12 ` [PATCH 17/20] drm/gem: switch dev->object_name_lock to a mutex Daniel Vetter
2013-07-16 7:12 ` [PATCH 18/20] drm/gem: completely close gem_open vs. gem_close races Daniel Vetter
2013-07-24 12:21 ` Daniel Vetter
2013-07-16 7:12 ` [PATCH 19/20] drm/prime: proper locking+refcounting for obj->dma_buf link Daniel Vetter
2013-07-16 7:12 ` [PATCH 20/20] drm/prime: Simplify drm_gem_remove_prime_handles Daniel Vetter
2013-07-27 9:22 ` [PATCH 00/20] prime/flink fixes and related stuff Inki Dae
2013-08-04 17:41 ` Daniel Vetter
2013-08-05 2:02 ` Inki Dae
2013-08-05 7:43 ` Daniel Vetter
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=20130724121304.GS5939@phenom.ffwll.local \
--to=daniel@ffwll.ch \
--cc=daniel.vetter@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox