92 lines
2.7 KiB
Diff
92 lines
2.7 KiB
Diff
|
From 290e55056ec3d25c72088628245d8cae037b30db Mon Sep 17 00:00:00 2001
|
||
|
From: Maarten Maathuis <madman2003@gmail.com>
|
||
|
Date: Sat, 20 Feb 2010 03:22:21 +0100
|
||
|
Subject: drm/ttm: handle OOM in ttm_tt_swapout
|
||
|
|
||
|
From: Maarten Maathuis <madman2003@gmail.com>
|
||
|
|
||
|
commit 290e55056ec3d25c72088628245d8cae037b30db upstream.
|
||
|
|
||
|
- Without this change I get a general protection fault.
|
||
|
- Also use PTR_ERR where applicable.
|
||
|
|
||
|
Signed-off-by: Maarten Maathuis <madman2003@gmail.com>
|
||
|
Reviewed-by: Dave Airlie <airlied@redhat.com>
|
||
|
Acked-by: Thomas Hellstrom <thellstrom@vmware.com>
|
||
|
Signed-off-by: Dave Airlie <airlied@redhat.com>
|
||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
|
||
|
|
||
|
---
|
||
|
drivers/gpu/drm/ttm/ttm_tt.c | 18 +++++++++++-------
|
||
|
1 file changed, 11 insertions(+), 7 deletions(-)
|
||
|
|
||
|
--- a/drivers/gpu/drm/ttm/ttm_tt.c
|
||
|
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
|
||
|
@@ -480,7 +480,7 @@ static int ttm_tt_swapin(struct ttm_tt *
|
||
|
void *from_virtual;
|
||
|
void *to_virtual;
|
||
|
int i;
|
||
|
- int ret;
|
||
|
+ int ret = -ENOMEM;
|
||
|
|
||
|
if (ttm->page_flags & TTM_PAGE_FLAG_USER) {
|
||
|
ret = ttm_tt_set_user(ttm, ttm->tsk, ttm->start,
|
||
|
@@ -499,8 +499,10 @@ static int ttm_tt_swapin(struct ttm_tt *
|
||
|
|
||
|
for (i = 0; i < ttm->num_pages; ++i) {
|
||
|
from_page = read_mapping_page(swap_space, i, NULL);
|
||
|
- if (IS_ERR(from_page))
|
||
|
+ if (IS_ERR(from_page)) {
|
||
|
+ ret = PTR_ERR(from_page);
|
||
|
goto out_err;
|
||
|
+ }
|
||
|
to_page = __ttm_tt_get_page(ttm, i);
|
||
|
if (unlikely(to_page == NULL))
|
||
|
goto out_err;
|
||
|
@@ -523,7 +525,7 @@ static int ttm_tt_swapin(struct ttm_tt *
|
||
|
return 0;
|
||
|
out_err:
|
||
|
ttm_tt_free_alloced_pages(ttm);
|
||
|
- return -ENOMEM;
|
||
|
+ return ret;
|
||
|
}
|
||
|
|
||
|
int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
|
||
|
@@ -535,6 +537,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, s
|
||
|
void *from_virtual;
|
||
|
void *to_virtual;
|
||
|
int i;
|
||
|
+ int ret = -ENOMEM;
|
||
|
|
||
|
BUG_ON(ttm->state != tt_unbound && ttm->state != tt_unpopulated);
|
||
|
BUG_ON(ttm->caching_state != tt_cached);
|
||
|
@@ -557,7 +560,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, s
|
||
|
0);
|
||
|
if (unlikely(IS_ERR(swap_storage))) {
|
||
|
printk(KERN_ERR "Failed allocating swap storage.\n");
|
||
|
- return -ENOMEM;
|
||
|
+ return PTR_ERR(swap_storage);
|
||
|
}
|
||
|
} else
|
||
|
swap_storage = persistant_swap_storage;
|
||
|
@@ -569,9 +572,10 @@ int ttm_tt_swapout(struct ttm_tt *ttm, s
|
||
|
if (unlikely(from_page == NULL))
|
||
|
continue;
|
||
|
to_page = read_mapping_page(swap_space, i, NULL);
|
||
|
- if (unlikely(to_page == NULL))
|
||
|
+ if (unlikely(IS_ERR(to_page))) {
|
||
|
+ ret = PTR_ERR(to_page);
|
||
|
goto out_err;
|
||
|
-
|
||
|
+ }
|
||
|
preempt_disable();
|
||
|
from_virtual = kmap_atomic(from_page, KM_USER0);
|
||
|
to_virtual = kmap_atomic(to_page, KM_USER1);
|
||
|
@@ -595,5 +599,5 @@ out_err:
|
||
|
if (!persistant_swap_storage)
|
||
|
fput(swap_storage);
|
||
|
|
||
|
- return -ENOMEM;
|
||
|
+ return ret;
|
||
|
}
|