Module Name:    src
Committed By:   riastradh
Date:           Sun Jul 27 00:40:40 UTC 2014

Modified Files:
        src/sys/external/bsd/drm2/dist/drm/ttm: ttm_bo.c ttm_tt.c

Log Message:
Revert ttm_bo.c 1.3 and try to fix the double-free properly.

bo->destroy doesn't ttm_tt_destroy or ttm_tt_fini anything.  Trouble
is that ttm_tt_fini expects the swap storage to still be there, and
ttm_tt_destroy -- which is what calls ttm_tt_fini by way of
ttm->func->destroy -- has already nulled it out.


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c
cvs rdiff -u -r1.5 -r1.6 src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c
diff -u src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c:1.3 src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c:1.4
--- src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c:1.3	Sat Jul 26 06:34:12 2014
+++ src/sys/external/bsd/drm2/dist/drm/ttm/ttm_bo.c	Sun Jul 27 00:40:39 2014
@@ -159,7 +159,7 @@ static void ttm_bo_release_list(struct k
 	BUG_ON(!list_empty(&bo->lru));
 	BUG_ON(!list_empty(&bo->ddestroy));
 
-	if (bo->destroy == NULL && bo->ttm)
+	if (bo->ttm)
 		ttm_tt_destroy(bo->ttm);
 	atomic_dec(&bo->glob->bo_count);
 	if (bo->resv == &bo->ttm_resv)

Index: src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c
diff -u src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c:1.5 src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c:1.6
--- src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c:1.5	Sat Jul 26 12:27:57 2014
+++ src/sys/external/bsd/drm2/dist/drm/ttm/ttm_tt.c	Sun Jul 27 00:40:39 2014
@@ -185,9 +185,9 @@ void ttm_tt_destroy(struct ttm_tt *ttm)
 	if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP) &&
 	    ttm->swap_storage)
 		fput(ttm->swap_storage);
-#endif
 
 	ttm->swap_storage = NULL;
+#endif
 	ttm->func->destroy(ttm);
 }
 

Reply via email to