Skip to content

Commit

Permalink
drm: Apply kref_put_mutex() optimisations to drm_gem_object_unreferen…
Browse files Browse the repository at this point in the history
…ce_unlocked()

We can apply the same optimisation tricks as kref_put_mutex() in our
local equivalent function. However, we have a different locking semantic
(we unlock ourselves, in kref_put_mutex() the callee unlocks) so that we
can use the same callbacks for both locked and unlocked kref_put()s and
so can not simply convert to using kref_put_mutex() directly.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Dave Airlie <airlied@redhat.com>
  • Loading branch information
Chris Wilson authored and Dave Airlie committed Aug 7, 2013
1 parent 43387b3 commit 7fc65eb
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions include/drm/drmP.h
Original file line number Diff line number Diff line change
Expand Up @@ -1629,10 +1629,12 @@ drm_gem_object_unreference(struct drm_gem_object *obj)
static inline void
drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
{
if (obj != NULL) {
if (obj && !atomic_add_unless(&obj->refcount.refcount, -1, 1)) {
struct drm_device *dev = obj->dev;

mutex_lock(&dev->struct_mutex);
kref_put(&obj->refcount, drm_gem_object_free);
if (likely(atomic_dec_and_test(&obj->refcount.refcount)))
drm_gem_object_free(&obj->refcount);
mutex_unlock(&dev->struct_mutex);
}
}
Expand Down

0 comments on commit 7fc65eb

Please sign in to comment.