drm/i915: Unref context on failed eb_create
I opted to do this instead of grabbing the context reference after eb_create since eb_create can potentially call the shrinker, and that makes things very complicated. This simple patch balances the ref count without requiring a great deal of review to make sure the shrinker path is safe. Theoretically (by design) the shrinker can end up destroying a context, which enforces the reasoning for doing the fix this way instead of moving the reference to later in the function. Cc: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
cfa7698bd4
commit
935f38d694
|
@ -1132,7 +1132,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
|
||||||
mutex_unlock(&dev->struct_mutex);
|
mutex_unlock(&dev->struct_mutex);
|
||||||
ret = PTR_ERR(ctx);
|
ret = PTR_ERR(ctx);
|
||||||
goto pre_mutex_err;
|
goto pre_mutex_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
i915_gem_context_reference(ctx);
|
i915_gem_context_reference(ctx);
|
||||||
|
|
||||||
|
@ -1142,6 +1142,7 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data,
|
||||||
|
|
||||||
eb = eb_create(args);
|
eb = eb_create(args);
|
||||||
if (eb == NULL) {
|
if (eb == NULL) {
|
||||||
|
i915_gem_context_unreference(ctx);
|
||||||
mutex_unlock(&dev->struct_mutex);
|
mutex_unlock(&dev->struct_mutex);
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto pre_mutex_err;
|
goto pre_mutex_err;
|
||||||
|
|
Loading…
Reference in New Issue