* [PATCH] drm/i915: Allocate atomically in execbuf path
@ 2013-11-27 0:55 Ben Widawsky
2013-11-27 1:10 ` Ben Widawsky
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Ben Widawsky @ 2013-11-27 0:55 UTC (permalink / raw)
To: Intel GFX; +Cc: Daniel Vetter, Ben Widawsky, Ben Widawsky
If we end up calling the shrinker, which in turn requires the OOM
killer, we may end up infinitely waiting for a process to die if the OOM
chooses. The case that this prevents occurs in execbuf. The forked
variants of gem_evict_everything is a good way to hit it. This is
exacerbated by Daniel's recent patch to give OOM precedence to the GEM
tests.
It's a twisted form of a deadlock.
What occurs is the following (assume just 2 procs)
1. proc A gets to execbuf while out of memory, gets struct_mutex.
2. OOM killer comes in and chooses proc B
3. proc B closes it's fds, which requires struct mutex, blocks
4, OOM killer waits for B to die before killing another process (this
part is speculative)
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
---
drivers/gpu/drm/i915/i915_gem.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index fb2d548..a60894d 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1842,12 +1842,12 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
BUG_ON(obj->base.read_domains & I915_GEM_GPU_DOMAINS);
BUG_ON(obj->base.write_domain & I915_GEM_GPU_DOMAINS);
- st = kmalloc(sizeof(*st), GFP_KERNEL);
+ st = kmalloc(sizeof(*st), GFP_NOWAIT);
if (st == NULL)
return -ENOMEM;
page_count = obj->base.size / PAGE_SIZE;
- if (sg_alloc_table(st, page_count, GFP_KERNEL)) {
+ if (sg_alloc_table(st, page_count, GFP_NOWAIT)) {
kfree(st);
return -ENOMEM;
}
--
1.8.4.2
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH] drm/i915: Allocate atomically in execbuf path 2013-11-27 0:55 [PATCH] drm/i915: Allocate atomically in execbuf path Ben Widawsky @ 2013-11-27 1:10 ` Ben Widawsky 2013-11-27 1:21 ` Ben Widawsky 2013-11-27 4:23 ` Ben Widawsky 2013-11-27 6:53 ` [PATCH] drm/i915: Optionally defer context closing Ben Widawsky 2 siblings, 1 reply; 7+ messages in thread From: Ben Widawsky @ 2013-11-27 1:10 UTC (permalink / raw) To: Ben Widawsky; +Cc: Daniel Vetter, Intel GFX On Tue, Nov 26, 2013 at 04:55:50PM -0800, Ben Widawsky wrote: > If we end up calling the shrinker, which in turn requires the OOM > killer, we may end up infinitely waiting for a process to die if the OOM > chooses. The case that this prevents occurs in execbuf. The forked > variants of gem_evict_everything is a good way to hit it. This is > exacerbated by Daniel's recent patch to give OOM precedence to the GEM > tests. > > It's a twisted form of a deadlock. > > What occurs is the following (assume just 2 procs) > 1. proc A gets to execbuf while out of memory, gets struct_mutex. > 2. OOM killer comes in and chooses proc B > 3. proc B closes it's fds, which requires struct mutex, blocks > 4, OOM killer waits for B to die before killing another process (this > part is speculative) > It appears that by itself, this patch is insufficient to prevent the failure when run in piglit. Before I go on a wild goose chase of finding all allocations, maybe I'll give people a chance to chime in. The symptom is the same always, OOM, procs can't die because struct_mutex is held. > Cc: Daniel Vetter <daniel.vetter@ffwll.ch> > Cc: Chris Wilson <chris@chris-wilson.co.uk> > Signed-off-by: Ben Widawsky <ben@bwidawsk.net> > --- > drivers/gpu/drm/i915/i915_gem.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c > index fb2d548..a60894d 100644 > --- a/drivers/gpu/drm/i915/i915_gem.c > +++ b/drivers/gpu/drm/i915/i915_gem.c > @@ -1842,12 +1842,12 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) > BUG_ON(obj->base.read_domains & I915_GEM_GPU_DOMAINS); > BUG_ON(obj->base.write_domain & I915_GEM_GPU_DOMAINS); > > - st = kmalloc(sizeof(*st), GFP_KERNEL); > + st = kmalloc(sizeof(*st), GFP_NOWAIT); > if (st == NULL) > return -ENOMEM; > > page_count = obj->base.size / PAGE_SIZE; > - if (sg_alloc_table(st, page_count, GFP_KERNEL)) { > + if (sg_alloc_table(st, page_count, GFP_NOWAIT)) { > kfree(st); > return -ENOMEM; > } > -- > 1.8.4.2 > -- Ben Widawsky, Intel Open Source Technology Center ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] drm/i915: Allocate atomically in execbuf path 2013-11-27 1:10 ` Ben Widawsky @ 2013-11-27 1:21 ` Ben Widawsky 0 siblings, 0 replies; 7+ messages in thread From: Ben Widawsky @ 2013-11-27 1:21 UTC (permalink / raw) To: Ben Widawsky; +Cc: Daniel Vetter, Intel GFX On Tue, Nov 26, 2013 at 05:10:38PM -0800, Ben Widawsky wrote: > On Tue, Nov 26, 2013 at 04:55:50PM -0800, Ben Widawsky wrote: > > If we end up calling the shrinker, which in turn requires the OOM > > killer, we may end up infinitely waiting for a process to die if the OOM > > chooses. The case that this prevents occurs in execbuf. The forked > > variants of gem_evict_everything is a good way to hit it. This is > > exacerbated by Daniel's recent patch to give OOM precedence to the GEM > > tests. > > > > It's a twisted form of a deadlock. > > > > What occurs is the following (assume just 2 procs) > > 1. proc A gets to execbuf while out of memory, gets struct_mutex. > > 2. OOM killer comes in and chooses proc B > > 3. proc B closes it's fds, which requires struct mutex, blocks > > 4, OOM killer waits for B to die before killing another process (this > > part is speculative) > > > > It appears that by itself, this patch is insufficient to prevent the > failure when run in piglit. Before I go on a wild goose chase of finding > all allocations, maybe I'll give people a chance to chime in. The > symptom is the same always, OOM, procs can't die because struct_mutex is > held. > too late on the goose chase. vma allocation was the missing bit. > > Cc: Daniel Vetter <daniel.vetter@ffwll.ch> > > Cc: Chris Wilson <chris@chris-wilson.co.uk> > > Signed-off-by: Ben Widawsky <ben@bwidawsk.net> > > --- > > drivers/gpu/drm/i915/i915_gem.c | 4 ++-- > > 1 file changed, 2 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c > > index fb2d548..a60894d 100644 > > --- a/drivers/gpu/drm/i915/i915_gem.c > > +++ b/drivers/gpu/drm/i915/i915_gem.c > > @@ -1842,12 +1842,12 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj) > > BUG_ON(obj->base.read_domains & I915_GEM_GPU_DOMAINS); > > BUG_ON(obj->base.write_domain & I915_GEM_GPU_DOMAINS); > > > > - st = kmalloc(sizeof(*st), GFP_KERNEL); > > + st = kmalloc(sizeof(*st), GFP_NOWAIT); > > if (st == NULL) > > return -ENOMEM; > > > > page_count = obj->base.size / PAGE_SIZE; > > - if (sg_alloc_table(st, page_count, GFP_KERNEL)) { > > + if (sg_alloc_table(st, page_count, GFP_NOWAIT)) { > > kfree(st); > > return -ENOMEM; > > } > > -- > > 1.8.4.2 > > > > -- > Ben Widawsky, Intel Open Source Technology Center > _______________________________________________ > Intel-gfx mailing list > Intel-gfx@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Ben Widawsky, Intel Open Source Technology Center ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] drm/i915: Allocate atomically in execbuf path 2013-11-27 0:55 [PATCH] drm/i915: Allocate atomically in execbuf path Ben Widawsky 2013-11-27 1:10 ` Ben Widawsky @ 2013-11-27 4:23 ` Ben Widawsky 2013-11-27 6:48 ` Daniel Vetter 2013-11-27 6:48 ` Ben Widawsky 2013-11-27 6:53 ` [PATCH] drm/i915: Optionally defer context closing Ben Widawsky 2 siblings, 2 replies; 7+ messages in thread From: Ben Widawsky @ 2013-11-27 4:23 UTC (permalink / raw) To: Ben Widawsky; +Cc: Daniel Vetter, Intel GFX On Tue, Nov 26, 2013 at 04:55:50PM -0800, Ben Widawsky wrote: > If we end up calling the shrinker, which in turn requires the OOM > killer, we may end up infinitely waiting for a process to die if the OOM > chooses. The case that this prevents occurs in execbuf. The forked > variants of gem_evict_everything is a good way to hit it. This is > exacerbated by Daniel's recent patch to give OOM precedence to the GEM > tests. > > It's a twisted form of a deadlock. > > What occurs is the following (assume just 2 procs) > 1. proc A gets to execbuf while out of memory, gets struct_mutex. > 2. OOM killer comes in and chooses proc B > 3. proc B closes it's fds, which requires struct mutex, blocks > 4, OOM killer waits for B to die before killing another process (this > part is speculative) > > Cc: Daniel Vetter <daniel.vetter@ffwll.ch> > Cc: Chris Wilson <chris@chris-wilson.co.uk> > Signed-off-by: Ben Widawsky <ben@bwidawsk.net> I'd still like to know if I am crazy, but I'm now trying to defer the stuff we do on file close without using any allocs. Just an update... -- Ben Widawsky, Intel Open Source Technology Center ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] drm/i915: Allocate atomically in execbuf path 2013-11-27 4:23 ` Ben Widawsky @ 2013-11-27 6:48 ` Daniel Vetter 2013-11-27 6:48 ` Ben Widawsky 1 sibling, 0 replies; 7+ messages in thread From: Daniel Vetter @ 2013-11-27 6:48 UTC (permalink / raw) To: Ben Widawsky; +Cc: Intel GFX, Ben Widawsky On Wed, Nov 27, 2013 at 5:23 AM, Ben Widawsky <ben@bwidawsk.net> wrote: > On Tue, Nov 26, 2013 at 04:55:50PM -0800, Ben Widawsky wrote: >> If we end up calling the shrinker, which in turn requires the OOM >> killer, we may end up infinitely waiting for a process to die if the OOM >> chooses. The case that this prevents occurs in execbuf. The forked >> variants of gem_evict_everything is a good way to hit it. This is >> exacerbated by Daniel's recent patch to give OOM precedence to the GEM >> tests. >> >> It's a twisted form of a deadlock. >> >> What occurs is the following (assume just 2 procs) >> 1. proc A gets to execbuf while out of memory, gets struct_mutex. >> 2. OOM killer comes in and chooses proc B >> 3. proc B closes it's fds, which requires struct mutex, blocks >> 4, OOM killer waits for B to die before killing another process (this >> part is speculative) >> >> Cc: Daniel Vetter <daniel.vetter@ffwll.ch> >> Cc: Chris Wilson <chris@chris-wilson.co.uk> >> Signed-off-by: Ben Widawsky <ben@bwidawsk.net> > > I'd still like to know if I am crazy, but I'm now trying to defer the > stuff we do on file close without using any allocs. Just an update... Sound's intrigueing, but tbh I don't really have clue about things. What about adding the relevant stuck task backtraces to the patch and submitting this to a wider audience (lkml, mm-devel) as an akpm-probe? The more botched the patch, the better the probe usually. -Daniel -- Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] drm/i915: Allocate atomically in execbuf path 2013-11-27 4:23 ` Ben Widawsky 2013-11-27 6:48 ` Daniel Vetter @ 2013-11-27 6:48 ` Ben Widawsky 1 sibling, 0 replies; 7+ messages in thread From: Ben Widawsky @ 2013-11-27 6:48 UTC (permalink / raw) To: Ben Widawsky; +Cc: Daniel Vetter, Intel GFX On Tue, Nov 26, 2013 at 08:23:46PM -0800, Ben Widawsky wrote: > On Tue, Nov 26, 2013 at 04:55:50PM -0800, Ben Widawsky wrote: > > If we end up calling the shrinker, which in turn requires the OOM > > killer, we may end up infinitely waiting for a process to die if the OOM > > chooses. The case that this prevents occurs in execbuf. The forked > > variants of gem_evict_everything is a good way to hit it. This is > > exacerbated by Daniel's recent patch to give OOM precedence to the GEM > > tests. > > > > It's a twisted form of a deadlock. > > > > What occurs is the following (assume just 2 procs) > > 1. proc A gets to execbuf while out of memory, gets struct_mutex. > > 2. OOM killer comes in and chooses proc B > > 3. proc B closes it's fds, which requires struct mutex, blocks > > 4, OOM killer waits for B to die before killing another process (this > > part is speculative) > > > > Cc: Daniel Vetter <daniel.vetter@ffwll.ch> > > Cc: Chris Wilson <chris@chris-wilson.co.uk> > > Signed-off-by: Ben Widawsky <ben@bwidawsk.net> > > I'd still like to know if I am crazy, but I'm now trying to defer the > stuff we do on file close without using any allocs. Just an update... > workqueue still has similar problems. It could be because deferring the context cleanup means we don't actually free much space, and so the OOM isn't enough, or [more likely] something else is going on. Maybe it's my bug. I am really out of ideas at the moment. The system just becomes unresponsive after all threads end up blocked waiting for struct mutex. I know I'd seen such problems in the past with gem_evict_everything, but this time around I seem to be the sole cause (and not all my machines hit it). Sorry for the noise - just totally burning out on this one. -- Ben Widawsky, Intel Open Source Technology Center ^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH] drm/i915: Optionally defer context closing 2013-11-27 0:55 [PATCH] drm/i915: Allocate atomically in execbuf path Ben Widawsky 2013-11-27 1:10 ` Ben Widawsky 2013-11-27 4:23 ` Ben Widawsky @ 2013-11-27 6:53 ` Ben Widawsky 2 siblings, 0 replies; 7+ messages in thread From: Ben Widawsky @ 2013-11-27 6:53 UTC (permalink / raw) To: Intel GFX; +Cc: Ben Widawsky, Ben Widawsky This patch doesn't seem to be the panacea that I had hoped, although I've yet to thoroughly test if it actually improves some of the other tests which caused trouble. What occurs is the following (assume just 2 procs) 1. proc A gets to execbuf while out of memory, gets struct_mutex. 2. OOM killer comes in and chooses proc B 3. proc B closes it's fds, which requires struct mutex, blocks 4, OOM killer waits for B to die before killing another process (this part is speculative) In order to let the OOM complete, we defer processing the context destruction parts which are those that require struct_mutex. This patch has not really been cleaned up, I am only posting it for posterity. (Several of the hunks are only relevant to full PPGTT patches which are not merged). Signed-off-by: Ben Widawsky <ben@bwidawsk.net> --- drivers/gpu/drm/i915/i915_debugfs.c | 6 ++- drivers/gpu/drm/i915/i915_drv.h | 9 +++-- drivers/gpu/drm/i915/i915_gem.c | 2 +- drivers/gpu/drm/i915/i915_gem_context.c | 68 ++++++++++++++++++++++++--------- 4 files changed, 61 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c index 835a43e..e6b5f3e 100644 --- a/drivers/gpu/drm/i915/i915_debugfs.c +++ b/drivers/gpu/drm/i915/i915_debugfs.c @@ -1717,11 +1717,13 @@ static void gen6_ppgtt_info(struct seq_file *m, struct drm_device *dev) struct drm_i915_file_private *file_priv = file->driver_priv; struct i915_hw_ppgtt *pvt_ppgtt; - pvt_ppgtt = ctx_to_ppgtt(file_priv->private_default_ctx); + pvt_ppgtt = + ctx_to_ppgtt(file_priv->ctx_info->private_default_ctx); seq_printf(m, "proc: %s\n", get_pid_task(file->pid, PIDTYPE_PID)->comm); seq_puts(m, " default context:\n"); - idr_for_each(&file_priv->context_idr, per_file_ctx, m); + idr_for_each(&file_priv->ctx_info->context_idr, per_file_ctx, + m); } seq_printf(m, "ECOCHK: 0x%08x\n", I915_READ(GAM_ECOCHK)); } diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 6fdab40..931fc42 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1735,15 +1735,18 @@ struct drm_i915_gem_request { struct drm_i915_file_private { struct drm_i915_private *dev_priv; - struct { spinlock_t lock; struct list_head request_list; struct delayed_work idle_work; } mm; - struct idr context_idr; + struct i915_gem_ctx_info { + struct drm_i915_private *dev_priv; + struct idr context_idr; + struct work_struct close_work; + struct i915_hw_context *private_default_ctx; + } *ctx_info; - struct i915_hw_context *private_default_ctx; atomic_t rps_wait_boost; }; diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 6312d61..a32f6df 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -2326,7 +2326,7 @@ static void i915_set_reset_status(struct intel_ring_buffer *ring, if (request->ctx && request->ctx->id != DEFAULT_CONTEXT_ID) hs = &request->ctx->hang_stats; else if (request->file_priv) - hs = &request->file_priv->private_default_ctx->hang_stats; + hs = &request->file_priv->ctx_info->private_default_ctx->hang_stats; if (hs) { if (guilty) { diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c index f55f0a9..770b394 100644 --- a/drivers/gpu/drm/i915/i915_gem_context.c +++ b/drivers/gpu/drm/i915/i915_gem_context.c @@ -209,8 +209,8 @@ __create_hw_context(struct drm_device *dev, if (file_priv == NULL) return ctx; - ret = idr_alloc(&file_priv->context_idr, ctx, DEFAULT_CONTEXT_ID, 0, - GFP_KERNEL); + ret = idr_alloc(&file_priv->ctx_info->context_idr, + ctx, DEFAULT_CONTEXT_ID, 0, GFP_KERNEL); if (ret < 0) goto err_out; @@ -481,29 +481,54 @@ static int context_idr_cleanup(int id, void *p, void *data) return 0; } +static void i915_gem_context_close_work_handler(struct work_struct *work) +{ + struct i915_gem_ctx_info *ctx_info = container_of(work, + struct i915_gem_ctx_info, + close_work); + struct drm_i915_private *dev_priv = ctx_info->dev_priv; + + mutex_lock(&dev_priv->dev->struct_mutex); + idr_for_each(&ctx_info->context_idr, context_idr_cleanup, NULL); + i915_gem_context_unreference(ctx_info->private_default_ctx); + idr_destroy(&ctx_info->context_idr); + mutex_unlock(&dev_priv->dev->struct_mutex); + + kfree(ctx_info); +} + int i915_gem_context_open(struct drm_device *dev, struct drm_file *file) { struct drm_i915_file_private *file_priv = file->driver_priv; struct drm_i915_private *dev_priv = dev->dev_private; + file_priv->ctx_info = kzalloc(sizeof(*file_priv->ctx_info), GFP_KERNEL); + if (!file_priv->ctx_info) + return -ENOMEM; + + file_priv->ctx_info->dev_priv = file_priv->dev_priv; + INIT_WORK(&file_priv->ctx_info->close_work, + i915_gem_context_close_work_handler); + if (!HAS_HW_CONTEXTS(dev)) { /* Cheat for hang stats */ - file_priv->private_default_ctx = + file_priv->ctx_info->private_default_ctx = kzalloc(sizeof(struct i915_hw_context), GFP_KERNEL); - file_priv->private_default_ctx->vm = &dev_priv->gtt.base; + file_priv->ctx_info->private_default_ctx->vm = + &dev_priv->gtt.base; return 0; } - idr_init(&file_priv->context_idr); + idr_init(&file_priv->ctx_info->context_idr); mutex_lock(&dev->struct_mutex); - file_priv->private_default_ctx = + file_priv->ctx_info->private_default_ctx = i915_gem_create_context(dev, file_priv, USES_FULL_PPGTT(dev)); mutex_unlock(&dev->struct_mutex); - if (IS_ERR(file_priv->private_default_ctx)) { - idr_destroy(&file_priv->context_idr); - return PTR_ERR(file_priv->private_default_ctx); + if (IS_ERR(file_priv->ctx_info->private_default_ctx)) { + idr_destroy(&file_priv->ctx_info->context_idr); + return PTR_ERR(file_priv->ctx_info->private_default_ctx); } return 0; @@ -511,27 +536,34 @@ int i915_gem_context_open(struct drm_device *dev, struct drm_file *file) void i915_gem_context_close(struct drm_device *dev, struct drm_file *file) { + struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_file_private *file_priv = file->driver_priv; if (!HAS_HW_CONTEXTS(dev)) { - kfree(file_priv->private_default_ctx); + kfree(file_priv->ctx_info->private_default_ctx); + kfree(file_priv->ctx_info); return; } - mutex_lock(&dev->struct_mutex); - idr_for_each(&file_priv->context_idr, context_idr_cleanup, NULL); - i915_gem_context_unreference(file_priv->private_default_ctx); - idr_destroy(&file_priv->context_idr); - mutex_unlock(&dev->struct_mutex); + if (mutex_trylock(&dev->struct_mutex)) { + idr_for_each(&file_priv->ctx_info->context_idr, + context_idr_cleanup, NULL); + i915_gem_context_unreference(file_priv->ctx_info->private_default_ctx); + idr_destroy(&file_priv->ctx_info->context_idr); + mutex_unlock(&dev->struct_mutex); + kfree(file_priv->ctx_info); + } else { + queue_work(dev_priv->wq, &file_priv->ctx_info->close_work); + } } struct i915_hw_context * i915_gem_context_get(struct drm_i915_file_private *file_priv, u32 id) { if (!HAS_HW_CONTEXTS(file_priv->dev_priv->dev)) - return file_priv->private_default_ctx; + return file_priv->ctx_info->private_default_ctx; - return (struct i915_hw_context *)idr_find(&file_priv->context_idr, id); + return (struct i915_hw_context *)idr_find(&file_priv->ctx_info->context_idr, id); } static inline int @@ -773,7 +805,7 @@ int i915_gem_context_destroy_ioctl(struct drm_device *dev, void *data, return -ENOENT; } - idr_remove(&ctx->file_priv->context_idr, ctx->id); + idr_remove(&ctx->file_priv->ctx_info->context_idr, ctx->id); i915_gem_context_unreference(ctx); mutex_unlock(&dev->struct_mutex); -- 1.8.4.2 ^ permalink raw reply related [flat|nested] 7+ messages in thread
end of thread, other threads:[~2013-11-27 6:53 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-11-27 0:55 [PATCH] drm/i915: Allocate atomically in execbuf path Ben Widawsky 2013-11-27 1:10 ` Ben Widawsky 2013-11-27 1:21 ` Ben Widawsky 2013-11-27 4:23 ` Ben Widawsky 2013-11-27 6:48 ` Daniel Vetter 2013-11-27 6:48 ` Ben Widawsky 2013-11-27 6:53 ` [PATCH] drm/i915: Optionally defer context closing Ben Widawsky
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.