Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1491455

[PATCH v4 3/3] mm/hugetlb: improve locking in dissolve_free_huge_pages()

From Gerald Schaefer <gerald.schaefer@de.ibm.com>
Newsgroups linux.kernel
Subject [PATCH v4 3/3] mm/hugetlb: improve locking in dissolve_free_huge_pages()
Date 2016-09-26 19:30 +0200
Message-ID <slHT3-6G2-9@gated-at.bofh.it> (permalink)
References <slHT3-6G2-1@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


For every pfn aligned to minimum_order, dissolve_free_huge_pages() will
call dissolve_free_huge_page() which takes the hugetlb spinlock, even if
the page is not huge at all or a hugepage that is in-use.

Improve this by doing the PageHuge() and page_count() checks already in
dissolve_free_huge_pages() before calling dissolve_free_huge_page(). In
dissolve_free_huge_page(), when holding the spinlock, those checks need
to be revalidated.

Signed-off-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
---
 mm/hugetlb.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index 91ae1f5..770d83e 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1476,14 +1476,20 @@ static int dissolve_free_huge_page(struct page *page)
 int dissolve_free_huge_pages(unsigned long start_pfn, unsigned long end_pfn)
 {
 	unsigned long pfn;
+	struct page *page;
 	int rc = 0;
 
 	if (!hugepages_supported())
 		return rc;
 
-	for (pfn = start_pfn; pfn < end_pfn; pfn += 1 << minimum_order)
-		if (rc = dissolve_free_huge_page(pfn_to_page(pfn)))
-			break;
+	for (pfn = start_pfn; pfn < end_pfn; pfn += 1 << minimum_order) {
+		page = pfn_to_page(pfn);
+		if (PageHuge(page) && !page_count(page)) {
+			rc = dissolve_free_huge_page(page);
+			if (rc)
+				break;
+		}
+	}
 
 	return rc;
 }
-- 
2.8.4

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCH v4 0/3] mm/hugetlb: memory offline issues with hugepages Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-26 19:30 +0200
  [PATCH v4 2/3] mm/hugetlb: check for reserved hugepages during memory offline Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-26 19:30 +0200
    Re: [PATCH v4 2/3] mm/hugetlb: check for reserved hugepages during  memory offline Michal Hocko <mhocko@kernel.org> - 2016-09-29 14:40 +0200
      Re: [PATCH v4 2/3] mm/hugetlb: check for reserved hugepages during  memory offline Mike Kravetz <mike.kravetz@oracle.com> - 2016-09-29 19:20 +0200
        Re: [PATCH v4 2/3] mm/hugetlb: check for reserved hugepages during  memory offline Michal Hocko <mhocko@kernel.org> - 2016-09-30 08:40 +0200
  [PATCH v4 3/3] mm/hugetlb: improve locking in dissolve_free_huge_pages() Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-26 19:30 +0200
    Re: [PATCH v4 3/3] mm/hugetlb: improve locking in  dissolve_free_huge_pages() Michal Hocko <mhocko@kernel.org> - 2016-09-29 14:40 +0200
  [PATCH v4 1/3] mm/hugetlb: fix memory offline with hugepage size > memory block size Gerald Schaefer <gerald.schaefer@de.ibm.com> - 2016-09-26 19:30 +0200
    Re: [PATCH v4 1/3] mm/hugetlb: fix memory offline with hugepage size  > memory block size Michal Hocko <mhocko@kernel.org> - 2016-09-29 14:20 +0200
  Re: [PATCH v4 0/3] mm/hugetlb: memory offline issues with hugepages Naoya Horiguchi <n-horiguchi@ah.jp.nec.com> - 2016-09-29 08:20 +0200

csiph-web