From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751573AbdA0V1t (ORCPT ); Fri, 27 Jan 2017 16:27:49 -0500 Received: from g2t1383g.austin.hpe.com ([15.233.16.89]:2146 "EHLO g2t1383g.austin.hpe.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751054AbdA0V1K (ORCPT ); Fri, 27 Jan 2017 16:27:10 -0500 From: Toshi Kani To: akpm@linux-foundation.org, gregkh@linuxfoundation.org Cc: linux-mm@kvack.org, zhenzhang.zhang@huawei.com, arbab@linux.vnet.ibm.com, dan.j.williams@intel.com, abanman@sgi.com, rientjes@google.com, linux-kernel@vger.kernel.org, stable@vger.kernel.org, toshi.kani@hpe.com Subject: [PATCH v2 1/2] mm/memory_hotplug.c: check start_pfn in test_pages_in_a_zone() Date: Fri, 27 Jan 2017 15:21:48 -0700 Message-Id: <20170127222149.30893-2-toshi.kani@hpe.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170127222149.30893-1-toshi.kani@hpe.com> References: <20170127222149.30893-1-toshi.kani@hpe.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org test_pages_in_a_zone() does not check 'start_pfn' when it is aligned by section since 'sec_end_pfn' is set equal to 'pfn'. Since this function is called for testing the range of a sysfs memory file, 'start_pfn' is always aligned by section. Fix it by properly setting 'sec_end_pfn' to the next section pfn. Also make sure that this function returns 1 only when the range belongs to a zone. Signed-off-by: Toshi Kani Cc: Andrew Morton Cc: Andrew Banman Cc: Reza Arbab Cc: # v4.4+ --- mm/memory_hotplug.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 3e3db7a..c845c5f 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1489,7 +1489,7 @@ bool is_mem_section_removable(unsigned long start_pfn, unsigned long nr_pages) } /* - * Confirm all pages in a range [start, end) is belongs to the same zone. + * Confirm all pages in a range [start, end) belong to the same zone. */ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn) { @@ -1497,9 +1497,9 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn) struct zone *zone = NULL; struct page *page; int i; - for (pfn = start_pfn, sec_end_pfn = SECTION_ALIGN_UP(start_pfn); + for (pfn = start_pfn, sec_end_pfn = SECTION_ALIGN_UP(start_pfn + 1); pfn < end_pfn; - pfn = sec_end_pfn + 1, sec_end_pfn += PAGES_PER_SECTION) { + pfn = sec_end_pfn, sec_end_pfn += PAGES_PER_SECTION) { /* Make sure the memory section is present first */ if (!present_section_nr(pfn_to_section_nr(pfn))) continue; @@ -1518,7 +1518,11 @@ int test_pages_in_a_zone(unsigned long start_pfn, unsigned long end_pfn) zone = page_zone(page); } } - return 1; + + if (zone) + return 1; + else + return 0; } /*