diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/gpu/drm/ttm/ttm_tt.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (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.c | 37 |
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); | |||
49 | static void ttm_tt_alloc_page_directory(struct ttm_tt *ttm) | 50 | static 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 | ||
54 | static void ttm_tt_free_page_directory(struct ttm_tt *ttm) | 57 | static 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 | ||
60 | static void ttm_tt_free_user_pages(struct ttm_tt *ttm) | 65 | static 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 | ||
513 | int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage) | 518 | int 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; |
580 | out_err: | 585 | out_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; |