Re: [PATCH v2 5/5] mm/hwpoison: replace most of put_page in memory error handling by put_hwpoison_page

From: Wanpeng Li
Date: Wed Aug 12 2015 - 05:35:31 EST


On 8/12/15 5:13 PM, Wanpeng Li wrote:
> On 8/12/15 4:55 PM, Naoya Horiguchi wrote:
>> On Mon, Aug 10, 2015 at 07:28:23PM +0800, Wanpeng Li wrote:
>>> Replace most of put_page in memory error handling by put_hwpoison_page,
>>> except the ones at the front of soft_offline_page since the page maybe
>>> THP page and the get refcount in madvise_hwpoison is against the single
>>> 4KB page instead of the logic in get_hwpoison_page.
>>>
>>> Signed-off-by: Wanpeng Li <wanpeng.li@xxxxxxxxxxx>
>> # Sorry for my late response.
>>
>> If I read correctly, get_user_pages_fast() (called by madvise_hwpoison)
>> for a THP tail page takes a refcount from each of head and tail page.
>> gup_huge_pmd() does this in the fast path, and get_page_foll() does this
>> in the slow path (maybe via the following code path)
>>
>> get_user_pages_unlocked
>> __get_user_pages_unlocked
>> __get_user_pages_locked
>> __get_user_pages
>> follow_page_mask
>> follow_trans_huge_pmd (with FOLL_GET set)
>> get_page_foll
>>
>> So this should be equivalent to what get_hwpoison_page() does for thp pages
>> with regard to refcounting.
>>
>> And I'm expecting that a refcount taken by get_hwpoison_page() is released
>> by put_hwpoison_page() even if the page's status is changed during error
>> handling (the typical (or only?) case is successful thp split.)
> Indeed. :-)
>
>> So I think you can apply put_hwpoison_page() for 3 more callsites in
>> mm/memory-failure.c.
>> - MF_MSG_POISONED_HUGE case
> I have already done this in my patch.
>
>> - "soft offline: %#lx page already poisoned" case (you mentioned above)
>> - "soft offline: %#lx: failed to split THP" case (you mentioned above)
> You are right, I will send a patch rebased on this one since they are
> merged.

The fix patch is in attachment. :)

Regards,
Wanpeng Li

From 3d83c40cc3f6d40883aabf9f6033cd9d78d117b5 Mon Sep 17 00:00:00 2001
From: Wanpeng Li <wanpeng.li@xxxxxxxxxxx>
Date: Wed, 12 Aug 2015 17:31:42 +0800
Subject: [PATCH] mm/hwpoison: replace most of put_page in memory error handling by put_hwpoison_page fix

Note: The patch description of original patch "mm/hwpoison: replace most of
put_page in memory error handling by put_hwpoison_page" should be replaced by
"Replace most of put_page() in memory error handling by put_hwpoison_page()".

Signed-off-by: Wanpeng Li <wanpeng.li@xxxxxxxxxxx>
---
mm/memory-failure.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/mm/memory-failure.c b/mm/memory-failure.c
index 0acafee..d378188 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -1727,7 +1727,7 @@ int soft_offline_page(struct page *page, int flags)
if (PageHWPoison(page)) {
pr_info("soft offline: %#lx page already poisoned\n", pfn);
if (flags & MF_COUNT_INCREASED)
- put_page(page);
+ put_hwpoison_page(page);
return -EBUSY;
}
if (!PageHuge(page) && PageTransHuge(hpage)) {
@@ -1735,7 +1735,7 @@ int soft_offline_page(struct page *page, int flags)
pr_info("soft offline: %#lx: failed to split THP\n",
pfn);
if (flags & MF_COUNT_INCREASED)
- put_page(page);
+ put_hwpoison_page(page);
return -EBUSY;
}
}
--
1.7.1