OSDN Git Service

mm: memory-failure: make action_result() return int
authorKefeng Wang <wangkefeng.wang@huawei.com>
Fri, 21 Oct 2022 08:46:11 +0000 (16:46 +0800)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 9 Nov 2022 01:37:21 +0000 (17:37 -0800)
Check mf_result in action_result(), only return 0 when MF_RECOVERED,
or return -EBUSY, which will simplify code a bit.

[wangkefeng.wang@huawei.com: v2]
Link: https://lkml.kernel.org/r/20221024035138.99119-1-wangkefeng.wang@huawei.com
Link: https://lkml.kernel.org/r/20221021084611.53765-3-wangkefeng.wang@huawei.com
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
Acked-by: Naoya Horiguchi <naoya.horiguchi@nec.com>
Reviewed-by: Miaohe Lin <linmiaohe@huawei.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
mm/memory-failure.c

index b5e0dba..1359455 100644 (file)
@@ -1179,14 +1179,16 @@ static struct page_state error_states[] = {
  * "Dirty/Clean" indication is not 100% accurate due to the possibility of
  * setting PG_dirty outside page lock. See also comment above set_page_dirty().
  */
-static void action_result(unsigned long pfn, enum mf_action_page_type type,
-                         enum mf_result result)
+static int action_result(unsigned long pfn, enum mf_action_page_type type,
+                        enum mf_result result)
 {
        trace_memory_failure_event(pfn, type, result);
 
        num_poisoned_pages_inc();
        pr_err("%#lx: recovery action for %s: %s\n",
                pfn, action_page_types[type], action_name[result]);
+
+       return (result == MF_RECOVERED || result == MF_DELAYED) ? 0 : -EBUSY;
 }
 
 static int page_action(struct page_state *ps, struct page *p,
@@ -1197,14 +1199,12 @@ static int page_action(struct page_state *ps, struct page *p,
        /* page p should be unlocked after returning from ps->action().  */
        result = ps->action(ps, p);
 
-       action_result(pfn, ps->type, result);
-
        /* Could do more checks here if page looks ok */
        /*
         * Could adjust zone counters here to correct for the missing page.
         */
 
-       return (result == MF_RECOVERED || result == MF_DELAYED) ? 0 : -EBUSY;
+       return action_result(pfn, ps->type, result);
 }
 
 static inline bool PageHWPoisonTakenOff(struct page *page)
@@ -1853,8 +1853,7 @@ retry:
                        flags |= MF_NO_RETRY;
                        goto retry;
                }
-               action_result(pfn, MF_MSG_UNKNOWN, MF_IGNORED);
-               return res;
+               return action_result(pfn, MF_MSG_UNKNOWN, MF_IGNORED);
        }
 
        head = compound_head(p);
@@ -1880,22 +1879,17 @@ retry:
                } else {
                        res = MF_FAILED;
                }
-               action_result(pfn, MF_MSG_FREE_HUGE, res);
-               return res == MF_RECOVERED ? 0 : -EBUSY;
+               return action_result(pfn, MF_MSG_FREE_HUGE, res);
        }
 
        page_flags = head->flags;
 
        if (!hwpoison_user_mappings(p, pfn, flags, head)) {
-               action_result(pfn, MF_MSG_UNMAP_FAILED, MF_IGNORED);
-               res = -EBUSY;
-               goto out;
+               unlock_page(head);
+               return action_result(pfn, MF_MSG_UNMAP_FAILED, MF_IGNORED);
        }
 
        return identify_page_state(pfn, p, page_flags);
-out:
-       unlock_page(head);
-       return res;
 }
 
 #else
@@ -2060,16 +2054,13 @@ try_again:
                                        }
                                        res = MF_FAILED;
                                }
-                               action_result(pfn, MF_MSG_BUDDY, res);
-                               res = res == MF_RECOVERED ? 0 : -EBUSY;
+                               res = action_result(pfn, MF_MSG_BUDDY, res);
                        } else {
-                               action_result(pfn, MF_MSG_KERNEL_HIGH_ORDER, MF_IGNORED);
-                               res = -EBUSY;
+                               res = action_result(pfn, MF_MSG_KERNEL_HIGH_ORDER, MF_IGNORED);
                        }
                        goto unlock_mutex;
                } else if (res < 0) {
-                       action_result(pfn, MF_MSG_UNKNOWN, MF_IGNORED);
-                       res = -EBUSY;
+                       res = action_result(pfn, MF_MSG_UNKNOWN, MF_IGNORED);
                        goto unlock_mutex;
                }
        }
@@ -2090,8 +2081,7 @@ try_again:
                 */
                SetPageHasHWPoisoned(hpage);
                if (try_to_split_thp_page(p) < 0) {
-                       action_result(pfn, MF_MSG_UNSPLIT_THP, MF_IGNORED);
-                       res = -EBUSY;
+                       res = action_result(pfn, MF_MSG_UNSPLIT_THP, MF_IGNORED);
                        goto unlock_mutex;
                }
                VM_BUG_ON_PAGE(!page_count(p), p);
@@ -2124,8 +2114,7 @@ try_again:
                        retry = false;
                        goto try_again;
                }
-               action_result(pfn, MF_MSG_DIFFERENT_COMPOUND, MF_IGNORED);
-               res = -EBUSY;
+               res = action_result(pfn, MF_MSG_DIFFERENT_COMPOUND, MF_IGNORED);
                goto unlock_page;
        }
 
@@ -2165,8 +2154,7 @@ try_again:
         * Abort on fail: __filemap_remove_folio() assumes unmapped page.
         */
        if (!hwpoison_user_mappings(p, pfn, flags, p)) {
-               action_result(pfn, MF_MSG_UNMAP_FAILED, MF_IGNORED);
-               res = -EBUSY;
+               res = action_result(pfn, MF_MSG_UNMAP_FAILED, MF_IGNORED);
                goto unlock_page;
        }
 
@@ -2174,8 +2162,7 @@ try_again:
         * Torn down by someone else?
         */
        if (PageLRU(p) && !PageSwapCache(p) && p->mapping == NULL) {
-               action_result(pfn, MF_MSG_TRUNCATED_LRU, MF_IGNORED);
-               res = -EBUSY;
+               res = action_result(pfn, MF_MSG_TRUNCATED_LRU, MF_IGNORED);
                goto unlock_page;
        }