Re: Robert Noland's DRM patch

2013-09-21 Thread dt71

Ping!
___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"


Re: Robert Noland's DRM patch

2013-06-29 Thread dt71


Index: sys/dev/drm/r300_cmdbuf.c
===
--- sys/dev/drm/r300_cmdbuf.c	(revision 252372)
+++ sys/dev/drm/r300_cmdbuf.c	(working copy)
@@ -1043,6 +1043,8 @@
 	int emit_dispatch_age = 0;
 	int ret = 0;
 
+	DRM_UNLOCK();
+
 	DRM_DEBUG("\n");
 
 	/* pacify */
@@ -1205,5 +1207,7 @@
 
 	COMMIT_RING();
 
+	DRM_LOCK();
+
 	return ret;
 }
Index: sys/dev/drm/radeon_irq.c
===
--- sys/dev/drm/radeon_irq.c	(revision 252372)
+++ sys/dev/drm/radeon_irq.c	(working copy)
@@ -338,10 +338,13 @@
 
 	result = radeon_emit_irq(dev);
 
+	DRM_UNLOCK();
 	if (DRM_COPY_TO_USER(emit->irq_seq, &result, sizeof(int))) {
 		DRM_ERROR("copy_to_user\n");
+		DRM_LOCK();
 		return -EFAULT;
 	}
+	DRM_LOCK();
 
 	return 0;
 }
Index: sys/dev/drm/radeon_mem.c
===
--- sys/dev/drm/radeon_mem.c	(revision 252372)
+++ sys/dev/drm/radeon_mem.c	(working copy)
@@ -246,11 +246,14 @@
 	if (!block)
 		return -ENOMEM;
 
+	DRM_UNLOCK();
 	if (DRM_COPY_TO_USER(alloc->region_offset, &block->start,
 			 sizeof(int))) {
 		DRM_ERROR("copy_to_user\n");
+		DRM_LOCK();
 		return -EFAULT;
 	}
+	DRM_LOCK();
 
 	return 0;
 }
Index: sys/dev/drm/radeon_state.c
===
--- sys/dev/drm/radeon_state.c	(revision 252372)
+++ sys/dev/drm/radeon_state.c	(working copy)
@@ -1773,8 +1773,13 @@
 		}
 		if (!buf) {
 			DRM_DEBUG("EAGAIN\n");
-			if (DRM_COPY_TO_USER(tex->image, image, sizeof(*image)))
+			DRM_UNLOCK();
+			if (DRM_COPY_TO_USER(tex->image, image,
+			sizeof(*image))) {
+DRM_LOCK();
 return -EFAULT;
+			}
+			DRM_LOCK();
 			return -EAGAIN;
 		}
 
@@ -1786,10 +1791,13 @@
 
 #define RADEON_COPY_MT(_buf, _data, _width) \
 	do { \
-		if (DRM_COPY_FROM_USER(_buf, _data, (_width))) {\
+		DRM_UNLOCK(); \
+		if (DRM_COPY_FROM_USER(_buf, _data, (_width))) { \
 			DRM_ERROR("EFAULT on pad, %d bytes\n", (_width)); \
+			DRM_LOCK(); \
 			return -EFAULT; \
 		} \
+		DRM_LOCK(); \
 	} while(0)
 
 		if (microtile) {
@@ -2130,9 +2138,13 @@
 	if (sarea_priv->nbox > RADEON_NR_SAREA_CLIPRECTS)
 		sarea_priv->nbox = RADEON_NR_SAREA_CLIPRECTS;
 
+	DRM_UNLOCK();
 	if (DRM_COPY_FROM_USER(&depth_boxes, clear->depth_boxes,
-			   sarea_priv->nbox * sizeof(depth_boxes[0])))
+			   sarea_priv->nbox * sizeof(depth_boxes[0]))) {
+		DRM_LOCK();
 		return -EFAULT;
+	}
+	DRM_LOCK();
 
 	radeon_cp_dispatch_clear(dev, clear, depth_boxes);
 
@@ -2394,10 +2406,13 @@
 		return -EINVAL;
 	}
 
-	if (DRM_COPY_FROM_USER(&image,
-			   (drm_radeon_tex_image_t __user *) tex->image,
-			   sizeof(image)))
-		return -EFAULT;
+	DRM_UNLOCK();
+	ret = -DRM_COPY_FROM_USER(&image,
+	(drm_radeon_tex_image_t __user *) tex->image,
+	sizeof(image));
+	DRM_LOCK();
+	if (ret)
+		return ret;
 
 	RING_SPACE_TEST_WITH_RETURN(dev_priv);
 	VB_AGE_TEST_WITH_RETURN(dev_priv);
@@ -2418,8 +2433,12 @@
 
 	LOCK_TEST_WITH_RETURN(dev, file_priv);
 
-	if (DRM_COPY_FROM_USER(&mask, stipple->mask, 32 * sizeof(u32)))
+	DRM_UNLOCK();
+	if (DRM_COPY_FROM_USER(&mask, stipple->mask, 32 * sizeof(u32))) {
+		DRM_LOCK();
 		return -EFAULT;
+	}
+	DRM_LOCK();
 
 	RING_SPACE_TEST_WITH_RETURN(dev_priv);
 
@@ -2546,16 +2565,24 @@
 		drm_radeon_prim_t prim;
 		drm_radeon_tcl_prim_t tclprim;
 
-		if (DRM_COPY_FROM_USER(&prim, &vertex->prim[i], sizeof(prim)))
+		DRM_UNLOCK();
+		if (DRM_COPY_FROM_USER(&prim, &vertex->prim[i], sizeof(prim))) {
+			DRM_LOCK();
 			return -EFAULT;
+		}
+		DRM_LOCK();
 
 		if (prim.stateidx != laststate) {
 			drm_radeon_state_t state;
 
+			DRM_UNLOCK();
 			if (DRM_COPY_FROM_USER(&state,
 	   &vertex->state[prim.stateidx],
-	   sizeof(state)))
+	   sizeof(state))) {
+DRM_LOCK();
 return -EFAULT;
+			}
+			DRM_LOCK();
 
 			if (radeon_emit_state2(dev_priv, file_priv, &state)) {
 DRM_ERROR("radeon_emit_state2 failed\n");
@@ -2772,8 +2799,12 @@
 
 	do {
 		if (i < cmdbuf->nbox) {
-			if (DRM_COPY_FROM_USER(&box, &boxes[i], sizeof(box)))
+			DRM_UNLOCK();
+			if (DRM_COPY_FROM_USER(&box, &boxes[i], sizeof(box))) {
+DRM_LOCK();
 return -EFAULT;
+			}
+			DRM_LOCK();
 			/* FIXME The second and subsequent times round
 			 * this loop, send a WAIT_UNTIL_3D_IDLE before
 			 * calling emit_clip_rect(). This fixes a
@@ -2866,11 +2897,14 @@
 		kbuf = drm_alloc(cmdbuf->bufsz, DRM_MEM_DRIVER);
 		if (kbuf == NULL)
 			return -ENOMEM;
+		DRM_UNLOCK();
 		if (DRM_COPY_FROM_USER(kbuf, (void __user *)cmdbuf->buf,
    cmdbuf->bufsz)) {
+			DRM_LOCK();
 			drm_free(kbuf, orig_bufsz, DRM_MEM_DRIVER);
 			return -EFAULT;
 		}
+		DRM_LOCK();
 		cmdbuf->buf = kbuf;
 	}
 
@@ -3089,10 +3123,13 @@
 		return -EINVAL;
 	}
 
+	DRM_UNLOCK();
 	if (DRM_COPY_TO_USER(param->value, &value, sizeof(int))) {
 		DRM_ERROR("copy_to_user\n");
+		DRM_LOCK();
 		return -EFAULT;
 	}
+	DRM_LOCK();
 
 	return 0;
 }
_

Robert Noland's DRM patch

2013-06-29 Thread dt71

I'm tired of having a local patch to fix video card software. The patch was written by 
Robert Noland, and is supposed to fix cases where "DRM is doing a copyin() while 
holding a mutex, which is not allowed". Could someone commit the patch? If not, why?
___
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"