49 lines
2.2 KiB
Diff
49 lines
2.2 KiB
Diff
|
From: Linus Torvalds <torvalds@linux-foundation.org>
|
||
|
Date: Sun, 18 Jul 2010 16:44:37 +0000 (-0700)
|
||
|
Subject: drm/i915: add 'reclaimable' to i915 self-reclaimable page allocations
|
||
|
X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=cd9f040df6ce46573760a507cb88192d05d27d86
|
||
|
|
||
|
drm/i915: add 'reclaimable' to i915 self-reclaimable page allocations
|
||
|
|
||
|
The hibernate issues that got fixed in commit 985b823b9192 ("drm/i915:
|
||
|
fix hibernation since i915 self-reclaim fixes") turn out to have been
|
||
|
incomplete. Vefa Bicakci tested lots of hibernate cycles, and without
|
||
|
the __GFP_RECLAIMABLE flag the system eventually fails to resume.
|
||
|
|
||
|
With the flag added, Vefa can apparently hibernate forever (or until he
|
||
|
gets bored running his automated scripts, whichever comes first).
|
||
|
|
||
|
The reclaimable flag was there originally, and was one of the flags that
|
||
|
were dropped (unintentionally) by commit 4bdadb978569 ("drm/i915:
|
||
|
Selectively enable self-reclaim") that introduced all these problems,
|
||
|
but I didn't want to just blindly add back all the flags in commit
|
||
|
985b823b9192, and it looked like __GFP_RECLAIM wasn't necessary. It
|
||
|
clearly was.
|
||
|
|
||
|
I still suspect that there is some subtle reason we're missing that
|
||
|
causes the problems, but __GFP_RECLAIMABLE is certainly not wrong to use
|
||
|
in this context, and is what the code historically used. And we have no
|
||
|
idea what the causes the corruption without it.
|
||
|
|
||
|
Reported-and-tested-by: M. Vefa Bicakci <bicave@superonline.com>
|
||
|
Cc: Dave Airlie <airlied@gmail.com>
|
||
|
Cc: Chris Wilson <chris@chris-wilson.co.uk>
|
||
|
Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
|
||
|
Cc: Hugh Dickins <hugh.dickins@tiscali.co.uk>
|
||
|
Cc: stable@kernel.org
|
||
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||
|
---
|
||
|
|
||
|
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
|
||
|
index 0743858..8757ecf 100644
|
||
|
--- a/drivers/gpu/drm/i915/i915_gem.c
|
||
|
+++ b/drivers/gpu/drm/i915/i915_gem.c
|
||
|
@@ -2241,6 +2241,7 @@ i915_gem_object_get_pages(struct drm_gem_object *obj,
|
||
|
page = read_cache_page_gfp(mapping, i,
|
||
|
GFP_HIGHUSER |
|
||
|
__GFP_COLD |
|
||
|
+ __GFP_RECLAIMABLE |
|
||
|
gfpmask);
|
||
|
if (IS_ERR(page))
|
||
|
goto err_pages;
|