Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755809Ab0GBFt6 (ORCPT ); Fri, 2 Jul 2010 01:49:58 -0400 Received: from TYO201.gate.nec.co.jp ([202.32.8.193]:50917 "EHLO tyo201.gate.nec.co.jp" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754810Ab0GBFtr (ORCPT ); Fri, 2 Jul 2010 01:49:47 -0400 From: Naoya Horiguchi To: Andi Kleen Cc: Andrew Morton , Mel Gorman , Wu Fengguang , "Jun'ichi Nomura" , linux-mm , LKML Subject: [PATCH 2/7] hugetlb, HWPOISON: move PG_HWPoison bit check Date: Fri, 2 Jul 2010 14:47:21 +0900 Message-Id: <1278049646-29769-3-git-send-email-n-horiguchi@ah.jp.nec.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1278049646-29769-1-git-send-email-n-horiguchi@ah.jp.nec.com> References: <1278049646-29769-1-git-send-email-n-horiguchi@ah.jp.nec.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2764 Lines: 84 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 Signed-off-by: Jun'ichi Nomura --- mm/hugetlb.c | 34 +++++++++++++++++++++------------- 1 files changed, 21 insertions(+), 13 deletions(-) diff --git v2.6.35-rc3-hwpoison/mm/hugetlb.c v2.6.35-rc3-hwpoison/mm/hugetlb.c index a26c24a..5c77a73 100644 --- v2.6.35-rc3-hwpoison/mm/hugetlb.c +++ v2.6.35-rc3-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.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/