On Wed, Jul 06, 2022 at 10:58:53AM +0800, Miaohe Lin wrote: > On 2022/7/4 9:33, Naoya Horiguchi wrote: > > From: Naoya Horiguchi <naoya.horiguchi@xxxxxxx> > > > > Raw error info list needs to be removed when hwpoisoned hugetlb is > > unpoisoned. And unpoison handler needs to know how many errors there > > are in the target hugepage. So add them. > > > > Signed-off-by: Naoya Horiguchi <naoya.horiguchi@xxxxxxx> > > --- > > @@ -2287,6 +2301,7 @@ int unpoison_memory(unsigned long pfn) > > Is it safe to unpoison hugepage when HPageRawHwpUnreliable? I'm afraid because > some raw error info is missing.. Ah, right. We need prevent it. I'll fix it by inserting the check. static inline long free_raw_hwp_pages(struct page *hpage, bool move_flag) { struct llist_head *head; struct llist_node *t, *tnode; long count = 0; + if (!HPageRawHwpUnreliable(hpage)) + return 0; Thanks, Naoya Horiguchi > Thanks. > > > struct page *p; > > int ret = -EBUSY; > > int freeit = 0; > > + long count = 1; > > static DEFINE_RATELIMIT_STATE(unpoison_rs, DEFAULT_RATELIMIT_INTERVAL, > > DEFAULT_RATELIMIT_BURST); > > > > @@ -2334,6 +2349,8 @@ int unpoison_memory(unsigned long pfn) > > > > ret = get_hwpoison_page(p, MF_UNPOISON); > > if (!ret) { > > + if (PageHuge(p)) > > + count = free_raw_hwp_pages(page, false); > > ret = TestClearPageHWPoison(page) ? 0 : -EBUSY; > > } else if (ret < 0) { > > if (ret == -EHWPOISON) { > > @@ -2342,6 +2359,8 @@ int unpoison_memory(unsigned long pfn) > > unpoison_pr_info("Unpoison: failed to grab page %#lx\n", > > pfn, &unpoison_rs); > > } else { > > + if (PageHuge(p)) > > + count = free_raw_hwp_pages(page, false); > > freeit = !!TestClearPageHWPoison(p); > > > > put_page(page); > > @@ -2354,7 +2373,7 @@ int unpoison_memory(unsigned long pfn) > > unlock_mutex: > > mutex_unlock(&mf_mutex); > > if (!ret || freeit) { > > - num_poisoned_pages_dec(); > > + num_poisoned_pages_sub(count); > > unpoison_pr_info("Unpoison: Software-unpoisoned page %#lx\n", > > page_to_pfn(p), &unpoison_rs); > > } > >