mm/mremap: allow moves within the same VMA for stack moves
[linux-2.6-microblaze.git] / mm / memory-failure.c
index 4d6e43c..660c218 100644 (file)
@@ -1713,20 +1713,23 @@ static void unmap_and_kill(struct list_head *to_kill, unsigned long pfn,
        kill_procs(to_kill, flags & MF_MUST_KILL, false, pfn, flags);
 }
 
+/*
+ * Only dev_pagemap pages get here, such as fsdax when the filesystem
+ * either do not claim or fails to claim a hwpoison event, or devdax.
+ * The fsdax pages are initialized per base page, and the devdax pages
+ * could be initialized either as base pages, or as compound pages with
+ * vmemmap optimization enabled. Devdax is simplistic in its dealing with
+ * hwpoison, such that, if a subpage of a compound page is poisoned,
+ * simply mark the compound head page is by far sufficient.
+ */
 static int mf_generic_kill_procs(unsigned long long pfn, int flags,
                struct dev_pagemap *pgmap)
 {
-       struct page *page = pfn_to_page(pfn);
+       struct folio *folio = pfn_folio(pfn);
        LIST_HEAD(to_kill);
        dax_entry_t cookie;
        int rc = 0;
 
-       /*
-        * Pages instantiated by device-dax (not filesystem-dax)
-        * may be compound pages.
-        */
-       page = compound_head(page);
-
        /*
         * Prevent the inode from being freed while we are interrogating
         * the address_space, typically this would be handled by
@@ -1734,11 +1737,11 @@ static int mf_generic_kill_procs(unsigned long long pfn, int flags,
         * also prevents changes to the mapping of this pfn until
         * poison signaling is complete.
         */
-       cookie = dax_lock_page(page);
+       cookie = dax_lock_folio(folio);
        if (!cookie)
                return -EBUSY;
 
-       if (hwpoison_filter(page)) {
+       if (hwpoison_filter(&folio->page)) {
                rc = -EOPNOTSUPP;
                goto unlock;
        }
@@ -1760,7 +1763,7 @@ static int mf_generic_kill_procs(unsigned long long pfn, int flags,
         * Use this flag as an indication that the dax page has been
         * remapped UC to prevent speculative consumption of poison.
         */
-       SetPageHWPoison(page);
+       SetPageHWPoison(&folio->page);
 
        /*
         * Unlike System-RAM there is no possibility to swap in a
@@ -1769,11 +1772,11 @@ static int mf_generic_kill_procs(unsigned long long pfn, int flags,
         * SIGBUS (i.e. MF_MUST_KILL)
         */
        flags |= MF_ACTION_REQUIRED | MF_MUST_KILL;
-       collect_procs(page, &to_kill, true);
+       collect_procs(&folio->page, &to_kill, true);
 
-       unmap_and_kill(&to_kill, pfn, page->mapping, page->index, flags);
+       unmap_and_kill(&to_kill, pfn, folio->mapping, folio->index, flags);
 unlock:
-       dax_unlock_page(page, cookie);
+       dax_unlock_folio(folio, cookie);
        return rc;
 }