aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorMarcin Slusarz <marcin.slusarz@gmail.com>2012-11-25 17:04:23 -0500
committerBen Skeggs <bskeggs@redhat.com>2012-11-28 18:58:11 -0500
commit04c8c21085e13011a2eaf3ae518ab44e23e21917 (patch)
treeeb7fe589503f248555e3fc7e33d071932c78dd86 /drivers/gpu
parent124ea297c8f0e0a3a567af0894fdbe05caaf80ec (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.c6
-rw-r--r--drivers/gpu/drm/nouveau/nv10_fence.c7
-rw-r--r--drivers/gpu/drm/nouveau/nv50_display.c21
-rw-r--r--drivers/gpu/drm/nouveau/nv50_fence.c5
-rw-r--r--drivers/gpu/drm/nouveau/nvc0_fence.c7
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 }