Hi,

These patches may come through one or two times more, depending on how
well git-send-email works and how this lists handles posts from
non-subscribers.  Apologies in advance for any spamming I may have
incurred.

Anyway, these three patches implement a few things we discussed at XDS2007:

  1/3: Eliminate support for fake buffers.  Eric did the mesa side
work and this patch just removes support for this buffer type from the
kernel.

  2/3: Take bo type argument out of the ioctl interface.  Now that we
only have user and dc type buffers, we can remove the buffer type
argument from the ioctl completely and take buffer_start = 0 to mean
type_dc and buffer_start != 0 to mean user space buffer at that
address.  Also, the library wrapper had both "unsigned long start" and
"void *user_buffer" - I really could not see a use for both so I kept
only user_buffer.

  3/3: Drop destroy ioctls for fences and buffer objects. This patch
drop support for the destroy ioctl for both buffers and fences.
Instead, they're just refcounted so that when the last user drops its
last reference the object is destroyed.  This is implemented by just
making the owner/creator to also reference the object through a
drm_ref_object like all other user of the object.

cheers,
Kristian
From 3a541523242262ca9530b638cfc90baf4bc2dbd8 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Kristian=20H=C3=B8gsberg?= <[EMAIL PROTECTED]>
Date: Tue, 9 Oct 2007 13:35:09 -0400
Subject: [PATCH 1/3] Eliminate support for fake buffers.

---
 libdrm/xf86drm.c    |    9 ++----
 linux-core/drm_bo.c |   68 +-------------------------------------------------
 shared-core/drm.h   |    1 -
 3 files changed, 5 insertions(+), 73 deletions(-)

diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index dc18d6f..bb2b3ab 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -2726,9 +2726,6 @@ int drmBOCreate(int fd, unsigned long start, unsigned long size,
 	req->buffer_start = (unsigned long) user_buffer;
 	buf->virtual = user_buffer;
 	break;
-    case drm_bo_type_fake:
-        req->buffer_start = start;
-	break;
     default:
 	return -EINVAL;
     }
@@ -2751,7 +2748,7 @@ int drmBODestroy(int fd, drmBO *buf)
 {
     struct drm_bo_handle_arg arg;
     
-    if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) {
+    if (buf->mapVirtual) {
 	(void) drmUnmap(buf->mapVirtual, buf->start + buf->size);
 	buf->mapVirtual = NULL;
 	buf->virtual = NULL;
@@ -2792,7 +2789,7 @@ int drmBOUnReference(int fd, drmBO *buf)
 {
     struct drm_bo_handle_arg arg;
 
-    if (buf->mapVirtual && (buf->type != drm_bo_type_fake)) {
+    if (buf->mapVirtual) {
 	(void) munmap(buf->mapVirtual, buf->start + buf->size);
 	buf->mapVirtual = NULL;
 	buf->virtual = NULL;
@@ -2827,7 +2824,7 @@ int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
      * Make sure we have a virtual address of the buffer.
      */
 
-    if (!buf->virtual && buf->type != drm_bo_type_fake) {
+    if (!buf->virtual) {
 	drmAddress virtual;
 	virtual = mmap(0, buf->size + buf->start, 
 		       PROT_READ | PROT_WRITE, MAP_SHARED,
diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c
index 4e73577..7dd9856 100644
--- a/linux-core/drm_bo.c
+++ b/linux-core/drm_bo.c
@@ -148,7 +148,6 @@ static int drm_bo_add_ttm(struct drm_buffer_object * bo)
 			ret = -ENOMEM;
 		break;
 	case drm_bo_type_user:
-	case drm_bo_type_fake:
 		break;
 	default:
 		DRM_ERROR("Illegal buffer object type\n");
@@ -695,12 +694,6 @@ static int drm_bo_evict(struct drm_buffer_object * bo, unsigned mem_type,
 	evict_mem = bo->mem;
 	evict_mem.mm_node = NULL;
 
-	if (bo->type == drm_bo_type_fake) {
-		bo->mem.mem_type = DRM_BO_MEM_LOCAL;
-		bo->mem.mm_node = NULL;
-		goto out1;
-	}
-
 	evict_mem = bo->mem;
 	evict_mem.mask = dev->driver->bo_driver->evict_mask(bo);
 	ret = drm_bo_mem_space(bo, &evict_mem, no_wait);
@@ -720,7 +713,6 @@ static int drm_bo_evict(struct drm_buffer_object * bo, unsigned mem_type,
 		goto out;
 	}
 
-      out1:
 	mutex_lock(&dev->struct_mutex);
 	if (evict_mem.mm_node) {
 		if (evict_mem.mm_node != bo->pinned_node)
@@ -1355,44 +1347,6 @@ static int drm_bo_mem_compat(struct drm_bo_mem_reg * mem)
 	return 1;
 }
 
-static int drm_bo_check_fake(struct drm_device * dev, struct drm_bo_mem_reg * mem)
-{
-	struct drm_buffer_manager *bm = &dev->bm;
-	struct drm_mem_type_manager *man;
-	uint32_t num_prios = dev->driver->bo_driver->num_mem_type_prio;
-	const uint32_t *prios = dev->driver->bo_driver->mem_type_prio;
-	uint32_t i;
-	int type_ok = 0;
-	uint32_t mem_type = 0;
-	uint32_t cur_flags;
-
-	if (drm_bo_mem_compat(mem))
-		return 0;
-
-	BUG_ON(mem->mm_node);
-
-	for (i = 0; i < num_prios; ++i) {
-		mem_type = prios[i];
-		man = &bm->man[mem_type];
-		type_ok = drm_bo_mt_compatible(man, mem_type, mem->mask,
-					       &cur_flags);
-		if (type_ok)
-			break;
-	}
-
-	if (type_ok) {
-		mem->mm_node = NULL;
-		mem->mem_type = mem_type;
-		mem->flags = cur_flags;
-		DRM_FLAG_MASKED(mem->flags, mem->mask, ~DRM_BO_MASK_MEMTYPE);
-		return 0;
-	}
-
-	DRM_ERROR("Illegal fake buffer flags 0x%016llx\n",
-		  (unsigned long long) mem->mask);
-	return -EINVAL;
-}
-
 /*
  * bo locked.
  */
@@ -1449,11 +1403,6 @@ static int drm_buffer_object_validate(struct drm_buffer_object * bo,
 	        DRM_ERROR("Timed out waiting for buffer unmap.\n");
 		return ret;
 	}
-	if (bo->type == drm_bo_type_fake) {
-		ret = drm_bo_check_fake(dev, &bo->mem);
-		if (ret)
-			return ret;
-	}
 
 	/*
 	 * Check whether we need to move buffer.
@@ -1642,7 +1591,7 @@ int drm_buffer_object_create(struct drm_device *dev,
 	int ret = 0;
 	unsigned long num_pages;
 
-	if ((buffer_start & ~PAGE_MASK) && (type != drm_bo_type_fake)) {
+	if (buffer_start & ~PAGE_MASK) {
 		DRM_ERROR("Invalid buffer object start.\n");
 		return -EINVAL;
 	}
@@ -1677,12 +1626,7 @@ int drm_buffer_object_create(struct drm_device *dev,
 	bo->mem.num_pages = bo->num_pages;
 	bo->mem.mm_node = NULL;
 	bo->mem.page_alignment = page_alignment;
-	if (bo->type == drm_bo_type_fake) {
-		bo->offset = buffer_start;
-		bo->buffer_start = 0;
-	} else {
-		bo->buffer_start = buffer_start;
-	}
+	bo->buffer_start = buffer_start;
 	bo->priv_flags = 0;
 	bo->mem.flags = 0ULL;
 	bo->mem.mask = 0ULL;
@@ -1707,12 +1651,6 @@ int drm_buffer_object_create(struct drm_device *dev,
 		goto out_err;
 	}
 
-	if (bo->type == drm_bo_type_fake) {
-		ret = drm_bo_check_fake(dev, &bo->mem);
-		if (ret)
-			goto out_err;
-	}
-
 	ret = drm_bo_add_ttm(bo);
 	if (ret)
 		goto out_err;
@@ -1852,8 +1790,6 @@ int drm_bo_create_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
 		DRM_ERROR("Buffer object manager is not initialized.\n");
 		return -EINVAL;
 	}
-	if (req->type == drm_bo_type_fake)
-		LOCK_TEST_WITH_RETURN(dev, file_priv);
 
 	ret = drm_buffer_object_create(file_priv->head->dev,
 				       req->size, req->type, req->mask,
diff --git a/shared-core/drm.h b/shared-core/drm.h
index 1929234..279f858 100644
--- a/shared-core/drm.h
+++ b/shared-core/drm.h
@@ -757,7 +757,6 @@ struct drm_fence_arg {
 enum drm_bo_type {
 	drm_bo_type_dc,
 	drm_bo_type_user,
-	drm_bo_type_fake,
 	drm_bo_type_kernel, /* for initial kernel allocations */
 };
 
-- 
1.5.2.5

From c1578f949b533ab99d2ee8e119d09983b725aab7 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Kristian=20H=C3=B8gsberg?= <[EMAIL PROTECTED]>
Date: Tue, 9 Oct 2007 13:47:02 -0400
Subject: [PATCH 2/3] Take bo type argument out of the ioctl interface.

The buffer object type is still tracked internally, but it is no longer
part of the user space visible ioctl interface.  If the bo create ioctl
specifies a non-NULL buffer address we assume drm_bo_type_user,
otherwise drm_bo_type_dc.  Kernel side allocations call
drm_buffer_object_create() directly and can still specify drm_bo_type_kernel.
Not 100% this makes sense either, but with this patch, the buffer type
is no longer exported and we can clean up the internals later on.
---
 libdrm/xf86drm.c         |   19 +++----------------
 libdrm/xf86mm.h          |    8 +++-----
 linux-core/drm_bo.c      |   11 +++++++----
 linux-core/drm_objects.h |    6 ++++++
 shared-core/drm.h        |    8 --------
 5 files changed, 19 insertions(+), 33 deletions(-)

diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index bb2b3ab..c450a98 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -2698,8 +2698,8 @@ static void drmBOCopyReply(const struct drm_bo_info_rep *rep, drmBO *buf)
 
 
 
-int drmBOCreate(int fd, unsigned long start, unsigned long size,
-		unsigned pageAlignment, void *user_buffer, drm_bo_type_t type,
+int drmBOCreate(int fd, unsigned long size,
+		unsigned pageAlignment, void *user_buffer,
 		uint64_t mask,
 		unsigned hint, drmBO *buf)
 {
@@ -2713,23 +2713,11 @@ int drmBOCreate(int fd, unsigned long start, unsigned long size,
     req->mask = mask;
     req->hint = hint;
     req->size = size;
-    req->type = type;
     req->page_alignment = pageAlignment;
+    req->buffer_start = (unsigned long) user_buffer;
 
     buf->virtual = NULL;
 
-    switch(type) {
-    case drm_bo_type_dc:
-        req->buffer_start = start;
-	break;
-    case drm_bo_type_user:
-	req->buffer_start = (unsigned long) user_buffer;
-	buf->virtual = user_buffer;
-	break;
-    default:
-	return -EINVAL;
-    }
-
     do {
 	ret = ioctl(fd, DRM_IOCTL_BO_CREATE, &arg);
     } while (ret != 0 && errno == EAGAIN);
@@ -2777,7 +2765,6 @@ int drmBOReference(int fd, unsigned handle, drmBO *buf)
 	return -errno;
 
     drmBOCopyReply(rep, buf);
-    buf->type = drm_bo_type_dc;
     buf->mapVirtual = NULL;
     buf->mapCount = 0;
     buf->virtual = NULL;
diff --git a/libdrm/xf86mm.h b/libdrm/xf86mm.h
index cacd13a..0dac7ef 100644
--- a/libdrm/xf86mm.h
+++ b/libdrm/xf86mm.h
@@ -106,7 +106,6 @@ typedef struct _drmFence
 
 typedef struct _drmBO
 {
-    drm_bo_type_t type;
     unsigned handle;
     uint64_t mapHandle;
     uint64_t flags;
@@ -179,10 +178,9 @@ extern int drmBOCreateList(int numTarget, drmBOList *list);
  * Buffer object functions.
  */
 
-extern int drmBOCreate(int fd, unsigned long start, unsigned long size,
-		       unsigned pageAlignment,void *user_buffer,
-		       drm_bo_type_t type, uint64_t mask,
-		       unsigned hint, drmBO *buf);
+extern int drmBOCreate(int fd, unsigned long size,
+		       unsigned pageAlignment, void *user_buffer,
+		       uint64_t mask, unsigned hint, drmBO *buf);
 extern int drmBODestroy(int fd, drmBO *buf);
 extern int drmBOReference(int fd, unsigned handle, drmBO *buf);
 extern int drmBOUnReference(int fd, drmBO *buf);
diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c
index 7dd9856..e2f460e 100644
--- a/linux-core/drm_bo.c
+++ b/linux-core/drm_bo.c
@@ -1620,7 +1620,10 @@ int drm_buffer_object_create(struct drm_device *dev,
 	INIT_LIST_HEAD(&bo->vma_list);
 #endif
 	bo->dev = dev;
-	bo->type = type;
+	if (buffer_start != 0)
+		bo->type = drm_bo_type_user;
+	else
+		bo->type = type;
 	bo->num_pages = num_pages;
 	bo->mem.mem_type = DRM_BO_MEM_LOCAL;
 	bo->mem.num_pages = bo->num_pages;
@@ -1783,8 +1786,8 @@ int drm_bo_create_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
 	struct drm_buffer_object *entry;
 	int ret = 0;
 
-	DRM_DEBUG("drm_bo_create_ioctl: %dkb, %dkb align, %d type\n",
-	    (int)(req->size / 1024), req->page_alignment * 4, req->type);
+	DRM_DEBUG("drm_bo_create_ioctl: %dkb, %dkb align\n",
+	    (int)(req->size / 1024), req->page_alignment * 4);
 
 	if (!dev->bm.initialized) {
 		DRM_ERROR("Buffer object manager is not initialized.\n");
@@ -1792,7 +1795,7 @@ int drm_bo_create_ioctl(struct drm_device *dev, void *data, struct drm_file *fil
 	}
 
 	ret = drm_buffer_object_create(file_priv->head->dev,
-				       req->size, req->type, req->mask,
+				       req->size, drm_bo_type_dc, req->mask,
 				       req->hint, req->page_alignment,
 				       req->buffer_start, &entry);
 	if (ret)
diff --git a/linux-core/drm_objects.h b/linux-core/drm_objects.h
index 9748baa..b58db57 100644
--- a/linux-core/drm_objects.h
+++ b/linux-core/drm_objects.h
@@ -350,6 +350,12 @@ struct drm_bo_mem_reg {
         uint32_t hw_tile_stride;
 };
 
+enum drm_bo_type {
+	drm_bo_type_dc,
+	drm_bo_type_user,
+	drm_bo_type_kernel, /* for initial kernel allocations */
+};
+
 struct drm_buffer_object {
 	struct drm_device *dev;
 	struct drm_user_object base;
diff --git a/shared-core/drm.h b/shared-core/drm.h
index 279f858..568b100 100644
--- a/shared-core/drm.h
+++ b/shared-core/drm.h
@@ -754,12 +754,6 @@ struct drm_fence_arg {
 #define DRM_BO_INIT_MINOR 1
 
 
-enum drm_bo_type {
-	drm_bo_type_dc,
-	drm_bo_type_user,
-	drm_bo_type_kernel, /* for initial kernel allocations */
-};
-
 struct drm_bo_info_req {
 	uint64_t mask;
 	uint64_t flags;
@@ -775,8 +769,6 @@ struct drm_bo_create_req {
 	uint64_t buffer_start;
 	unsigned int hint;
 	unsigned int page_alignment;
-	enum drm_bo_type type;
-	unsigned int pad64;
 };
 
 struct drm_bo_op_req {
-- 
1.5.2.5

From 41878f641053a57664ccbe2638638a0c6b8d3691 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Kristian=20H=C3=B8gsberg?= <[EMAIL PROTECTED]>
Date: Tue, 9 Oct 2007 21:07:41 -0400
Subject: [PATCH 3/3] Drop destroy ioctls for fences and buffer objects.

We now always create a drm_ref_object for user objects and this is then the only
things that holds a reference to the user object.  This way unreference on will
destroy the user object when the last drm_ref_object goes way.
---
 libdrm/xf86drm.c         |   32 --------------------------------
 libdrm/xf86mm.h          |    2 --
 linux-core/drmP.h        |    1 -
 linux-core/drm_bo.c      |   31 ++-----------------------------
 linux-core/drm_drv.c     |    2 --
 linux-core/drm_fence.c   |   28 +---------------------------
 linux-core/drm_fops.c    |   13 -------------
 linux-core/drm_object.c  |   27 +++++++--------------------
 linux-core/drm_objects.h |   12 ------------
 shared-core/drm.h        |    2 --
 10 files changed, 10 insertions(+), 140 deletions(-)

diff --git a/libdrm/xf86drm.c b/libdrm/xf86drm.c
index c450a98..7666d43 100644
--- a/libdrm/xf86drm.c
+++ b/libdrm/xf86drm.c
@@ -2389,18 +2389,6 @@ int drmFenceBuffers(int fd, unsigned flags, uint32_t fence_class, drmFence *fenc
     fence->signaled = 0;
     return 0;
 }
-    
-int drmFenceDestroy(int fd, const drmFence *fence)
-{
-    drm_fence_arg_t arg;
-
-    memset(&arg, 0, sizeof(arg));
-    arg.handle = fence->handle;
-
-    if (ioctl(fd, DRM_IOCTL_FENCE_DESTROY, &arg))
-	return -errno;
-    return 0;
-}
 
 int drmFenceReference(int fd, unsigned handle, drmFence *fence)
 {
@@ -2732,26 +2720,6 @@ int drmBOCreate(int fd, unsigned long size,
     return 0;
 }
 
-int drmBODestroy(int fd, drmBO *buf)
-{
-    struct drm_bo_handle_arg arg;
-    
-    if (buf->mapVirtual) {
-	(void) drmUnmap(buf->mapVirtual, buf->start + buf->size);
-	buf->mapVirtual = NULL;
-	buf->virtual = NULL;
-    }
-
-    memset(&arg, 0, sizeof(arg));
-    arg.handle = buf->handle;
-
-    if (ioctl(fd, DRM_IOCTL_BO_DESTROY, &arg))
-	return -errno;
-
-    buf->handle = 0;
-    return 0;
-}
-
 int drmBOReference(int fd, unsigned handle, drmBO *buf)
 {
     struct drm_bo_reference_info_arg arg;
diff --git a/libdrm/xf86mm.h b/libdrm/xf86mm.h
index 0dac7ef..d99e61e 100644
--- a/libdrm/xf86mm.h
+++ b/libdrm/xf86mm.h
@@ -150,7 +150,6 @@ typedef struct _drmBOList {
 
 extern int drmFenceCreate(int fd, unsigned flags, int fence_class,
                           unsigned type, drmFence *fence);
-extern int drmFenceDestroy(int fd, const drmFence *fence);
 extern int drmFenceReference(int fd, unsigned handle, drmFence *fence);
 extern int drmFenceUnreference(int fd, const drmFence *fence);
 extern int drmFenceFlush(int fd, drmFence *fence, unsigned flush_type);
@@ -181,7 +180,6 @@ extern int drmBOCreateList(int numTarget, drmBOList *list);
 extern int drmBOCreate(int fd, unsigned long size,
 		       unsigned pageAlignment, void *user_buffer,
 		       uint64_t mask, unsigned hint, drmBO *buf);
-extern int drmBODestroy(int fd, drmBO *buf);
 extern int drmBOReference(int fd, unsigned handle, drmBO *buf);
 extern int drmBOUnReference(int fd, drmBO *buf);
 extern int drmBOMap(int fd, drmBO *buf, unsigned mapFlags, unsigned mapHint,
diff --git a/linux-core/drmP.h b/linux-core/drmP.h
index f8ca3f4..d0ab2c9 100644
--- a/linux-core/drmP.h
+++ b/linux-core/drmP.h
@@ -428,7 +428,6 @@ struct drm_file {
 	 */
 
 	struct list_head refd_objects;
-	struct list_head user_objects;
 
 	struct drm_open_hash refd_object_hash[_DRM_NO_REF_TYPES];
 	struct file *filp;
diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c
index e2f460e..fb360e7 100644
--- a/linux-core/drm_bo.c
+++ b/linux-core/drm_bo.c
@@ -1674,8 +1674,8 @@ int drm_buffer_object_create(struct drm_device *dev,
 }
 EXPORT_SYMBOL(drm_buffer_object_create);
 
-int drm_bo_add_user_object(struct drm_file *file_priv,
-			   struct drm_buffer_object *bo, int shareable)
+static int drm_bo_add_user_object(struct drm_file *file_priv,
+				  struct drm_buffer_object *bo, int shareable)
 {
 	struct drm_device *dev = file_priv->head->dev;
 	int ret;
@@ -1694,7 +1694,6 @@ int drm_bo_add_user_object(struct drm_file *file_priv,
 	mutex_unlock(&dev->struct_mutex);
 	return ret;
 }
-EXPORT_SYMBOL(drm_bo_add_user_object);
 
 static int drm_bo_lock_test(struct drm_device * dev, struct drm_file *file_priv)
 {
@@ -1816,32 +1815,6 @@ out:
 	return ret;
 }
 
-
-int drm_bo_destroy_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-	struct drm_bo_handle_arg *arg = data;
-	struct drm_user_object *uo;
-	int ret = 0;
-
-	DRM_DEBUG("drm_bo_destroy_ioctl: buffer %d\n", arg->handle);
-
-	if (!dev->bm.initialized) {
-		DRM_ERROR("Buffer object manager is not initialized.\n");
-		return -EINVAL;
-	}
-
-	mutex_lock(&dev->struct_mutex);
-	uo = drm_lookup_user_object(file_priv, arg->handle);
-	if (!uo || (uo->type != drm_buffer_type) || uo->owner != file_priv) {
-		mutex_unlock(&dev->struct_mutex);
-		return -EINVAL;
-	}
-	ret = drm_remove_user_object(file_priv, uo);
-	mutex_unlock(&dev->struct_mutex);
-	
-	return ret;
-}
-
 int drm_bo_map_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
 {
 	struct drm_bo_map_wait_idle_arg *arg = data;
diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c
index a09fa96..0fca3a2 100644
--- a/linux-core/drm_drv.c
+++ b/linux-core/drm_drv.c
@@ -129,7 +129,6 @@ static struct drm_ioctl_desc drm_ioctls[] = {
 	DRM_IOCTL_DEF(DRM_IOCTL_MM_UNLOCK, drm_mm_unlock_ioctl, DRM_AUTH),
 
 	DRM_IOCTL_DEF(DRM_IOCTL_FENCE_CREATE, drm_fence_create_ioctl, DRM_AUTH),
-	DRM_IOCTL_DEF(DRM_IOCTL_FENCE_DESTROY, drm_fence_destroy_ioctl, DRM_AUTH),
 	DRM_IOCTL_DEF(DRM_IOCTL_FENCE_REFERENCE, drm_fence_reference_ioctl, DRM_AUTH),
 	DRM_IOCTL_DEF(DRM_IOCTL_FENCE_UNREFERENCE, drm_fence_unreference_ioctl, DRM_AUTH),
 	DRM_IOCTL_DEF(DRM_IOCTL_FENCE_SIGNALED, drm_fence_signaled_ioctl, DRM_AUTH),
@@ -139,7 +138,6 @@ static struct drm_ioctl_desc drm_ioctls[] = {
 	DRM_IOCTL_DEF(DRM_IOCTL_FENCE_BUFFERS, drm_fence_buffers_ioctl, DRM_AUTH),
 
 	DRM_IOCTL_DEF(DRM_IOCTL_BO_CREATE, drm_bo_create_ioctl, DRM_AUTH),
-	DRM_IOCTL_DEF(DRM_IOCTL_BO_DESTROY, drm_bo_destroy_ioctl, DRM_AUTH),
 	DRM_IOCTL_DEF(DRM_IOCTL_BO_MAP, drm_bo_map_ioctl, DRM_AUTH),
 	DRM_IOCTL_DEF(DRM_IOCTL_BO_UNMAP, drm_bo_unmap_ioctl, DRM_AUTH),
 	DRM_IOCTL_DEF(DRM_IOCTL_BO_REFERENCE, drm_bo_reference_ioctl, DRM_AUTH),
diff --git a/linux-core/drm_fence.c b/linux-core/drm_fence.c
index c25ff3b..0625a21 100644
--- a/linux-core/drm_fence.c
+++ b/linux-core/drm_fence.c
@@ -515,7 +515,7 @@ static int drm_fence_object_init(struct drm_device * dev, uint32_t fence_class,
 	return ret;
 }
 
-int drm_fence_add_user_object(struct drm_file * priv, struct drm_fence_object * fence,
+static int drm_fence_add_user_object(struct drm_file * priv, struct drm_fence_object * fence,
 			      int shareable)
 {
 	struct drm_device *dev = priv->head->dev;
@@ -533,7 +533,6 @@ out:
 	mutex_unlock(&dev->struct_mutex);
 	return ret;
 }
-EXPORT_SYMBOL(drm_fence_add_user_object);
 
 int drm_fence_object_create(struct drm_device * dev, uint32_t fence_class, uint32_t type,
 			    unsigned flags, struct drm_fence_object ** c_fence)
@@ -668,31 +667,6 @@ int drm_fence_create_ioctl(struct drm_device *dev, void *data, struct drm_file *
 	return ret;
 }
 
-int drm_fence_destroy_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-	int ret;
-	struct drm_fence_manager *fm = &dev->fm;
-	struct drm_fence_arg *arg = data;
-	struct drm_user_object *uo;
-	ret = 0;
-
-	if (!fm->initialized) {
-		DRM_ERROR("The DRM driver does not support fencing.\n");
-		return -EINVAL;
-	}
-
-	mutex_lock(&dev->struct_mutex);
-	uo = drm_lookup_user_object(file_priv, arg->handle);
-	if (!uo || (uo->type != drm_fence_type) || uo->owner != file_priv) {
-		mutex_unlock(&dev->struct_mutex);
-		return -EINVAL;
-	}
-	ret = drm_remove_user_object(file_priv, uo);
-	mutex_unlock(&dev->struct_mutex);
-	return ret;
-}
-
-
 int drm_fence_reference_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
 {
 	int ret;
diff --git a/linux-core/drm_fops.c b/linux-core/drm_fops.c
index ab5f4ca..0ccaed5 100644
--- a/linux-core/drm_fops.c
+++ b/linux-core/drm_fops.c
@@ -263,7 +263,6 @@ static int drm_open_helper(struct inode *inode, struct file *filp,
 	priv->lock_count = 0;
 
 	INIT_LIST_HEAD(&priv->lhead);
-	INIT_LIST_HEAD(&priv->user_objects);
 	INIT_LIST_HEAD(&priv->refd_objects);
 
 	for (i=0; i<_DRM_NO_REF_TYPES; ++i) {
@@ -338,7 +337,6 @@ static void drm_object_release(struct file *filp) {
 
 	struct drm_file *priv = filp->private_data;
 	struct list_head *head;
-	struct drm_user_object *user_object;
 	struct drm_ref_object *ref_object;
 	int i;
 
@@ -357,17 +355,6 @@ static void drm_object_release(struct file *filp) {
 		head = &priv->refd_objects;
 	}
 
-	/*
-	 * Free leftover user objects created by me.
-	 */
-
-	head = &priv->user_objects;
-	while (head->next != head) {
-		user_object = list_entry(head->next, struct drm_user_object, list);
-		drm_remove_user_object(priv, user_object);
-		head = &priv->user_objects;
-	}
-
 	for(i=0; i<_DRM_NO_REF_TYPES; ++i) {
 		drm_ht_remove(&priv->refd_object_hash[i]);
 	}
diff --git a/linux-core/drm_object.c b/linux-core/drm_object.c
index 6bd89b1..a6d6c0d 100644
--- a/linux-core/drm_object.c
+++ b/linux-core/drm_object.c
@@ -38,7 +38,8 @@ int drm_add_user_object(struct drm_file * priv, struct drm_user_object * item,
 
 	DRM_ASSERT_LOCKED(&dev->struct_mutex);
 
-	atomic_set(&item->refcount, 1);
+	/* The refcount will be bumped to 1 when we add the ref object below. */
+	atomic_set(&item->refcount, 0);
 	item->shareable = shareable;
 	item->owner = priv;
 
@@ -47,8 +48,11 @@ int drm_add_user_object(struct drm_file * priv, struct drm_user_object * item,
 	if (ret)
 		return ret;
 
-	list_add_tail(&item->list, &priv->user_objects);
-	return 0;
+	ret = drm_add_ref_object(priv, item, _DRM_REF_USE);
+	if (ret)
+		ret = drm_ht_remove_item(&dev->object_hash, &item->hash);
+
+	return ret;
 }
 EXPORT_SYMBOL(drm_add_user_object);
 
@@ -87,27 +91,10 @@ static void drm_deref_user_object(struct drm_file * priv, struct drm_user_object
 	if (atomic_dec_and_test(&item->refcount)) {
 		ret = drm_ht_remove_item(&dev->object_hash, &item->hash);
 		BUG_ON(ret);
-		list_del_init(&item->list);
 		item->remove(priv, item);
 	}
 }
 
-int drm_remove_user_object(struct drm_file * priv, struct drm_user_object * item)
-{
-	DRM_ASSERT_LOCKED(&priv->head->dev->struct_mutex);
-
-	if (item->owner != priv) {
-		DRM_ERROR("Cannot destroy object not owned by you.\n");
-		return -EINVAL;
-	}
-	item->owner = 0;
-	item->shareable = 0;
-	list_del_init(&item->list);
-	drm_deref_user_object(priv, item);
-	return 0;
-}
-EXPORT_SYMBOL(drm_remove_user_object);
-
 static int drm_object_ref_action(struct drm_file * priv, struct drm_user_object * ro,
 				 enum drm_ref_type action)
 {
diff --git a/linux-core/drm_objects.h b/linux-core/drm_objects.h
index b58db57..67c3374 100644
--- a/linux-core/drm_objects.h
+++ b/linux-core/drm_objects.h
@@ -103,15 +103,6 @@ extern struct drm_user_object *drm_lookup_user_object(struct drm_file * priv,
 						 uint32_t key);
 
 /*
- * Must be called with the struct_mutex held.
- * If "item" has been obtained by a call to drm_lookup_user_object. You may not
- * release the struct_mutex before calling drm_remove_ref_object.
- * This function may temporarily release the struct_mutex.
- */
-
-extern int drm_remove_user_object(struct drm_file * priv, struct drm_user_object * item);
-
-/*
  * Must be called with the struct_mutex held. May temporarily release it.
  */
 
@@ -222,9 +213,6 @@ extern int drm_fence_object_emit(struct drm_fence_object * fence,
 extern void drm_fence_fill_arg(struct drm_fence_object *fence,
 			       struct drm_fence_arg *arg);
 
-extern int drm_fence_add_user_object(struct drm_file * priv,
-				     struct drm_fence_object * fence, int shareable);
-
 extern int drm_fence_create_ioctl(struct drm_device *dev, void *data,
 				  struct drm_file *file_priv);
 extern int drm_fence_destroy_ioctl(struct drm_device *dev, void *data,
diff --git a/shared-core/drm.h b/shared-core/drm.h
index 568b100..30650bd 100644
--- a/shared-core/drm.h
+++ b/shared-core/drm.h
@@ -962,7 +962,6 @@ struct drm_mm_init_arg {
 #define DRM_IOCTL_MM_UNLOCK             DRM_IOWR(0xc3, struct drm_mm_type_arg)
 
 #define DRM_IOCTL_FENCE_CREATE          DRM_IOWR(0xc4, struct drm_fence_arg)
-#define DRM_IOCTL_FENCE_DESTROY         DRM_IOWR(0xc5, struct drm_fence_arg)
 #define DRM_IOCTL_FENCE_REFERENCE       DRM_IOWR(0xc6, struct drm_fence_arg)
 #define DRM_IOCTL_FENCE_UNREFERENCE     DRM_IOWR(0xc7, struct drm_fence_arg)
 #define DRM_IOCTL_FENCE_SIGNALED        DRM_IOWR(0xc8, struct drm_fence_arg)
@@ -972,7 +971,6 @@ struct drm_mm_init_arg {
 #define DRM_IOCTL_FENCE_BUFFERS         DRM_IOWR(0xcc, struct drm_fence_arg)
 
 #define DRM_IOCTL_BO_CREATE             DRM_IOWR(0xcd, struct drm_bo_create_arg)
-#define DRM_IOCTL_BO_DESTROY            DRM_IOWR(0xce, struct drm_bo_handle_arg)
 #define DRM_IOCTL_BO_MAP                DRM_IOWR(0xcf, struct drm_bo_map_wait_idle_arg)
 #define DRM_IOCTL_BO_UNMAP              DRM_IOWR(0xd0, struct drm_bo_handle_arg)
 #define DRM_IOCTL_BO_REFERENCE          DRM_IOWR(0xd1, struct drm_bo_reference_info_arg)
-- 
1.5.2.5

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to