]> git.ipfire.org Git - people/arne_f/kernel.git/commitdiff
Merge tag 'v3.10.31' into linux-3.10.x-grsecurity-2.9.1
authorArne Fitzenreiter <arne_f@ipfire.org>
Thu, 20 Feb 2014 19:51:46 +0000 (20:51 +0100)
committerArne Fitzenreiter <arne_f@ipfire.org>
Thu, 20 Feb 2014 19:51:46 +0000 (20:51 +0100)
This is the 3.10.31 stable release

Conflicts:
mm/memory-failure.c

1  2 
Makefile
fs/buffer.c
lib/Makefile
mm/hugetlb.c
mm/memory-failure.c
mm/page-writeback.c

diff --cc Makefile
Simple merge
diff --cc fs/buffer.c
Simple merge
diff --cc lib/Makefile
Simple merge
diff --cc mm/hugetlb.c
Simple merge
index da2b3777f72ea4df2d6372011be30554c157a460,f2a591d87d00f9b87eeac252eedb186b573cb33a..459a9b57a803b97814bbda25ec76c97de962aab4
@@@ -1508,10 -1508,9 +1508,9 @@@ static int soft_offline_huge_page(struc
                                        &num_poisoned_pages);
                } else {
                        SetPageHWPoison(page);
 -                      atomic_long_inc(&num_poisoned_pages);
 +                      atomic_long_inc_unchecked(&num_poisoned_pages);
                }
        }
-       /* keep elevated page count for bad page */
        return ret;
  }
  
@@@ -1573,10 -1572,10 +1572,10 @@@ int soft_offline_page(struct page *page
                                        &num_poisoned_pages);
                } else {
                        SetPageHWPoison(page);
 -                      atomic_long_inc(&num_poisoned_pages);
 +                      atomic_long_inc_unchecked(&num_poisoned_pages);
                }
        }
-       /* keep elevated page count for bad page */
+       unset_migratetype_isolate(page, MIGRATE_MOVABLE);
        return ret;
  }
  
@@@ -1642,8 -1641,23 +1641,23 @@@ static int __soft_offline_page(struct p
                        if (ret > 0)
                                ret = -EIO;
                } else {
+                       /*
+                        * After page migration succeeds, the source page can
+                        * be trapped in pagevec and actual freeing is delayed.
+                        * Freeing code works differently based on PG_hwpoison,
+                        * so there's a race. We need to make sure that the
+                        * source page should be freed back to buddy before
+                        * setting PG_hwpoison.
+                        */
+                       if (!is_free_buddy_page(page))
+                               lru_add_drain_all();
+                       if (!is_free_buddy_page(page))
+                               drain_all_pages();
                        SetPageHWPoison(page);
 -                      atomic_long_inc(&num_poisoned_pages);
+                       if (!is_free_buddy_page(page))
+                               pr_info("soft offline: %#lx: page leaked\n",
+                                       pfn);
 +                      atomic_long_inc_unchecked(&num_poisoned_pages);
                }
        } else {
                pr_info("soft offline: %#lx: isolation failed: %d, page count %d, type %lx\n",
Simple merge