Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd785e35 authored by Chris Wilson's avatar Chris Wilson Committed by Eric Anholt
Browse files

drm/i915/ringbuffer: Set ring->gem_buffer = NULL on init unwind



The cleanup path for early abort failed to nullify the gem_buffer. The
likely consequence of this is zero, since a failure here should mean
aborting the module load.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarEric Anholt <eric@anholt.net>
parent debcaddc
Loading
Loading
Loading
Loading
+17 −14
Original line number Diff line number Diff line
@@ -608,9 +608,10 @@ static int init_status_page(struct drm_device *dev,
int intel_init_ring_buffer(struct drm_device *dev,
		struct intel_ring_buffer *ring)
{
	int ret;
	struct drm_i915_gem_object *obj_priv;
	struct drm_gem_object *obj;
	int ret;

	ring->dev = dev;

	if (I915_NEED_GFX_HWS(dev)) {
@@ -623,16 +624,14 @@ int intel_init_ring_buffer(struct drm_device *dev,
	if (obj == NULL) {
		DRM_ERROR("Failed to allocate ringbuffer\n");
		ret = -ENOMEM;
		goto cleanup;
		goto err_hws;
	}

	ring->gem_object = obj;

	ret = i915_gem_object_pin(obj, ring->alignment);
	if (ret != 0) {
		drm_gem_object_unreference(obj);
		goto cleanup;
	}
	if (ret)
		goto err_unref;

	obj_priv = to_intel_bo(obj);
	ring->map.size = ring->size;
@@ -644,18 +643,14 @@ int intel_init_ring_buffer(struct drm_device *dev,
	drm_core_ioremap_wc(&ring->map, dev);
	if (ring->map.handle == NULL) {
		DRM_ERROR("Failed to map ringbuffer.\n");
		i915_gem_object_unpin(obj);
		drm_gem_object_unreference(obj);
		ret = -EINVAL;
		goto cleanup;
		goto err_unpin;
	}

	ring->virtual_start = ring->map.handle;
	ret = ring->init(dev, ring);
	if (ret != 0) {
		intel_cleanup_ring_buffer(dev, ring);
		return ret;
	}
	if (ret)
		goto err_unmap;

	if (!drm_core_check_feature(dev, DRIVER_MODESET))
		i915_kernel_lost_context(dev);
@@ -669,7 +664,15 @@ int intel_init_ring_buffer(struct drm_device *dev,
	INIT_LIST_HEAD(&ring->active_list);
	INIT_LIST_HEAD(&ring->request_list);
	return ret;
cleanup:

err_unmap:
	drm_core_ioremapfree(&ring->map, dev);
err_unpin:
	i915_gem_object_unpin(obj);
err_unref:
	drm_gem_object_unreference(obj);
	ring->gem_object = NULL;
err_hws:
	cleanup_status_page(dev, ring);
	return ret;
}