diff options
author | Kamil Dudka <kdudka@redhat.com> | 2015-07-15 16:57:43 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2015-07-27 04:56:07 -0400 |
commit | 7512223b1ece29a5968ed8b67ccb891d21b7834b (patch) | |
tree | 9339bcec52eaf99df199e9470082cbf9c670a178 | |
parent | ac8c79304280da6ef05c348a9da03ab04898b994 (diff) |
drm/nouveau/drm/nv04-nv40/instmem: protect access to priv->heap by mutex
This fixes the list_del corruption reported
at <https://bugzilla.redhat.com/1205985>.
Signed-off-by: Kamil Dudka <kdudka@redhat.com>
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c b/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c index 80614f1b2074..282143f49d72 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c | |||
@@ -50,7 +50,12 @@ nv04_instobj_dtor(struct nvkm_object *object) | |||
50 | { | 50 | { |
51 | struct nv04_instmem_priv *priv = (void *)nvkm_instmem(object); | 51 | struct nv04_instmem_priv *priv = (void *)nvkm_instmem(object); |
52 | struct nv04_instobj_priv *node = (void *)object; | 52 | struct nv04_instobj_priv *node = (void *)object; |
53 | struct nvkm_subdev *subdev = (void *)priv; | ||
54 | |||
55 | mutex_lock(&subdev->mutex); | ||
53 | nvkm_mm_free(&priv->heap, &node->mem); | 56 | nvkm_mm_free(&priv->heap, &node->mem); |
57 | mutex_unlock(&subdev->mutex); | ||
58 | |||
54 | nvkm_instobj_destroy(&node->base); | 59 | nvkm_instobj_destroy(&node->base); |
55 | } | 60 | } |
56 | 61 | ||
@@ -62,6 +67,7 @@ nv04_instobj_ctor(struct nvkm_object *parent, struct nvkm_object *engine, | |||
62 | struct nv04_instmem_priv *priv = (void *)nvkm_instmem(parent); | 67 | struct nv04_instmem_priv *priv = (void *)nvkm_instmem(parent); |
63 | struct nv04_instobj_priv *node; | 68 | struct nv04_instobj_priv *node; |
64 | struct nvkm_instobj_args *args = data; | 69 | struct nvkm_instobj_args *args = data; |
70 | struct nvkm_subdev *subdev = (void *)priv; | ||
65 | int ret; | 71 | int ret; |
66 | 72 | ||
67 | if (!args->align) | 73 | if (!args->align) |
@@ -72,8 +78,10 @@ nv04_instobj_ctor(struct nvkm_object *parent, struct nvkm_object *engine, | |||
72 | if (ret) | 78 | if (ret) |
73 | return ret; | 79 | return ret; |
74 | 80 | ||
81 | mutex_lock(&subdev->mutex); | ||
75 | ret = nvkm_mm_head(&priv->heap, 0, 1, args->size, args->size, | 82 | ret = nvkm_mm_head(&priv->heap, 0, 1, args->size, args->size, |
76 | args->align, &node->mem); | 83 | args->align, &node->mem); |
84 | mutex_unlock(&subdev->mutex); | ||
77 | if (ret) | 85 | if (ret) |
78 | return ret; | 86 | return ret; |
79 | 87 | ||