MCE: fix an error of mce_bad_pages statistics
Subsystems (2)
PATCH v4 1/3 MCE: fix an error of mce_bad_pages statistics
Move poisoned page check at the beginning of the function in order to fix the error.
--- mm/memory-failure.c | 38 +++++++++++++++++--------------------- 1 files changed, 17 insertions(+), 21 deletions(-)
mm/memory-failure.c +17 -21
@@ -1419,18 +1419,17 @@ static int soft_offline_huge_page(struct page *page, int flags)unsigned long pfn =page_to_pfn (page);struct page *hpage =compound_head (page); +if (PageHWPoison (hpage)) { +pr_info ("soft offline: %#lx hugepage already poisoned\n" , pfn); +return -EBUSY ; + } + ret =get_any_page (page, pfn, flags);if (ret <0 )return ret;if (ret ==0 ) goto done; -if (PageHWPoison (hpage)) { -put_page (hpage); -pr_info ("soft offline: %#lx hugepage already poisoned\n" , pfn); -return -EBUSY ; - } -/* Keep page count to indicate a given hugepage is isolated. */ ret =migrate_huge_page (hpage, new_page,MPOL_MF_MOVE_ALL , false,MIGRATE_SYNC );
@@ -1441,12 +1440,11 @@ static int soft_offline_huge_page(struct page *page, int flags)return ret; } done: -if (!PageHWPoison (hpage)) -atomic_long_add (1 <<compound_trans_order (hpage), - &mce_bad_pages); +/* keep elevated page count for bad page */ +atomic_long_add (1 <<compound_trans_order (hpage), &mce_bad_pages);set_page_hwpoison_huge_page (hpage);dequeue_hwpoisoned_huge_page (hpage); -/* keep elevated page count for bad page */ +return ret; }
@@ -1488,6 +1486,11 @@ int soft_offline_page(struct page *page, int flags) } } +if (PageHWPoison (page)) { +pr_info ("soft offline: %#lx page already poisoned\n" , pfn); +return -EBUSY ; + } + ret =get_any_page (page, pfn, flags);if (ret <0 )return ret;
@@ -1519,19 +1522,11 @@ int soft_offline_page(struct page *page, int flags)return -EIO ; } -lock_page (page); -wait_on_page_writeback (page); -/* * Synchronized using the page lock with memory_failure() */ -if (PageHWPoison (page)) { -unlock_page (page); -put_page (page); -pr_info ("soft offline: %#lx page already poisoned\n" , pfn); -return -EBUSY ; - } - +lock_page (page); +wait_on_page_writeback (page);/* * Try to invalidate first. This should work for * non dirty unmapped page cache pages.
@@ -1582,8 +1577,9 @@ int soft_offline_page(struct page *page, int flags)return ret; done: +/* keep elevated page count for bad page */ atomic_long_add (1 , &mce_bad_pages);SetPageHWPoison (page); -/* keep elevated page count for bad page */ +return ret; }
Signature · 8 lines
1.7.1 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
Quoted 2 lines · Xishi Qiu
Move poisoned page check at the beginning of the function in order to fix the error.
Thanks for the fix.
It works fine both on normal pages and hugepages in my testing.
Just nitpick below ...
Quoted 37 lines
Signed-off-by Xishi Qiu <[email protected]>Signed-off-by Jiang Liu <[email protected]>--- mm/memory-failure.c | 38 +++++++++++++++++--------------------- 1 files changed, 17 insertions(+), 21 deletions(-)mm/memory-failure.c +5
-6@@ -1419,18 +1419,17 @@ static int soft_offline_huge_page(struct page *page, int flags)unsigned long pfn =page_to_pfn (page);struct page *hpage =compound_head (page); +if (PageHWPoison (hpage)) { +pr_info ("soft offline: %#lx hugepage already poisoned\n" , pfn); +return -EBUSY ; + } + ret =get_any_page (page, pfn, flags);if (ret <0 )return ret;if (ret ==0 ) goto done; -if (PageHWPoison (hpage)) { -put_page (hpage); -pr_info ("soft offline: %#lx hugepage already poisoned\n" , pfn); -return -EBUSY ; - } -/* Keep page count to indicate a given hugepage is isolated. */ ret =migrate_huge_page (hpage, new_page,MPOL_MF_MOVE_ALL , false,MIGRATE_SYNC );@@ -1441,12 +1440,11 @@ static int soft_offline_huge_page(struct page *page, int flags)return ret; }
mm/memory-failure.c static int soft_offline_huge_page(struct page *page, int flags) · line 1447
Quoted 10 lines
mm/memory-failure.c +3
-4done: -if (!PageHWPoison (hpage)) -atomic_long_add (1 <<compound_trans_order (hpage), - &mce_bad_pages); +/* keep elevated page count for bad page */ +atomic_long_add (1 <<compound_trans_order (hpage), &mce_bad_pages);set_page_hwpoison_huge_page (hpage);dequeue_hwpoisoned_huge_page (hpage); -/* keep elevated page count for bad page */ +
I think this comment refers to "returning without decrementing page refcount", and it's not about mce_bad_pages, so keeping the comment as it is seems good for me.
Quoted 38 lines
mm/memory-failure.c +7
-10return ret; }@@ -1488,6 +1486,11 @@ int soft_offline_page(struct page *page, int flags) } } +if (PageHWPoison (page)) { +pr_info ("soft offline: %#lx page already poisoned\n" , pfn); +return -EBUSY ; + } + ret =get_any_page (page, pfn, flags);if (ret <0 )return ret;@@ -1519,19 +1522,11 @@ int soft_offline_page(struct page *page, int flags)return -EIO ; } -lock_page (page); -wait_on_page_writeback (page); -/* * Synchronized using the page lock with memory_failure() */ -if (PageHWPoison (page)) { -unlock_page (page); -put_page (page); -pr_info ("soft offline: %#lx page already poisoned\n" , pfn); -return -EBUSY ; - } - +lock_page (page); +wait_on_page_writeback (page);/* * Try to invalidate first. This should work for * non dirty unmapped page cache pages.
mm/memory-failure.c int soft_offline_page(struct page *page, int flags) · line 1585
Quoted 10 lines
mm/memory-failure.c +2
-1@@ -1582,8 +1577,9 @@ int soft_offline_page(struct page *page, int flags)return ret; done: +/* keep elevated page count for bad page */ atomic_long_add (1 , &mce_bad_pages);SetPageHWPoison (page); -/* keep elevated page count for bad page */ +return ret; }
Ditto here.
Thanks,
Naoya
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
PATCH RESEND v4 1/3 MCE: fix an error of mce_bad_pages statistics
In reply to Xishi QiuMove poisoned page check at the beginning of the function in order to fix the error.
--- mm/memory-failure.c | 38 +++++++++++++++++--------------------- 1 files changed, 17 insertions(+), 21 deletions(-)
mm/memory-failure.c +17 -21
@@ -1419,18 +1419,17 @@ static int soft_offline_huge_page(struct page *page, int flags)unsigned long pfn =page_to_pfn (page);struct page *hpage =compound_head (page); +if (PageHWPoison (hpage)) { +pr_info ("soft offline: %#lx hugepage already poisoned\n" , pfn); +return -EBUSY ; + } + ret =get_any_page (page, pfn, flags);if (ret <0 )return ret;if (ret ==0 ) goto done; -if (PageHWPoison (hpage)) { -put_page (hpage); -pr_info ("soft offline: %#lx hugepage already poisoned\n" , pfn); -return -EBUSY ; - } -/* Keep page count to indicate a given hugepage is isolated. */ ret =migrate_huge_page (hpage, new_page,MPOL_MF_MOVE_ALL , false,MIGRATE_SYNC );
@@ -1441,12 +1440,11 @@ static int soft_offline_huge_page(struct page *page, int flags)return ret; } done: -if (!PageHWPoison (hpage)) -atomic_long_add (1 <<compound_trans_order (hpage), - &mce_bad_pages); +/* keep elevated page count for bad page */ +atomic_long_add (1 <<compound_trans_order (hpage), &mce_bad_pages);set_page_hwpoison_huge_page (hpage);dequeue_hwpoisoned_huge_page (hpage); -/* keep elevated page count for bad page */ +return ret; }
@@ -1488,6 +1486,11 @@ int soft_offline_page(struct page *page, int flags) } } +if (PageHWPoison (page)) { +pr_info ("soft offline: %#lx page already poisoned\n" , pfn); +return -EBUSY ; + } + ret =get_any_page (page, pfn, flags);if (ret <0 )return ret;
@@ -1519,19 +1522,11 @@ int soft_offline_page(struct page *page, int flags)return -EIO ; } -lock_page (page); -wait_on_page_writeback (page); -/* * Synchronized using the page lock with memory_failure() */ -if (PageHWPoison (page)) { -unlock_page (page); -put_page (page); -pr_info ("soft offline: %#lx page already poisoned\n" , pfn); -return -EBUSY ; - } - +lock_page (page); +wait_on_page_writeback (page);/* * Try to invalidate first. This should work for * non dirty unmapped page cache pages.
@@ -1582,8 +1577,9 @@ int soft_offline_page(struct page *page, int flags)return ret; done: +/* keep elevated page count for bad page */ atomic_long_add (1 , &mce_bad_pages);SetPageHWPoison (page); -/* keep elevated page count for bad page */ +return ret; }
Signature · 12 lines
1.7.1 . -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"[email protected]"> [email protected] </a>