Skip to content

Commit a6b4085

Browse files
Muchun Songtorvalds
authored andcommitted
mm: hugetlb: replace hugetlb_free_vmemmap_enabled with a static_key
The page_fixed_fake_head() is used throughout memory management and the conditional check requires checking a global variable, although the overhead of this check may be small, it increases when the memory cache comes under pressure. Also, the global variable will not be modified after system boot, so it is very appropriate to use static key machanism. Link: https://lkml.kernel.org/r/[email protected] Signed-off-by: Muchun Song <[email protected]> Reviewed-by: Barry Song <[email protected]> Cc: Bodeddula Balasubramaniam <[email protected]> Cc: Chen Huang <[email protected]> Cc: David Hildenbrand <[email protected]> Cc: Fam Zheng <[email protected]> Cc: Jonathan Corbet <[email protected]> Cc: Matthew Wilcox <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Mike Kravetz <[email protected]> Cc: Oscar Salvador <[email protected]> Cc: Qi Zheng <[email protected]> Cc: Xiongchun Duan <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent e7d3248 commit a6b4085

File tree

4 files changed

+21
-15
lines changed

4 files changed

+21
-15
lines changed

include/linux/hugetlb.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,12 +1075,6 @@ static inline void set_huge_swap_pte_at(struct mm_struct *mm, unsigned long addr
10751075
}
10761076
#endif /* CONFIG_HUGETLB_PAGE */
10771077

1078-
#ifdef CONFIG_HUGETLB_PAGE_FREE_VMEMMAP
1079-
extern bool hugetlb_free_vmemmap_enabled;
1080-
#else
1081-
#define hugetlb_free_vmemmap_enabled false
1082-
#endif
1083-
10841078
static inline spinlock_t *huge_pte_lock(struct hstate *h,
10851079
struct mm_struct *mm, pte_t *pte)
10861080
{

include/linux/page-flags.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,14 @@ enum pageflags {
191191
#ifndef __GENERATING_BOUNDS_H
192192

193193
#ifdef CONFIG_HUGETLB_PAGE_FREE_VMEMMAP
194-
extern bool hugetlb_free_vmemmap_enabled;
194+
DECLARE_STATIC_KEY_MAYBE(CONFIG_HUGETLB_PAGE_FREE_VMEMMAP_DEFAULT_ON,
195+
hugetlb_free_vmemmap_enabled_key);
196+
197+
static __always_inline bool hugetlb_free_vmemmap_enabled(void)
198+
{
199+
return static_branch_maybe(CONFIG_HUGETLB_PAGE_FREE_VMEMMAP_DEFAULT_ON,
200+
&hugetlb_free_vmemmap_enabled_key);
201+
}
195202

196203
/*
197204
* If the feature of freeing some vmemmap pages associated with each HugeTLB
@@ -211,7 +218,7 @@ extern bool hugetlb_free_vmemmap_enabled;
211218
*/
212219
static __always_inline const struct page *page_fixed_fake_head(const struct page *page)
213220
{
214-
if (!hugetlb_free_vmemmap_enabled)
221+
if (!hugetlb_free_vmemmap_enabled())
215222
return page;
216223

217224
/*
@@ -239,6 +246,11 @@ static inline const struct page *page_fixed_fake_head(const struct page *page)
239246
{
240247
return page;
241248
}
249+
250+
static inline bool hugetlb_free_vmemmap_enabled(void)
251+
{
252+
return false;
253+
}
242254
#endif
243255

244256
static __always_inline int page_is_fake_head(struct page *page)

mm/hugetlb_vmemmap.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,9 +188,9 @@
188188
#define RESERVE_VMEMMAP_NR 1U
189189
#define RESERVE_VMEMMAP_SIZE (RESERVE_VMEMMAP_NR << PAGE_SHIFT)
190190

191-
bool hugetlb_free_vmemmap_enabled __read_mostly =
192-
IS_ENABLED(CONFIG_HUGETLB_PAGE_FREE_VMEMMAP_DEFAULT_ON);
193-
EXPORT_SYMBOL(hugetlb_free_vmemmap_enabled);
191+
DEFINE_STATIC_KEY_MAYBE(CONFIG_HUGETLB_PAGE_FREE_VMEMMAP_DEFAULT_ON,
192+
hugetlb_free_vmemmap_enabled_key);
193+
EXPORT_SYMBOL(hugetlb_free_vmemmap_enabled_key);
194194

195195
static int __init early_hugetlb_free_vmemmap_param(char *buf)
196196
{
@@ -204,9 +204,9 @@ static int __init early_hugetlb_free_vmemmap_param(char *buf)
204204
return -EINVAL;
205205

206206
if (!strcmp(buf, "on"))
207-
hugetlb_free_vmemmap_enabled = true;
207+
static_branch_enable(&hugetlb_free_vmemmap_enabled_key);
208208
else if (!strcmp(buf, "off"))
209-
hugetlb_free_vmemmap_enabled = false;
209+
static_branch_disable(&hugetlb_free_vmemmap_enabled_key);
210210
else
211211
return -EINVAL;
212212

@@ -284,7 +284,7 @@ void __init hugetlb_vmemmap_init(struct hstate *h)
284284
BUILD_BUG_ON(__NR_USED_SUBPAGE >=
285285
RESERVE_VMEMMAP_SIZE / sizeof(struct page));
286286

287-
if (!hugetlb_free_vmemmap_enabled)
287+
if (!hugetlb_free_vmemmap_enabled())
288288
return;
289289

290290
vmemmap_pages = (nr_pages * sizeof(struct page)) >> PAGE_SHIFT;

mm/memory_hotplug.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1327,7 +1327,7 @@ bool mhp_supports_memmap_on_memory(unsigned long size)
13271327
* populate a single PMD.
13281328
*/
13291329
return memmap_on_memory &&
1330-
!hugetlb_free_vmemmap_enabled &&
1330+
!hugetlb_free_vmemmap_enabled() &&
13311331
IS_ENABLED(CONFIG_MHP_MEMMAP_ON_MEMORY) &&
13321332
size == memory_block_size_bytes() &&
13331333
IS_ALIGNED(vmemmap_size, PMD_SIZE) &&

0 commit comments

Comments
 (0)