Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S944588AbdDTLIE (ORCPT ); Thu, 20 Apr 2017 07:08:04 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:42289 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S942829AbdDTLIB (ORCPT ); Thu, 20 Apr 2017 07:08:01 -0400 From: Anshuman Khandual To: linux-kernel@vger.kernel.org, linux-mm@kvack.org Cc: n-horiguchi@ah.jp.nec.com, akpm@linux-foundation.org, aneesh.kumar@linux.vnet.ibm.com Subject: [PATCH] mm/madvise: Dont poison entire HugeTLB page for single page errors Date: Thu, 20 Apr 2017 16:36:27 +0530 X-Mailer: git-send-email 2.9.3 In-Reply-To: <893ecbd7-e9fa-7a54-fc62-43f8a5b8107f@linux.vnet.ibm.com> References: <893ecbd7-e9fa-7a54-fc62-43f8a5b8107f@linux.vnet.ibm.com> X-TM-AS-MML: disable x-cbid: 17042011-0004-0000-0000-000001F722A0 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17042011-0005-0000-0000-000009EB53E7 Message-Id: <20170420110627.12307-1-khandual@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-04-20_10:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=11 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1703280000 definitions=main-1704200089 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2399 Lines: 68 Currently soft_offline_page() migrates the entire HugeTLB page, then dequeues it from the active list by making it a dangling HugeTLB page which ofcourse can not be used further and marks the entire HugeTLB page as poisoned. This might be a costly waste of memory if the error involved affects only small section of the entire page. This changes the behaviour so that only the affected page is marked poisoned and then the HugeTLB page is released back to buddy system. Signed-off-by: Anshuman Khandual --- The number of poisoned pages on the system has reduced as seen from dmesg triggered with 'echo m > /proc/sysrq-enter' on powerpc. include/linux/hugetlb.h | 1 + mm/hugetlb.c | 2 +- mm/memory-failure.c | 9 ++++----- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index 7a5917d..f6b80a4 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -470,6 +470,7 @@ static inline pgoff_t basepage_index(struct page *page) return __basepage_index(page); } +extern int dissolve_free_huge_page(struct page *page); extern int dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn); static inline bool hugepage_migration_supported(struct hstate *h) diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 1edfdb8..2fb9ba3 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -1444,7 +1444,7 @@ static int free_pool_huge_page(struct hstate *h, nodemask_t *nodes_allowed, * number of free hugepages would be reduced below the number of reserved * hugepages. */ -static int dissolve_free_huge_page(struct page *page) +int dissolve_free_huge_page(struct page *page) { int rc = 0; diff --git a/mm/memory-failure.c b/mm/memory-failure.c index 27f7210..1e377fd 100644 --- a/mm/memory-failure.c +++ b/mm/memory-failure.c @@ -1597,13 +1597,12 @@ static int soft_offline_huge_page(struct page *page, int flags) ret = -EIO; } else { /* overcommit hugetlb page will be freed to buddy */ + SetPageHWPoison(page); + num_poisoned_pages_inc(); + if (PageHuge(page)) { - set_page_hwpoison_huge_page(hpage); dequeue_hwpoisoned_huge_page(hpage); - num_poisoned_pages_add(1 << compound_order(hpage)); - } else { - SetPageHWPoison(page); - num_poisoned_pages_inc(); + dissolve_free_huge_page(hpage); } } return ret; -- 1.8.5.2