Module Name:    src
Committed By:   riastradh
Date:           Mon Aug 18 01:21:04 UTC 2014

Modified Files:
        src/sys/external/bsd/drm2/dist/drm: drm_gem.c
        src/sys/external/bsd/drm2/dist/drm/ttm: ttm_bo.c

Log Message:
For gem and ttm objects backed by uvm_aobjs, share the vmobjlock.

XXX pullup to 7


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/dist/drm/drm_gem.c
cvs rdiff -u -r1.4 -r1.5 src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.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.4 src/sys/external/bsd/drm2/dist/drm/drm_gem.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/drm_gem.c:1.4	Wed Jul 16 20:56:24 2014
+++ src/sys/external/bsd/drm2/dist/drm/drm_gem.c	Mon Aug 18 01:21:03 2014
@@ -155,6 +155,13 @@ int drm_gem_object_init(struct drm_devic
 
 #ifdef __NetBSD__
 	obj->gemo_shm_uao = uao_create(size, 0);
+	/*
+	 * XXX This is gross.  We ought to do it the other way around:
+	 * set the uao to have the main uvm object's lock.  However,
+	 * uvm_obj_setlock is not safe on uvm_aobjs.
+	 */
+	mutex_obj_hold(obj->gemo_shm_uao->vmobjlock);
+	uvm_obj_setlock(&obj->gemo_uvmobj, obj->gemo_shm_uao->vmobjlock);
 #else
 	filp = shmem_file_setup("drm mm object", size, VM_NORESERVE);
 	if (IS_ERR(filp))

Index: src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c
diff -u src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c:1.4 src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c:1.5
--- src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c:1.4	Sun Jul 27 00:40:39 2014
+++ src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c	Mon Aug 18 01:21:03 2014
@@ -33,6 +33,7 @@
 #ifdef __NetBSD__
 #include <sys/types.h>
 #include <uvm/uvm_extern.h>
+#include <uvm/uvm_object.h>
 #endif
 
 #include <drm/ttm/ttm_module.h>
@@ -269,6 +270,16 @@ static int ttm_bo_add_ttm(struct ttm_buf
 						      page_flags, glob->dummy_read_page);
 		if (unlikely(bo->ttm == NULL))
 			ret = -ENOMEM;
+#ifdef __NetBSD__
+		/*
+		 * XXX This is gross.  We ought to do it the other way
+		 * around: set the uao to have the main uvm object's
+		 * lock.  However, uvm_obj_setlock is not safe on
+		 * uvm_aobjs.
+		 */
+		mutex_obj_hold(bo->ttm->swap_storage->vmobjlock);
+		uvm_obj_setlock(&bo->uvmobj, bo->ttm->swap_storage->vmobjlock);
+#endif
 		break;
 	case ttm_bo_type_sg:
 		bo->ttm = bdev->driver->ttm_tt_create(bdev, bo->num_pages << PAGE_SHIFT,
@@ -279,6 +290,11 @@ static int ttm_bo_add_ttm(struct ttm_buf
 			break;
 		}
 		bo->ttm->sg = bo->sg;
+#ifdef __NetBSD__
+		/* XXX This is gross too -- see above.  */
+		mutex_obj_hold(bo->ttm->swap_storage->vmobjlock);
+		uvm_obj_setlock(&bo->uvmobj, bo->ttm->swap_storage->vmobjlock);
+#endif
 		break;
 	default:
 		pr_err("Illegal buffer object type\n");

Reply via email to