diff options
author | Marcin Slusarz <marcin.slusarz@gmail.com> | 2012-11-25 17:04:23 -0500 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2012-11-28 18:58:11 -0500 |
commit | 04c8c21085e13011a2eaf3ae518ab44e23e21917 (patch) | |
tree | eb7fe589503f248555e3fc7e33d071932c78dd86 /drivers/gpu | |
parent | 124ea297c8f0e0a3a567af0894fdbe05caaf80ec (diff) |
drm/nouveau: unpin various bo's before destroying
These objects leak VRAM - but only on module unload.
Signed-off-by: Marcin Slusarz <marcin.slusarz@gmail.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/nouveau/nv04_crtc.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nv10_fence.c | 7 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nv50_display.c | 21 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nv50_fence.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nvc0_fence.c | 7 |
5 files changed, 39 insertions, 7 deletions
diff --git a/drivers/gpu/drm/nouveau/nv04_crtc.c b/drivers/gpu/drm/nouveau/nv04_crtc.c index 82a0d9c6cda3..6578cd28c556 100644 --- a/drivers/gpu/drm/nouveau/nv04_crtc.c +++ b/drivers/gpu/drm/nouveau/nv04_crtc.c | |||
@@ -730,6 +730,7 @@ static void nv_crtc_destroy(struct drm_crtc *crtc) | |||
730 | drm_crtc_cleanup(crtc); | 730 | drm_crtc_cleanup(crtc); |
731 | 731 | ||
732 | nouveau_bo_unmap(nv_crtc->cursor.nvbo); | 732 | nouveau_bo_unmap(nv_crtc->cursor.nvbo); |
733 | nouveau_bo_unpin(nv_crtc->cursor.nvbo); | ||
733 | nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo); | 734 | nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo); |
734 | kfree(nv_crtc); | 735 | kfree(nv_crtc); |
735 | } | 736 | } |
@@ -1056,8 +1057,11 @@ nv04_crtc_create(struct drm_device *dev, int crtc_num) | |||
1056 | 0, 0x0000, NULL, &nv_crtc->cursor.nvbo); | 1057 | 0, 0x0000, NULL, &nv_crtc->cursor.nvbo); |
1057 | if (!ret) { | 1058 | if (!ret) { |
1058 | ret = nouveau_bo_pin(nv_crtc->cursor.nvbo, TTM_PL_FLAG_VRAM); | 1059 | ret = nouveau_bo_pin(nv_crtc->cursor.nvbo, TTM_PL_FLAG_VRAM); |
1059 | if (!ret) | 1060 | if (!ret) { |
1060 | ret = nouveau_bo_map(nv_crtc->cursor.nvbo); | 1061 | ret = nouveau_bo_map(nv_crtc->cursor.nvbo); |
1062 | if (ret) | ||
1063 | nouveau_bo_unpin(nv_crtc->cursor.nvbo); | ||
1064 | } | ||
1061 | if (ret) | 1065 | if (ret) |
1062 | nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo); | 1066 | nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo); |
1063 | } | 1067 | } |
diff --git a/drivers/gpu/drm/nouveau/nv10_fence.c b/drivers/gpu/drm/nouveau/nv10_fence.c index ce752bf5cc4e..7ae7f97a6d4d 100644 --- a/drivers/gpu/drm/nouveau/nv10_fence.c +++ b/drivers/gpu/drm/nouveau/nv10_fence.c | |||
@@ -155,6 +155,8 @@ nv10_fence_destroy(struct nouveau_drm *drm) | |||
155 | { | 155 | { |
156 | struct nv10_fence_priv *priv = drm->fence; | 156 | struct nv10_fence_priv *priv = drm->fence; |
157 | nouveau_bo_unmap(priv->bo); | 157 | nouveau_bo_unmap(priv->bo); |
158 | if (priv->bo) | ||
159 | nouveau_bo_unpin(priv->bo); | ||
158 | nouveau_bo_ref(NULL, &priv->bo); | 160 | nouveau_bo_ref(NULL, &priv->bo); |
159 | drm->fence = NULL; | 161 | drm->fence = NULL; |
160 | kfree(priv); | 162 | kfree(priv); |
@@ -183,8 +185,11 @@ nv10_fence_create(struct nouveau_drm *drm) | |||
183 | 0, 0x0000, NULL, &priv->bo); | 185 | 0, 0x0000, NULL, &priv->bo); |
184 | if (!ret) { | 186 | if (!ret) { |
185 | ret = nouveau_bo_pin(priv->bo, TTM_PL_FLAG_VRAM); | 187 | ret = nouveau_bo_pin(priv->bo, TTM_PL_FLAG_VRAM); |
186 | if (!ret) | 188 | if (!ret) { |
187 | ret = nouveau_bo_map(priv->bo); | 189 | ret = nouveau_bo_map(priv->bo); |
190 | if (ret) | ||
191 | nouveau_bo_unpin(priv->bo); | ||
192 | } | ||
188 | if (ret) | 193 | if (ret) |
189 | nouveau_bo_ref(NULL, &priv->bo); | 194 | nouveau_bo_ref(NULL, &priv->bo); |
190 | } | 195 | } |
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index b252dbe0f4e0..35874085a61e 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
@@ -1228,8 +1228,12 @@ nv50_crtc_destroy(struct drm_crtc *crtc) | |||
1228 | nv50_dmac_destroy(disp->core, &head->sync.base); | 1228 | nv50_dmac_destroy(disp->core, &head->sync.base); |
1229 | nv50_pioc_destroy(disp->core, &head->curs.base); | 1229 | nv50_pioc_destroy(disp->core, &head->curs.base); |
1230 | nouveau_bo_unmap(nv_crtc->cursor.nvbo); | 1230 | nouveau_bo_unmap(nv_crtc->cursor.nvbo); |
1231 | if (nv_crtc->cursor.nvbo) | ||
1232 | nouveau_bo_unpin(nv_crtc->cursor.nvbo); | ||
1231 | nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo); | 1233 | nouveau_bo_ref(NULL, &nv_crtc->cursor.nvbo); |
1232 | nouveau_bo_unmap(nv_crtc->lut.nvbo); | 1234 | nouveau_bo_unmap(nv_crtc->lut.nvbo); |
1235 | if (nv_crtc->lut.nvbo) | ||
1236 | nouveau_bo_unpin(nv_crtc->lut.nvbo); | ||
1233 | nouveau_bo_ref(NULL, &nv_crtc->lut.nvbo); | 1237 | nouveau_bo_ref(NULL, &nv_crtc->lut.nvbo); |
1234 | drm_crtc_cleanup(crtc); | 1238 | drm_crtc_cleanup(crtc); |
1235 | kfree(crtc); | 1239 | kfree(crtc); |
@@ -1300,8 +1304,11 @@ nv50_crtc_create(struct drm_device *dev, struct nouveau_object *core, int index) | |||
1300 | 0, 0x0000, NULL, &head->base.lut.nvbo); | 1304 | 0, 0x0000, NULL, &head->base.lut.nvbo); |
1301 | if (!ret) { | 1305 | if (!ret) { |
1302 | ret = nouveau_bo_pin(head->base.lut.nvbo, TTM_PL_FLAG_VRAM); | 1306 | ret = nouveau_bo_pin(head->base.lut.nvbo, TTM_PL_FLAG_VRAM); |
1303 | if (!ret) | 1307 | if (!ret) { |
1304 | ret = nouveau_bo_map(head->base.lut.nvbo); | 1308 | ret = nouveau_bo_map(head->base.lut.nvbo); |
1309 | if (ret) | ||
1310 | nouveau_bo_unpin(head->base.lut.nvbo); | ||
1311 | } | ||
1305 | if (ret) | 1312 | if (ret) |
1306 | nouveau_bo_ref(NULL, &head->base.lut.nvbo); | 1313 | nouveau_bo_ref(NULL, &head->base.lut.nvbo); |
1307 | } | 1314 | } |
@@ -1324,8 +1331,11 @@ nv50_crtc_create(struct drm_device *dev, struct nouveau_object *core, int index) | |||
1324 | 0, 0x0000, NULL, &head->base.cursor.nvbo); | 1331 | 0, 0x0000, NULL, &head->base.cursor.nvbo); |
1325 | if (!ret) { | 1332 | if (!ret) { |
1326 | ret = nouveau_bo_pin(head->base.cursor.nvbo, TTM_PL_FLAG_VRAM); | 1333 | ret = nouveau_bo_pin(head->base.cursor.nvbo, TTM_PL_FLAG_VRAM); |
1327 | if (!ret) | 1334 | if (!ret) { |
1328 | ret = nouveau_bo_map(head->base.cursor.nvbo); | 1335 | ret = nouveau_bo_map(head->base.cursor.nvbo); |
1336 | if (ret) | ||
1337 | nouveau_bo_unpin(head->base.lut.nvbo); | ||
1338 | } | ||
1329 | if (ret) | 1339 | if (ret) |
1330 | nouveau_bo_ref(NULL, &head->base.cursor.nvbo); | 1340 | nouveau_bo_ref(NULL, &head->base.cursor.nvbo); |
1331 | } | 1341 | } |
@@ -1917,6 +1927,8 @@ nv50_display_destroy(struct drm_device *dev) | |||
1917 | nv50_dmac_destroy(disp->core, &disp->mast.base); | 1927 | nv50_dmac_destroy(disp->core, &disp->mast.base); |
1918 | 1928 | ||
1919 | nouveau_bo_unmap(disp->sync); | 1929 | nouveau_bo_unmap(disp->sync); |
1930 | if (disp->sync) | ||
1931 | nouveau_bo_unpin(disp->sync); | ||
1920 | nouveau_bo_ref(NULL, &disp->sync); | 1932 | nouveau_bo_ref(NULL, &disp->sync); |
1921 | 1933 | ||
1922 | nouveau_display(dev)->priv = NULL; | 1934 | nouveau_display(dev)->priv = NULL; |
@@ -1957,8 +1969,11 @@ nv50_display_create(struct drm_device *dev) | |||
1957 | 0, 0x0000, NULL, &disp->sync); | 1969 | 0, 0x0000, NULL, &disp->sync); |
1958 | if (!ret) { | 1970 | if (!ret) { |
1959 | ret = nouveau_bo_pin(disp->sync, TTM_PL_FLAG_VRAM); | 1971 | ret = nouveau_bo_pin(disp->sync, TTM_PL_FLAG_VRAM); |
1960 | if (!ret) | 1972 | if (!ret) { |
1961 | ret = nouveau_bo_map(disp->sync); | 1973 | ret = nouveau_bo_map(disp->sync); |
1974 | if (ret) | ||
1975 | nouveau_bo_unpin(disp->sync); | ||
1976 | } | ||
1962 | if (ret) | 1977 | if (ret) |
1963 | nouveau_bo_ref(NULL, &disp->sync); | 1978 | nouveau_bo_ref(NULL, &disp->sync); |
1964 | } | 1979 | } |
diff --git a/drivers/gpu/drm/nouveau/nv50_fence.c b/drivers/gpu/drm/nouveau/nv50_fence.c index e0763ea88ee2..c20f2727ea0b 100644 --- a/drivers/gpu/drm/nouveau/nv50_fence.c +++ b/drivers/gpu/drm/nouveau/nv50_fence.c | |||
@@ -110,8 +110,11 @@ nv50_fence_create(struct nouveau_drm *drm) | |||
110 | 0, 0x0000, NULL, &priv->bo); | 110 | 0, 0x0000, NULL, &priv->bo); |
111 | if (!ret) { | 111 | if (!ret) { |
112 | ret = nouveau_bo_pin(priv->bo, TTM_PL_FLAG_VRAM); | 112 | ret = nouveau_bo_pin(priv->bo, TTM_PL_FLAG_VRAM); |
113 | if (!ret) | 113 | if (!ret) { |
114 | ret = nouveau_bo_map(priv->bo); | 114 | ret = nouveau_bo_map(priv->bo); |
115 | if (ret) | ||
116 | nouveau_bo_unpin(priv->bo); | ||
117 | } | ||
115 | if (ret) | 118 | if (ret) |
116 | nouveau_bo_ref(NULL, &priv->bo); | 119 | nouveau_bo_ref(NULL, &priv->bo); |
117 | } | 120 | } |
diff --git a/drivers/gpu/drm/nouveau/nvc0_fence.c b/drivers/gpu/drm/nouveau/nvc0_fence.c index 2747baaa3c39..2a56b1b551cb 100644 --- a/drivers/gpu/drm/nouveau/nvc0_fence.c +++ b/drivers/gpu/drm/nouveau/nvc0_fence.c | |||
@@ -190,6 +190,8 @@ nvc0_fence_destroy(struct nouveau_drm *drm) | |||
190 | { | 190 | { |
191 | struct nvc0_fence_priv *priv = drm->fence; | 191 | struct nvc0_fence_priv *priv = drm->fence; |
192 | nouveau_bo_unmap(priv->bo); | 192 | nouveau_bo_unmap(priv->bo); |
193 | if (priv->bo) | ||
194 | nouveau_bo_unpin(priv->bo); | ||
193 | nouveau_bo_ref(NULL, &priv->bo); | 195 | nouveau_bo_ref(NULL, &priv->bo); |
194 | drm->fence = NULL; | 196 | drm->fence = NULL; |
195 | kfree(priv); | 197 | kfree(priv); |
@@ -219,8 +221,11 @@ nvc0_fence_create(struct nouveau_drm *drm) | |||
219 | TTM_PL_FLAG_VRAM, 0, 0, NULL, &priv->bo); | 221 | TTM_PL_FLAG_VRAM, 0, 0, NULL, &priv->bo); |
220 | if (ret == 0) { | 222 | if (ret == 0) { |
221 | ret = nouveau_bo_pin(priv->bo, TTM_PL_FLAG_VRAM); | 223 | ret = nouveau_bo_pin(priv->bo, TTM_PL_FLAG_VRAM); |
222 | if (ret == 0) | 224 | if (ret == 0) { |
223 | ret = nouveau_bo_map(priv->bo); | 225 | ret = nouveau_bo_map(priv->bo); |
226 | if (ret) | ||
227 | nouveau_bo_unpin(priv->bo); | ||
228 | } | ||
224 | if (ret) | 229 | if (ret) |
225 | nouveau_bo_ref(NULL, &priv->bo); | 230 | nouveau_bo_ref(NULL, &priv->bo); |
226 | } | 231 | } |