Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 290e5505 authored by Maarten Maathuis's avatar Maarten Maathuis Committed by Dave Airlie
Browse files

drm/ttm: handle OOM in ttm_tt_swapout



- Without this change I get a general protection fault.
- Also use PTR_ERR where applicable.

Signed-off-by: default avatarMaarten Maathuis <madman2003@gmail.com>
Reviewed-by: default avatarDave Airlie <airlied@redhat.com>
Acked-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
Cc: stable@kernel.org
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 6a8a2d70
Loading
Loading
Loading
Loading
+11 −7
Original line number Diff line number Diff line
@@ -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 @@ int ttm_tt_swapout(struct ttm_tt *ttm, struct file *persistant_swap_storage)
	if (!persistant_swap_storage)
		fput(swap_storage);

	return -ENOMEM;
	return ret;
}