drm/ttm: handle OOM in ttm_tt_swapout
authorMaarten Maathuis <madman2003@gmail.com>
Sat, 20 Feb 2010 02:22:21 +0000 (03:22 +0100)
committerDave Airlie <airlied@redhat.com>
Thu, 25 Feb 2010 03:33:04 +0000 (13:33 +1000)
- 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>
Cc: stable@kernel.org
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/ttm/ttm_tt.c

index e2123af..160c274 100644 (file)
@@ -476,7 +476,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
        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,
@@ -495,8 +495,10 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
 
        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;
@@ -519,7 +521,7 @@ static int ttm_tt_swapin(struct ttm_tt *ttm)
        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)
@@ -531,6 +533,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
        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);
@@ -553,7 +556,7 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
                                                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;
@@ -565,9 +568,10 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
                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);
@@ -591,5 +595,5 @@ out_err:
        if (!persistant_swap_storage)
                fput(swap_storage);
 
-       return -ENOMEM;
+       return ret;
 }