From c88209f7a21ed0c257cc215a7874df50d5e525d5 Mon Sep 17 00:00:00 2001 From: CAI Qian Date: Tue, 4 Jan 2011 15:30:00 +0800 Subject: [PATCH] hugetlb: remove overcommit sysfs for 1GB pages 1GB pages cannot be over-commited, attempting to do so results in corruption, so remove those files for simplicity. Symptoms: 1) setup 1gb hugepages. cat /proc/cmdline ...default_hugepagesz=1g hugepagesz=1g hugepages=1... cat /proc/meminfo ... HugePages_Total: 1 HugePages_Free: 1 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 1048576 kB ... 2) set nr_overcommit_hugepages echo 1 >/sys/kernel/mm/hugepages/hugepages-1048576kB/nr_overcommit_hugepages cat /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_overcommit_hugepages 1 3) overcommit 2gb hugepages. mmap(NULL, 18446744071562067968, PROT_READ|PROT_WRITE, MAP_SHARED, 3, 0) = -1 ENOMEM (Cannot allocate memory) cat /sys/kernel/mm/hugepages/hugepages-1048576kB/nr_overcommit_hugepages 18446744071589420672 Signed-off-by: CAI Qian --- mm/hugetlb.c | 23 +++++++++++++++++++++-- 1 files changed, 21 insertions(+), 2 deletions(-) diff --git a/mm/hugetlb.c b/mm/hugetlb.c index c4a3558..adc9a9f 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -1587,6 +1587,20 @@ static struct attribute_group hstate_attr_group = { .attrs = hstate_attrs, }; +static struct attribute *hstate_1gb_attrs[] = { + &nr_hugepages_attr.attr, + &free_hugepages_attr.attr, + &resv_hugepages_attr.attr, +#ifdef CONFIG_NUMA + &nr_hugepages_mempolicy_attr.attr, +#endif + NULL, +}; + +static struct attribute_group hstate_1gb_attr_group = { + .attrs = hstate_1gb_attrs, +}; + static int hugetlb_sysfs_add_hstate(struct hstate *h, struct kobject *parent, struct kobject **hstate_kobjs, struct attribute_group *hstate_attr_group) @@ -1615,8 +1629,13 @@ static void __init hugetlb_sysfs_init(void) return; for_each_hstate(h) { - err = hugetlb_sysfs_add_hstate(h, hugepages_kobj, - hstate_kobjs, &hstate_attr_group); + /* 1GB pages can not be over-committed, so don't need those files. */ + if (huge_page_size(h) == 1UL << 30) + err = hugetlb_sysfs_add_hstate(h, hugepages_kobj, + hstate_kobjs, &hstate_1gb_attr_group); + else + err = hugetlb_sysfs_add_hstate(h, hugepages_kobj, + hstate_kobjs, &hstate_attr_group); if (err) printk(KERN_ERR "Hugetlb: Unable to add hstate %s", h->name); -- 1.7.3.2