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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]