Skip to content

Commit f000565

Browse files
aagittorvalds
authored andcommitted
thp: set recommended min free kbytes
If transparent hugepage is enabled initialize min_free_kbytes to an optimal value by default. This moves the hugeadm algorithm in kernel. Signed-off-by: Andrea Arcangeli <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent cd7548a commit f000565

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

mm/huge_memory.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,47 @@ struct khugepaged_scan {
8585
.mm_head = LIST_HEAD_INIT(khugepaged_scan.mm_head),
8686
};
8787

88+
89+
static int set_recommended_min_free_kbytes(void)
90+
{
91+
struct zone *zone;
92+
int nr_zones = 0;
93+
unsigned long recommended_min;
94+
extern int min_free_kbytes;
95+
96+
if (!test_bit(TRANSPARENT_HUGEPAGE_FLAG,
97+
&transparent_hugepage_flags) &&
98+
!test_bit(TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG,
99+
&transparent_hugepage_flags))
100+
return 0;
101+
102+
for_each_populated_zone(zone)
103+
nr_zones++;
104+
105+
/* Make sure at least 2 hugepages are free for MIGRATE_RESERVE */
106+
recommended_min = pageblock_nr_pages * nr_zones * 2;
107+
108+
/*
109+
* Make sure that on average at least two pageblocks are almost free
110+
* of another type, one for a migratetype to fall back to and a
111+
* second to avoid subsequent fallbacks of other types There are 3
112+
* MIGRATE_TYPES we care about.
113+
*/
114+
recommended_min += pageblock_nr_pages * nr_zones *
115+
MIGRATE_PCPTYPES * MIGRATE_PCPTYPES;
116+
117+
/* don't ever allow to reserve more than 5% of the lowmem */
118+
recommended_min = min(recommended_min,
119+
(unsigned long) nr_free_buffer_pages() / 20);
120+
recommended_min <<= (PAGE_SHIFT-10);
121+
122+
if (recommended_min > min_free_kbytes)
123+
min_free_kbytes = recommended_min;
124+
setup_per_zone_wmarks();
125+
return 0;
126+
}
127+
late_initcall(set_recommended_min_free_kbytes);
128+
88129
static int start_khugepaged(void)
89130
{
90131
int err = 0;
@@ -108,6 +149,8 @@ static int start_khugepaged(void)
108149
mutex_unlock(&khugepaged_mutex);
109150
if (wakeup)
110151
wake_up_interruptible(&khugepaged_wait);
152+
153+
set_recommended_min_free_kbytes();
111154
} else
112155
/* wakeup to exit */
113156
wake_up_interruptible(&khugepaged_wait);
@@ -177,6 +220,13 @@ static ssize_t enabled_store(struct kobject *kobj,
177220
ret = err;
178221
}
179222

223+
if (ret > 0 &&
224+
(test_bit(TRANSPARENT_HUGEPAGE_FLAG,
225+
&transparent_hugepage_flags) ||
226+
test_bit(TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG,
227+
&transparent_hugepage_flags)))
228+
set_recommended_min_free_kbytes();
229+
180230
return ret;
181231
}
182232
static struct kobj_attribute enabled_attr =
@@ -464,6 +514,8 @@ static int __init hugepage_init(void)
464514

465515
start_khugepaged();
466516

517+
set_recommended_min_free_kbytes();
518+
467519
out:
468520
return err;
469521
}

0 commit comments

Comments
 (0)