diff options
author | Samuel Pitoiset <samuel.pitoiset@gmail.com> | 2015-06-07 16:40:11 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2015-07-27 04:56:09 -0400 |
commit | 3693d544056b822f7f2454da5acb7eda9471b902 (patch) | |
tree | 64bbaeca41c00c8b52a05584af00d873f2ca1514 | |
parent | 4a8cf4513dd4279d342eb41abdb9db65285732b3 (diff) |
drm/nouveau/pm: prevent freeing the wrong engine context
This fixes a crash when multiple PM engine contexts are created.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Martin Peres <martin.peres@free.fr>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/engine/pm/base.c | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/pm/base.c b/drivers/gpu/drm/nouveau/nvkm/engine/pm/base.c index 2006c445938d..274457ca3fef 100644 --- a/drivers/gpu/drm/nouveau/nvkm/engine/pm/base.c +++ b/drivers/gpu/drm/nouveau/nvkm/engine/pm/base.c | |||
@@ -332,9 +332,12 @@ static void | |||
332 | nvkm_perfctx_dtor(struct nvkm_object *object) | 332 | nvkm_perfctx_dtor(struct nvkm_object *object) |
333 | { | 333 | { |
334 | struct nvkm_pm *ppm = (void *)object->engine; | 334 | struct nvkm_pm *ppm = (void *)object->engine; |
335 | struct nvkm_perfctx *ctx = (void *)object; | ||
336 | |||
335 | mutex_lock(&nv_subdev(ppm)->mutex); | 337 | mutex_lock(&nv_subdev(ppm)->mutex); |
336 | nvkm_engctx_destroy(&ppm->context->base); | 338 | nvkm_engctx_destroy(&ctx->base); |
337 | ppm->context = NULL; | 339 | if (ppm->context == ctx) |
340 | ppm->context = NULL; | ||
338 | mutex_unlock(&nv_subdev(ppm)->mutex); | 341 | mutex_unlock(&nv_subdev(ppm)->mutex); |
339 | } | 342 | } |
340 | 343 | ||