Prev: [PATCH 0/9] Hugepage migration (v2)
Next: [PATCH 6/9] HWPOISON, hugetlb: soft offlining for hugepage
From: Naoya Horiguchi on 10 Aug 2010 05:40 In order to handle metadatum correctly, we should check whether the hugepage we are going to access is HWPOISONed *before* incrementing mapcount, adding the hugepage into pagecache or constructing anon_vma. This patch also adds retry code when there is a race between alloc_huge_page() and memory failure. Signed-off-by: Naoya Horiguchi <n-horiguchi(a)ah.jp.nec.com> Signed-off-by: Jun'ichi Nomura <j-nomura(a)ce.jp.nec.com> --- mm/hugetlb.c | 34 +++++++++++++++++++++------------- 1 files changed, 21 insertions(+), 13 deletions(-) diff --git linux-mce-hwpoison/mm/hugetlb.c linux-mce-hwpoison/mm/hugetlb.c index a26c24a..5c77a73 100644 --- linux-mce-hwpoison/mm/hugetlb.c +++ linux-mce-hwpoison/mm/hugetlb.c @@ -2490,8 +2490,15 @@ retry: int err; struct inode *inode = mapping->host; - err = add_to_page_cache(page, mapping, idx, GFP_KERNEL); + lock_page(page); + if (unlikely(PageHWPoison(page))) { + unlock_page(page); + goto retry; + } + err = add_to_page_cache_locked(page, mapping, + idx, GFP_KERNEL); if (err) { + unlock_page(page); put_page(page); if (err == -EEXIST) goto retry; @@ -2504,6 +2511,10 @@ retry: page_dup_rmap(page); } else { lock_page(page); + if (unlikely(PageHWPoison(page))) { + unlock_page(page); + goto retry; + } if (unlikely(anon_vma_prepare(vma))) { ret = VM_FAULT_OOM; goto backout_unlocked; @@ -2511,22 +2522,19 @@ retry: hugepage_add_new_anon_rmap(page, vma, address); } } else { + /* + * If memory error occurs between mmap() and fault, some process + * don't have hwpoisoned swap entry for errored virtual address. + * So we need to block hugepage fault by PG_hwpoison bit check. + */ + if (unlikely(PageHWPoison(page))) { + ret = VM_FAULT_HWPOISON; + goto backout_unlocked; + } page_dup_rmap(page); } /* - * Since memory error handler replaces pte into hwpoison swap entry - * at the time of error handling, a process which reserved but not have - * the mapping to the error hugepage does not have hwpoison swap entry. - * So we need to block accesses from such a process by checking - * PG_hwpoison bit here. - */ - if (unlikely(PageHWPoison(page))) { - ret = VM_FAULT_HWPOISON; - goto backout_unlocked; - } - - /* * If we are going to COW a private mapping later, we examine the * pending reservations for this page now. This will ensure that * any allocations necessary to record that reservation occur outside -- 1.7.2.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |