Module Name:    src
Committed By:   riastradh
Date:           Wed Jul 24 02:52:52 UTC 2013

Modified Files:
        src/sys/external/bsd/drm2/dist/drm [riastradh-drm2]: drm_gem.c

Log Message:
Manage the relevant uvm objects in gem object creation/destruction.


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.1.2.5 -r1.1.1.1.2.6 \
    src/sys/external/bsd/drm2/dist/drm/drm_gem.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/drm_gem.c
diff -u src/sys/external/bsd/drm2/dist/drm/drm_gem.c:1.1.1.1.2.5 src/sys/external/bsd/drm2/dist/drm/drm_gem.c:1.1.1.1.2.6
--- src/sys/external/bsd/drm2/dist/drm/drm_gem.c:1.1.1.1.2.5	Wed Jul 24 02:52:37 2013
+++ src/sys/external/bsd/drm2/dist/drm/drm_gem.c	Wed Jul 24 02:52:52 2013
@@ -147,9 +147,16 @@ int drm_gem_object_init(struct drm_devic
 	BUG_ON((size & (PAGE_SIZE - 1)) != 0);
 
 	obj->dev = dev;
+#ifdef __NetBSD__
+	obj->gemo_shm_uao = uao_create(size, 0);
+	KASSERT(drm_core_check_feature(dev, DRIVER_GEM));
+	KASSERT(dev->driver->gem_uvm_ops != NULL);
+	uvm_obj_init(&obj->gemo_uvmobj, dev->driver->gem_uvm_ops, true, 1);
+#else
 	obj->filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
 	if (IS_ERR(obj->filp))
 		return PTR_ERR(obj->filp);
+#endif
 
 	kref_init(&obj->refcount);
 	atomic_set(&obj->handle_count, 0);
@@ -170,7 +177,14 @@ int drm_gem_private_object_init(struct d
 	BUG_ON((size & (PAGE_SIZE - 1)) != 0);
 
 	obj->dev = dev;
+#ifdef __NetBSD__
+	obj->gemo_shm_uao = NULL;
+	KASSERT(drm_core_check_feature(dev, DRIVER_GEM));
+	KASSERT(dev->driver->gem_uvm_ops != NULL);
+	uvm_obj_init(&obj->gemo_uvmobj, dev->driver->gem_uvm_ops, true, 1);
+#else
 	obj->filp = NULL;
+#endif
 
 	kref_init(&obj->refcount);
 	atomic_set(&obj->handle_count, 0);
@@ -201,8 +215,12 @@ drm_gem_object_alloc(struct drm_device *
 	}
 	return obj;
 fput:
+#ifdef __NetBSD__
+	drm_gem_object_release(obj);
+#else
 	/* Object_init mangles the global counters - readjust them. */
 	fput(obj->filp);
+#endif
 free:
 	kfree(obj);
 	return NULL;
@@ -578,13 +596,22 @@ drm_gem_release(struct drm_device *dev, 
 
 	idr_remove_all(&file_private->object_idr);
 	idr_destroy(&file_private->object_idr);
+#ifdef __NetBSD__
+	spin_lock_destroy(&file_private->table_lock);
+#endif
 }
 
 void
 drm_gem_object_release(struct drm_gem_object *obj)
 {
+#ifdef __NetBSD__
+	if (obj->gemo_shm_uao)
+		uao_detach(obj->gemo_shm_uao);
+	uvm_obj_destroy(&obj->gemo_uvmobj, true);
+#else
 	if (obj->filp)
 	    fput(obj->filp);
+#endif
 }
 EXPORT_SYMBOL(drm_gem_object_release);
 

Reply via email to