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);