aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/ttm/ttm_tt.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/gpu/drm/ttm/ttm_tt.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'drivers/gpu/drm/ttm/ttm_tt.c')
-rw-r--r--drivers/gpu/drm/ttm/ttm_tt.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
index a7bab87a548b..58c271ebc0f7 100644
--- a/drivers/gpu/drm/ttm/ttm_tt.c
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
@@ -31,6 +31,7 @@
31#include <linux/sched.h> 31#include <linux/sched.h>
32#include <linux/highmem.h> 32#include <linux/highmem.h>
33#include <linux/pagemap.h> 33#include <linux/pagemap.h>
34#include <linux/shmem_fs.h>
34#include <linux/file.h> 35#include <linux/file.h>
35#include <linux/swap.h> 36#include <linux/swap.h>
36#include <linux/slab.h> 37#include <linux/slab.h>
@@ -49,12 +50,16 @@ static int ttm_tt_swapin(struct ttm_tt *ttm);
49static void ttm_tt_alloc_page_directory(struct ttm_tt *ttm) 50static void ttm_tt_alloc_page_directory(struct ttm_tt *ttm)
50{ 51{
51 ttm->pages = drm_calloc_large(ttm->num_pages, sizeof(*ttm->pages)); 52 ttm->pages = drm_calloc_large(ttm->num_pages, sizeof(*ttm->pages));
53 ttm->dma_address = drm_calloc_large(ttm->num_pages,
54 sizeof(*ttm->dma_address));
52} 55}
53 56
54static void ttm_tt_free_page_directory(struct ttm_tt *ttm) 57static void ttm_tt_free_page_directory(struct ttm_tt *ttm)
55{ 58{
56 drm_free_large(ttm->pages); 59 drm_free_large(ttm->pages);
57 ttm->pages = NULL; 60 ttm->pages = NULL;
61 drm_free_large(ttm->dma_address);
62 ttm->dma_address = NULL;
58} 63}
59 64
60static void ttm_tt_free_user_pages(struct ttm_tt *ttm) 65static void ttm_tt_free_user_pages(struct ttm_tt *ttm)
@@ -105,7 +110,8 @@ static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index)
105 110
106 INIT_LIST_HEAD(&h); 111 INIT_LIST_HEAD(&h);
107 112
108 ret = ttm_get_pages(&h, ttm->page_flags, ttm->caching_state, 1); 113 ret = ttm_get_pages(&h, ttm->page_flags, ttm->caching_state, 1,
114 &ttm->dma_address[index]);
109 115
110 if (ret != 0) 116 if (ret != 0)
111 return NULL; 117 return NULL;
@@ -164,7 +170,7 @@ int ttm_tt_populate(struct ttm_tt *ttm)
164 } 170 }
165 171
166 be->func->populate(be, ttm->num_pages, ttm->pages, 172 be->func->populate(be, ttm->num_pages, ttm->pages,
167 ttm->dummy_read_page); 173 ttm->dummy_read_page, ttm->dma_address);
168 ttm->state = tt_unbound; 174 ttm->state = tt_unbound;
169 return 0; 175 return 0;
170} 176}
@@ -298,7 +304,8 @@ static void ttm_tt_free_alloced_pages(struct ttm_tt *ttm)
298 count++; 304 count++;
299 } 305 }
300 } 306 }
301 ttm_put_pages(&h, count, ttm->page_flags, ttm->caching_state); 307 ttm_put_pages(&h, count, ttm->page_flags, ttm->caching_state,
308 ttm->dma_address);
302 ttm->state = tt_unpopulated; 309 ttm->state = tt_unpopulated;
303 ttm->first_himem_page = ttm->num_pages; 310 ttm->first_himem_page = ttm->num_pages;
304 ttm->last_lomem_page = -1; 311 ttm->last_lomem_page = -1;
@@ -326,7 +333,7 @@ void ttm_tt_destroy(struct ttm_tt *ttm)
326 ttm_tt_free_page_directory(ttm); 333 ttm_tt_free_page_directory(ttm);
327 } 334 }
328 335
329 if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTANT_SWAP) && 336 if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP) &&
330 ttm->swap_storage) 337 ttm->swap_storage)
331 fput(ttm->swap_storage); 338 fput(ttm->swap_storage);
332 339
@@ -440,10 +447,8 @@ int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
440 return ret; 447 return ret;
441 448
442 ret = be->func->bind(be, bo_mem); 449 ret = be->func->bind(be, bo_mem);
443 if (ret) { 450 if (unlikely(ret != 0))
444 printk(KERN_ERR TTM_PFX "Couldn't bind backend.\n");
445 return ret; 451 return ret;
446 }
447 452
448 ttm->state = tt_bound; 453 ttm->state = tt_bound;
449 454
@@ -480,7 +485,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
480 swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; 485 swap_space = swap_storage->f_path.dentry->d_inode->i_mapping;
481 486
482 for (i = 0; i < ttm->num_pages; ++i) { 487 for (i = 0; i < ttm->num_pages; ++i) {
483 from_page = read_mapping_page(swap_space, i, NULL); 488 from_page = shmem_read_mapping_page(swap_space, i);
484 if (IS_ERR(from_page)) { 489 if (IS_ERR(from_page)) {
485 ret = PTR_ERR(from_page); 490 ret = PTR_ERR(from_page);
486 goto out_err; 491 goto out_err;
@@ -499,7 +504,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
499 page_cache_release(from_page); 504 page_cache_release(from_page);
500 } 505 }
501 506
502 if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTANT_SWAP)) 507 if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP))
503 fput(swap_storage); 508 fput(swap_storage);
504 ttm->swap_storage = NULL; 509 ttm->swap_storage = NULL;
505 ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED; 510 ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED;
@@ -510,7 +515,7 @@ out_err:
510 return ret; 515 return ret;
511} 516}
512 517
513int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) 518int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistent_swap_storage)
514{ 519{
515 struct address_space *swap_space; 520 struct address_space *swap_space;
516 struct file *swap_storage; 521 struct file *swap_storage;
@@ -536,7 +541,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
536 return 0; 541 return 0;
537 } 542 }
538 543
539 if (!persistant_swap_storage) { 544 if (!persistent_swap_storage) {
540 swap_storage = shmem_file_setup("ttm swap", 545 swap_storage = shmem_file_setup("ttm swap",
541 ttm->num_pages << PAGE_SHIFT, 546 ttm->num_pages << PAGE_SHIFT,
542 0); 547 0);
@@ -545,7 +550,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
545 return PTR_ERR(swap_storage); 550 return PTR_ERR(swap_storage);
546 } 551 }
547 } else 552 } else
548 swap_storage = persistant_swap_storage; 553 swap_storage = persistent_swap_storage;
549 554
550 swap_space = swap_storage->f_path.dentry->d_inode->i_mapping; 555 swap_space = swap_storage->f_path.dentry->d_inode->i_mapping;
551 556
@@ -553,7 +558,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
553 from_page = ttm->pages[i]; 558 from_page = ttm->pages[i];
554 if (unlikely(from_page == NULL)) 559 if (unlikely(from_page == NULL))
555 continue; 560 continue;
556 to_page = read_mapping_page(swap_space, i, NULL); 561 to_page = shmem_read_mapping_page(swap_space, i);
557 if (unlikely(IS_ERR(to_page))) { 562 if (unlikely(IS_ERR(to_page))) {
558 ret = PTR_ERR(to_page); 563 ret = PTR_ERR(to_page);
559 goto out_err; 564 goto out_err;
@@ -573,12 +578,12 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
573 ttm_tt_free_alloced_pages(ttm); 578 ttm_tt_free_alloced_pages(ttm);
574 ttm->swap_storage = swap_storage; 579 ttm->swap_storage = swap_storage;
575 ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED; 580 ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED;
576 if (persistant_swap_storage) 581 if (persistent_swap_storage)
577 ttm->page_flags |= TTM_PAGE_FLAG_PERSISTANT_SWAP; 582 ttm->page_flags |= TTM_PAGE_FLAG_PERSISTENT_SWAP;
578 583
579 return 0; 584 return 0;
580out_err: 585out_err:
581 if (!persistant_swap_storage) 586 if (!persistent_swap_storage)
582 fput(swap_storage); 587 fput(swap_storage);
583 588
584 return ret; 589 return ret;