aboutsummaryrefslogtreecommitdiff
path: root/mm
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2012-12-18 21:32:37 -0500
committerSteven Rostedt <rostedt@goodmis.org>2012-12-18 21:32:37 -0500
commitbc4fb447f166f742a4e2fb1a10dc05bf2cc83d4b (patch)
treefa5e15c0319a1e85de451f54c990858291cc1f06 /mm
parent9162be55c3498cb110d965207652ce094f349d0b (diff)
parent4eb15b7fe7ad2a055f79eb1056a0c2d3317ff6f0 (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.c8
-rw-r--r--mm/sparse.c10
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);
}
}