From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753668Ab3HDCVX (ORCPT ); Sat, 3 Aug 2013 22:21:23 -0400 Received: from mga09.intel.com ([134.134.136.24]:13113 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753285Ab3HDCO1 (ORCPT ); Sat, 3 Aug 2013 22:14:27 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="4.89,810,1367996400"; d="scan'208";a="357029390" From: "Kirill A. Shutemov" To: Andrea Arcangeli , Andrew Morton Cc: Al Viro , Hugh Dickins , Wu Fengguang , Jan Kara , Mel Gorman , linux-mm@kvack.org, Andi Kleen , Matthew Wilcox , "Kirill A. Shutemov" , Hillf Danton , Dave Hansen , Ning Qu , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, "Kirill A. Shutemov" Subject: [PATCH 03/23] thp: compile-time and sysfs knob for thp pagecache Date: Sun, 4 Aug 2013 05:17:05 +0300 Message-Id: <1375582645-29274-4-git-send-email-kirill.shutemov@linux.intel.com> X-Mailer: git-send-email 1.8.3.2 In-Reply-To: <1375582645-29274-1-git-send-email-kirill.shutemov@linux.intel.com> References: <1375582645-29274-1-git-send-email-kirill.shutemov@linux.intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: "Kirill A. Shutemov" For now, TRANSPARENT_HUGEPAGE_PAGECACHE is only implemented for x86_64. Radix tree perload overhead can be significant on BASE_SMALL systems, so let's add dependency on !BASE_SMALL. /sys/kernel/mm/transparent_hugepage/page_cache is runtime knob for the feature. It's enabled by default if TRANSPARENT_HUGEPAGE_PAGECACHE is enabled. Signed-off-by: Kirill A. Shutemov --- Documentation/vm/transhuge.txt | 9 +++++++++ include/linux/huge_mm.h | 9 +++++++++ mm/Kconfig | 12 ++++++++++++ mm/huge_memory.c | 23 +++++++++++++++++++++++ 4 files changed, 53 insertions(+) diff --git a/Documentation/vm/transhuge.txt b/Documentation/vm/transhuge.txt index 4a63953..4cc15c4 100644 --- a/Documentation/vm/transhuge.txt +++ b/Documentation/vm/transhuge.txt @@ -103,6 +103,15 @@ echo always >/sys/kernel/mm/transparent_hugepage/enabled echo madvise >/sys/kernel/mm/transparent_hugepage/enabled echo never >/sys/kernel/mm/transparent_hugepage/enabled +If TRANSPARENT_HUGEPAGE_PAGECACHE is enabled kernel will use huge pages in +page cache if possible. It can be disable and re-enabled via sysfs: + +echo 0 >/sys/kernel/mm/transparent_hugepage/page_cache +echo 1 >/sys/kernel/mm/transparent_hugepage/page_cache + +If it's disabled kernel will not add new huge pages to page cache and +split them on mapping, but already mapped pages will stay intakt. + It's also possible to limit defrag efforts in the VM to generate hugepages in case they're not immediately free to madvise regions or to never try to defrag memory and simply fallback to regular pages diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 3935428..1534e1e 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -40,6 +40,7 @@ enum transparent_hugepage_flag { TRANSPARENT_HUGEPAGE_DEFRAG_FLAG, TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG, + TRANSPARENT_HUGEPAGE_PAGECACHE, TRANSPARENT_HUGEPAGE_USE_ZERO_PAGE_FLAG, #ifdef CONFIG_DEBUG_VM TRANSPARENT_HUGEPAGE_DEBUG_COW_FLAG, @@ -229,4 +230,12 @@ static inline int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_str #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ +static inline bool transparent_hugepage_pagecache(void) +{ + if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE_PAGECACHE)) + return false; + if (!(transparent_hugepage_flags & (1< Subject: [PATCH 03/23] thp: compile-time and sysfs knob for thp pagecache Date: Sun, 4 Aug 2013 05:17:05 +0300 Message-ID: <1375582645-29274-4-git-send-email-kirill.shutemov@linux.intel.com> References: <1375582645-29274-1-git-send-email-kirill.shutemov@linux.intel.com> Cc: Al Viro , Hugh Dickins , Wu Fengguang , Jan Kara , Mel Gorman , linux-mm@kvack.org, Andi Kleen , Matthew Wilcox , "Kirill A. Shutemov" , Hillf Danton , Dave Hansen , Ning Qu , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, "Kirill A. Shutemov" To: Andrea Arcangeli , Andrew Morton Return-path: In-Reply-To: <1375582645-29274-1-git-send-email-kirill.shutemov@linux.intel.com> Sender: owner-linux-mm@kvack.org List-Id: linux-fsdevel.vger.kernel.org From: "Kirill A. Shutemov" For now, TRANSPARENT_HUGEPAGE_PAGECACHE is only implemented for x86_64. Radix tree perload overhead can be significant on BASE_SMALL systems, so let's add dependency on !BASE_SMALL. /sys/kernel/mm/transparent_hugepage/page_cache is runtime knob for the feature. It's enabled by default if TRANSPARENT_HUGEPAGE_PAGECACHE is enabled. Signed-off-by: Kirill A. Shutemov --- Documentation/vm/transhuge.txt | 9 +++++++++ include/linux/huge_mm.h | 9 +++++++++ mm/Kconfig | 12 ++++++++++++ mm/huge_memory.c | 23 +++++++++++++++++++++++ 4 files changed, 53 insertions(+) diff --git a/Documentation/vm/transhuge.txt b/Documentation/vm/transhuge.txt index 4a63953..4cc15c4 100644 --- a/Documentation/vm/transhuge.txt +++ b/Documentation/vm/transhuge.txt @@ -103,6 +103,15 @@ echo always >/sys/kernel/mm/transparent_hugepage/enabled echo madvise >/sys/kernel/mm/transparent_hugepage/enabled echo never >/sys/kernel/mm/transparent_hugepage/enabled +If TRANSPARENT_HUGEPAGE_PAGECACHE is enabled kernel will use huge pages in +page cache if possible. It can be disable and re-enabled via sysfs: + +echo 0 >/sys/kernel/mm/transparent_hugepage/page_cache +echo 1 >/sys/kernel/mm/transparent_hugepage/page_cache + +If it's disabled kernel will not add new huge pages to page cache and +split them on mapping, but already mapped pages will stay intakt. + It's also possible to limit defrag efforts in the VM to generate hugepages in case they're not immediately free to madvise regions or to never try to defrag memory and simply fallback to regular pages diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index 3935428..1534e1e 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -40,6 +40,7 @@ enum transparent_hugepage_flag { TRANSPARENT_HUGEPAGE_DEFRAG_FLAG, TRANSPARENT_HUGEPAGE_DEFRAG_REQ_MADV_FLAG, TRANSPARENT_HUGEPAGE_DEFRAG_KHUGEPAGED_FLAG, + TRANSPARENT_HUGEPAGE_PAGECACHE, TRANSPARENT_HUGEPAGE_USE_ZERO_PAGE_FLAG, #ifdef CONFIG_DEBUG_VM TRANSPARENT_HUGEPAGE_DEBUG_COW_FLAG, @@ -229,4 +230,12 @@ static inline int do_huge_pmd_numa_page(struct mm_struct *mm, struct vm_area_str #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ +static inline bool transparent_hugepage_pagecache(void) +{ + if (!IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE_PAGECACHE)) + return false; + if (!(transparent_hugepage_flags & (1< email@kvack.org