diff options
author | Steven Rostedt <srostedt@redhat.com> | 2012-12-18 21:32:37 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2012-12-18 21:32:37 -0500 |
commit | bc4fb447f166f742a4e2fb1a10dc05bf2cc83d4b (patch) | |
tree | fa5e15c0319a1e85de451f54c990858291cc1f06 /mm | |
parent | 9162be55c3498cb110d965207652ce094f349d0b (diff) | |
parent | 4eb15b7fe7ad2a055f79eb1056a0c2d3317ff6f0 (diff) |
Merge tag 'v3.0.56' into v3.0-rt
This is the 3.0.56 stable release
Diffstat (limited to 'mm')
-rw-r--r-- | mm/memory-failure.c | 8 | ||||
-rw-r--r-- | mm/sparse.c | 10 |
2 files changed, 12 insertions, 6 deletions
diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 2f49dcf4f474..eace560da7f1 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -1382,9 +1382,17 @@ int soft_offline_page(struct page *page, int flags) { int ret; unsigned long pfn = page_to_pfn(page); + struct page *hpage = compound_trans_head(page); if (PageHuge(page)) return soft_offline_huge_page(page, flags); + if (PageTransHuge(hpage)) { + if (PageAnon(hpage) && unlikely(split_huge_page(hpage))) { + pr_info("soft offline: %#lx: failed to split THP\n", + pfn); + return -EBUSY; + } + } ret = get_any_page(page, pfn, flags); if (ret < 0) diff --git a/mm/sparse.c b/mm/sparse.c index 4cd05e5f2f43..9054f836cf75 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -619,7 +619,7 @@ static void __kfree_section_memmap(struct page *memmap, unsigned long nr_pages) { return; /* XXX: Not implemented yet */ } -static void free_map_bootmem(struct page *page, unsigned long nr_pages) +static void free_map_bootmem(struct page *memmap, unsigned long nr_pages) { } #else @@ -660,10 +660,11 @@ static void __kfree_section_memmap(struct page *memmap, unsigned long nr_pages) get_order(sizeof(struct page) * nr_pages)); } -static void free_map_bootmem(struct page *page, unsigned long nr_pages) +static void free_map_bootmem(struct page *memmap, unsigned long nr_pages) { unsigned long maps_section_nr, removing_section_nr, i; unsigned long magic; + struct page *page = virt_to_page(memmap); for (i = 0; i < nr_pages; i++, page++) { magic = (unsigned long) page->lru.next; @@ -712,13 +713,10 @@ static void free_section_usemap(struct page *memmap, unsigned long *usemap) */ if (memmap) { - struct page *memmap_page; - memmap_page = virt_to_page(memmap); - nr_pages = PAGE_ALIGN(PAGES_PER_SECTION * sizeof(struct page)) >> PAGE_SHIFT; - free_map_bootmem(memmap_page, nr_pages); + free_map_bootmem(memmap, nr_pages); } } |