From patchwork Thu Nov 25 21:40:05 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 357472 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oAPLeKD0032101 for ; Thu, 25 Nov 2010 21:40:40 GMT Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 135BF9F30A for ; Thu, 25 Nov 2010 13:40:19 -0800 (PST) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mga14.intel.com (mga14.intel.com [143.182.124.37]) by gabe.freedesktop.org (Postfix) with ESMTP id 1B28B9EE93 for ; Thu, 25 Nov 2010 13:40:10 -0800 (PST) Received: from azsmga001.ch.intel.com ([10.2.17.19]) by azsmga102.ch.intel.com with ESMTP; 25 Nov 2010 13:40:09 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.59,256,1288594800"; d="scan'208";a="353315123" Received: from unknown (HELO cantiga.alporthouse.com) ([10.255.16.26]) by azsmga001.ch.intel.com with ESMTP; 25 Nov 2010 13:40:08 -0800 From: Chris Wilson To: dri-devel@lists.freedesktop.org Subject: [PATCH] drm: Replace kref with a simple atomic reference count Date: Thu, 25 Nov 2010 21:40:05 +0000 Message-Id: <1290721205-32433-1-git-send-email-chris@chris-wilson.co.uk> X-Mailer: git-send-email 1.7.2.3 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.11 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org Errors-To: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Thu, 25 Nov 2010 21:40:40 +0000 (UTC) diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index ea1c4b0..874e776 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -141,7 +141,7 @@ int drm_gem_object_init(struct drm_device *dev, if (IS_ERR(obj->filp)) return -ENOMEM; - kref_init(&obj->refcount); + atomic_set(&obj->refcount, 1); atomic_set(&obj->handle_count, 0); obj->size = size; @@ -436,9 +436,8 @@ EXPORT_SYMBOL(drm_gem_object_release); * Frees the object */ void -drm_gem_object_free(struct kref *kref) +drm_gem_object_free(struct drm_gem_object *obj) { - struct drm_gem_object *obj = (struct drm_gem_object *) kref; struct drm_device *dev = obj->dev; BUG_ON(!mutex_is_locked(&dev->struct_mutex)); @@ -448,11 +447,6 @@ drm_gem_object_free(struct kref *kref) } EXPORT_SYMBOL(drm_gem_object_free); -static void drm_gem_object_ref_bug(struct kref *list_kref) -{ - BUG(); -} - /** * Called after the last handle to the object has been closed * @@ -476,7 +470,7 @@ void drm_gem_object_handle_free(struct drm_gem_object *obj) * * This cannot be the last reference, since the handle holds one too. */ - kref_put(&obj->refcount, drm_gem_object_ref_bug); + atomic_dec(&obj->refcount); } else spin_unlock(&dev->object_name_lock); diff --git a/drivers/gpu/drm/drm_info.c b/drivers/gpu/drm/drm_info.c index 3cdbaf3..4a80bd8 100644 --- a/drivers/gpu/drm/drm_info.c +++ b/drivers/gpu/drm/drm_info.c @@ -256,7 +256,7 @@ int drm_gem_one_name_info(int id, void *ptr, void *data) seq_printf(m, "%6d %8zd %7d %8d\n", obj->name, obj->size, atomic_read(&obj->handle_count), - atomic_read(&obj->refcount.refcount)); + atomic_read(&obj->refcount)); return 0; } diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 2b33980..f332c56 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h @@ -609,7 +609,7 @@ struct drm_gem_mm { */ struct drm_gem_object { /** Reference count of this object */ - struct kref refcount; + atomic_t refcount; /** Handle count of this object. Each handle also holds a reference */ atomic_t handle_count; /* number of handles on this object */ @@ -1504,7 +1504,7 @@ extern void drm_sysfs_connector_remove(struct drm_connector *connector); int drm_gem_init(struct drm_device *dev); void drm_gem_destroy(struct drm_device *dev); void drm_gem_object_release(struct drm_gem_object *obj); -void drm_gem_object_free(struct kref *kref); +void drm_gem_object_free(struct drm_gem_object *obj); struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev, size_t size); int drm_gem_object_init(struct drm_device *dev, @@ -1519,23 +1519,25 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma); static inline void drm_gem_object_reference(struct drm_gem_object *obj) { - kref_get(&obj->refcount); + atomic_inc(&obj->refcount); + smp_mb__after_atomic_inc(); } static inline void drm_gem_object_unreference(struct drm_gem_object *obj) { - if (obj != NULL) - kref_put(&obj->refcount, drm_gem_object_free); + if (obj != NULL && atomic_dec_and_test(&obj->refcount)) + drm_gem_object_free(obj); } static inline void drm_gem_object_unreference_unlocked(struct drm_gem_object *obj) { - if (obj != NULL) { + if (obj != NULL && atomic_dec_and_test(&obj->refcount)) { struct drm_device *dev = obj->dev; mutex_lock(&dev->struct_mutex); - kref_put(&obj->refcount, drm_gem_object_free); + if (atomic_read(&obj->refcount) == 0) + drm_gem_object_free(obj); mutex_unlock(&dev->struct_mutex); } }