Thread (13 messages) 13 messages, 6 authors, 2016-10-19

Re: [Intel-gfx] [PATCH v4 2/2] drm/i915: Make GPU pages movable

From: Chris Wilson <hidden>
Date: 2016-10-18 13:39:19
Also in: intel-gfx

On Tue, Oct 18, 2016 at 06:55:12PM +0530, Goel, Akash wrote:

On 10/18/2016 5:35 PM, Joonas Lahtinen wrote:
quoted
On ma, 2016-04-04 at 14:18 +0100, Chris Wilson wrote:
quoted
From: Akash Goel <redacted>

On a long run of more than 2-3 days, physical memory tends to get
fragmented severely, which considerably slows down the system. In such a
scenario, the shrinker is also unable to help as lack of memory is not
the actual problem, since it has been observed that there are enough free
pages of 0 order. This also manifests itself when an indiviual zone in
the mm runs out of pages and if we cannot migrate pages between zones,
the kernel hits an out-of-memory even though there are free pages (and
often all of swap) available.

To address the issue of external fragementation, kernel does a compaction
(which involves migration of pages) but it's efficacy depends upon how
many pages are marked as MOVABLE, as only those pages can be migrated.

Currently the backing pages for GFX buffers are allocated from shmemfs
with GFP_RECLAIMABLE flag, in units of 4KB pages.  In the case of limited
swap space, it may not be possible always to reclaim or swap-out pages of
all the inactive objects, to make way for free space allowing formation
of higher order groups of physically-contiguous pages on compaction.

Just marking the GPU pages as MOVABLE will not suffice, as i915.ko has to
pin the pages if they are in use by GPU, which will prevent their
migration. So the migratepage callback in shmem is also hooked up to get
a notification when kernel initiates the page migration. On the
notification, i915.ko appropriately unpin the pages.  With this we can
effectively mark the GPU pages as MOVABLE and hence mitigate the
fragmentation problem.

v2:
- Rename the migration routine to gem_shrink_migratepage, move it to the
  shrinker file, and use the existing constructs (Chris)
- To cleanup, add a new helper function to encapsulate all page migration
  skip conditions (Chris)
- Add a new local helper function in shrinker file, for dropping the
  backing pages, and call the same from gem_shrink() also (Chris)

v3:
- Fix/invert the check on the return value of unsafe_drop_pages (Chris)

v4:
- Minor tidy

Testcase: igt/gem_shrink
Bugzilla: (e.g.) https://bugs.freedesktop.org/show_bug.cgi?id=90254
Cc: Hugh Dickins <hughd@google.com>
Cc: linux-mm@kvack.org
Signed-off-by: Sourab Gupta <redacted>
Signed-off-by: Akash Goel <redacted>
Reviewed-by: Chris Wilson <redacted>
Could this patch be re-spinned on top of current nightly?
Sure will rebase it on top of nightly.
It's in my tree (on top of nightly) already with Joonas' r-b.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help