浏览代码

Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux

* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux:
  vmwgfx: Use kcalloc instead of kzalloc to allocate array
  drm/i915: fix infinite recursion on unbind due to ilk vt-d w/a
  drm/radeon/kms: fix return type for radeon_encoder_get_dp_bridge_encoder_id
Linus Torvalds 13 年之前
父节点
当前提交
10ec5e6c0c
共有 3 个文件被更改,包括 11 次插入7 次删除
  1. 6 1
      drivers/gpu/drm/i915/i915_gem.c
  2. 3 4
      drivers/gpu/drm/radeon/radeon_encoders.c
  3. 2 2
      drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c

+ 6 - 1
drivers/gpu/drm/i915/i915_gem.c

@@ -2026,8 +2026,13 @@ i915_wait_request(struct intel_ring_buffer *ring,
 	 * to handle this, the waiter on a request often wants an associated
 	 * to handle this, the waiter on a request often wants an associated
 	 * buffer to have made it to the inactive list, and we would need
 	 * buffer to have made it to the inactive list, and we would need
 	 * a separate wait queue to handle that.
 	 * a separate wait queue to handle that.
+	 *
+	 * To avoid a recursion with the ilk VT-d workaround (that calls
+	 * gpu_idle when unbinding objects with interruptible==false) don't
+	 * retire requests in that case (because it might call unbind if the
+	 * active list holds the last reference to the object).
 	 */
 	 */
-	if (ret == 0)
+	if (ret == 0 && dev_priv->mm.interruptible)
 		i915_gem_retire_requests_ring(ring);
 		i915_gem_retire_requests_ring(ring);
 
 
 	return ret;
 	return ret;

+ 3 - 4
drivers/gpu/drm/radeon/radeon_encoders.c

@@ -233,13 +233,12 @@ u16 radeon_encoder_get_dp_bridge_encoder_id(struct drm_encoder *encoder)
 		switch (radeon_encoder->encoder_id) {
 		switch (radeon_encoder->encoder_id) {
 		case ENCODER_OBJECT_ID_TRAVIS:
 		case ENCODER_OBJECT_ID_TRAVIS:
 		case ENCODER_OBJECT_ID_NUTMEG:
 		case ENCODER_OBJECT_ID_NUTMEG:
-			return true;
+			return radeon_encoder->encoder_id;
 		default:
 		default:
-			return false;
+			return ENCODER_OBJECT_ID_NONE;
 		}
 		}
 	}
 	}
-
-	return false;
+	return ENCODER_OBJECT_ID_NONE;
 }
 }
 
 
 void radeon_panel_mode_fixup(struct drm_encoder *encoder,
 void radeon_panel_mode_fixup(struct drm_encoder *encoder,

+ 2 - 2
drivers/gpu/drm/vmwgfx/vmwgfx_ioctl.c

@@ -140,7 +140,7 @@ int vmw_present_ioctl(struct drm_device *dev, void *data,
 		goto out_clips;
 		goto out_clips;
 	}
 	}
 
 
-	clips = kzalloc(num_clips * sizeof(*clips), GFP_KERNEL);
+	clips = kcalloc(num_clips, sizeof(*clips), GFP_KERNEL);
 	if (clips == NULL) {
 	if (clips == NULL) {
 		DRM_ERROR("Failed to allocate clip rect list.\n");
 		DRM_ERROR("Failed to allocate clip rect list.\n");
 		ret = -ENOMEM;
 		ret = -ENOMEM;
@@ -232,7 +232,7 @@ int vmw_present_readback_ioctl(struct drm_device *dev, void *data,
 		goto out_clips;
 		goto out_clips;
 	}
 	}
 
 
-	clips = kzalloc(num_clips * sizeof(*clips), GFP_KERNEL);
+	clips = kcalloc(num_clips, sizeof(*clips), GFP_KERNEL);
 	if (clips == NULL) {
 	if (clips == NULL) {
 		DRM_ERROR("Failed to allocate clip rect list.\n");
 		DRM_ERROR("Failed to allocate clip rect list.\n");
 		ret = -ENOMEM;
 		ret = -ENOMEM;