Files
android_kernel_xiaomi_sm8450/include/linux
Dave Hansen 30b0a105d9 mm: thp: give transparent hugepage code a separate copy_page
Right now, the migration code in migrate_page_copy() uses copy_huge_page()
for hugetlbfs and thp pages:

       if (PageHuge(page) || PageTransHuge(page))
                copy_huge_page(newpage, page);

So, yay for code reuse.  But:

  void copy_huge_page(struct page *dst, struct page *src)
  {
        struct hstate *h = page_hstate(src);

and a non-hugetlbfs page has no page_hstate().  This works 99% of the
time because page_hstate() determines the hstate from the page order
alone.  Since the page order of a THP page matches the default hugetlbfs
page order, it works.

But, if you change the default huge page size on the boot command-line
(say default_hugepagesz=1G), then we might not even *have* a 2MB hstate
so page_hstate() returns null and copy_huge_page() oopses pretty fast
since copy_huge_page() dereferences the hstate:

  void copy_huge_page(struct page *dst, struct page *src)
  {
        struct hstate *h = page_hstate(src);
        if (unlikely(pages_per_huge_page(h) > MAX_ORDER_NR_PAGES)) {
  ...

Mel noticed that the migration code is really the only user of these
functions.  This moves all the copy code over to migrate.c and makes
copy_huge_page() work for THP by checking for it explicitly.

I believe the bug was introduced in commit b32967ff10 ("mm: numa: Add
THP migration for the NUMA working set scanning fault case")

[akpm@linux-foundation.org: fix coding-style and comment text, per Naoya Horiguchi]
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
Acked-by: Mel Gorman <mgorman@suse.de>
Reviewed-by: Naoya Horiguchi <n-horiguchi@ah.jp.nec.com>
Cc: Hillf Danton <dhillf@gmail.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>
Tested-by: Dave Jiang <dave.jiang@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2013-11-21 16:42:27 -08:00
..
2013-08-14 13:55:15 +05:30
2013-07-30 11:53:12 -04:00
2013-05-29 15:50:34 -04:00
2013-11-08 08:59:44 -07:00
2013-10-28 13:33:58 -06:00
2013-07-03 16:07:39 -07:00
2013-09-23 21:44:16 -04:00
2013-11-15 09:32:23 +09:00
2013-11-15 09:32:21 +09:00
2013-11-09 00:16:29 -05:00
2013-05-01 16:36:22 +05:30
2013-07-15 11:25:00 +09:30
2013-05-07 18:38:27 -07:00
2013-04-29 18:28:40 -07:00
2013-08-26 20:15:23 +09:00
2013-06-17 16:38:57 -07:00
2013-08-22 22:13:54 -07:00
2013-11-15 22:04:17 -05:00
2013-10-01 16:19:08 +01:00
2013-09-29 18:27:03 -07:00
2013-10-16 18:40:57 -07:00
2013-06-13 17:51:04 -07:00
2013-06-17 16:38:57 -07:00
2013-10-28 20:07:50 -04:00
2013-09-13 15:09:52 +02:00
2013-09-13 15:09:52 +02:00
2013-08-09 10:49:00 +02:00
2013-07-26 16:19:48 -07:00
2013-11-15 09:32:23 +09:00
2013-04-30 17:04:06 -07:00
2013-08-28 21:35:14 -07:00
2013-05-31 00:48:22 -07:00
2013-11-13 12:09:11 +09:00
2013-09-23 15:44:58 +09:30
2013-11-09 00:16:19 -05:00
2013-11-09 00:16:19 -05:00
2013-07-03 16:08:05 -07:00
2013-10-25 19:03:39 -04:00
2013-10-14 17:15:48 +02:00
2013-05-04 14:47:26 -04:00
2013-09-03 16:40:32 -04:00
2013-06-12 12:37:30 +01:00
2013-04-29 15:54:28 -07:00
2013-11-07 14:44:27 -07:00
2013-05-31 17:19:05 -07:00
2013-10-17 00:36:06 +02:00
2013-06-21 11:32:51 +02:00
2013-07-03 16:08:05 -07:00
2013-06-17 16:38:57 -07:00
2013-09-10 18:56:32 -04:00
2013-09-04 23:11:42 +03:00
2013-04-30 15:50:12 +05:30
2013-09-12 15:38:02 -07:00
2013-09-26 15:33:18 -07:00
2013-05-21 12:25:02 -05:00
2013-08-05 10:52:36 -06:00
2013-05-27 10:57:53 +09:00
2013-11-14 15:16:16 +11:00
2013-10-17 15:53:09 -04:00
2013-07-10 18:11:34 -07:00