linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Nishanth Aravamudan <nacc@us.ibm.com>
To: npiggin@suse.de
Cc: linux-mm@kvack.org, kniht@us.ibm.com, andi@firstfloor.org,
	agl@us.ibm.com, abh@cray.com, joachim.deguara@amd.com
Subject: [RFC][PATCH 2/2] hugetlb: remove multi-valued proc files.
Date: Wed, 28 May 2008 23:42:42 -0700	[thread overview]
Message-ID: <20080529064242.GD11357@us.ibm.com> (raw)
In-Reply-To: <20080529063915.GC11357@us.ibm.com>

Now that we present the same information in a cleaner way in sysfs, we
can remove the duplicate information and interfaces from procfs (and
consider them to be the legacy interface). The proc interface only
controls the default hugepage size, which is either

a) the first one specified via hugepagesz= on the kernel command-line, if any
b) the legacy huge page size, otherwise

All other hugepage size pool manipulations can occur through sysfs.

Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com>

---
Note, this does end up making the manipulation and validation of
multiple hstates impossible without sysfs enabled and mounted. As such,
I'm not sure if this is the right approach and perhaps we should be
leaving the multi-valued proc files in place (but not as the preferred
interface). Or we could present the values in procfs only if SYSFS is
not enabled in the kernel? I imagine (but am not 100% sure) that the
only current architecture where this might be important is SUPERH?

Nick, this includes the fix to make hugepages_treat_as_movable
single-valued again, which presumably will get thrown up as a merge
conflict if it's fixed at the right place in the stack.

Realistically, this patch shouldn't need to exist in the upstream
patchset, if we decide to not extend the proc files, as we can add the
sysfs files as a new patch 5 and drop the current patches 5 and 7. I can
work out how the patch should look if that is what we decide to do (or
`git-rebase -i` can :).

diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 3fe461d..fb7ef81 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -228,8 +228,8 @@ static inline struct hstate *page_hstate(struct page *page)
 	return size_to_hstate(PAGE_SIZE << compound_order(page));
 }
 
-extern unsigned long max_huge_pages[HUGE_MAX_HSTATE];
-extern unsigned long sysctl_overcommit_huge_pages[HUGE_MAX_HSTATE];
+extern unsigned long max_huge_pages;
+extern unsigned long sysctl_overcommit_huge_pages;
 
 #else
 struct hstate {};
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index da7a4aa..15b25f0 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -23,8 +23,8 @@
 #include "internal.h"
 
 const unsigned long hugetlb_zero = 0, hugetlb_infinity = ~0UL;
-unsigned long max_huge_pages[HUGE_MAX_HSTATE];
-unsigned long sysctl_overcommit_huge_pages[HUGE_MAX_HSTATE];
+unsigned long max_huge_pages;
+unsigned long sysctl_overcommit_huge_pages;
 static gfp_t htlb_alloc_mask = GFP_HIGHUSER;
 unsigned long hugepages_treat_as_movable;
 
@@ -719,7 +719,8 @@ static ssize_t nr_hugepages_store(struct kobject *kobj,
 		return 0;
 
 	h->max_huge_pages = set_max_huge_pages(h, input, &tmp);
-	max_huge_pages[h - hstates] = h->max_huge_pages;
+	if (h == hstates)
+		max_huge_pages = h->max_huge_pages;
 
 	return count;
 }
@@ -744,7 +745,8 @@ static ssize_t nr_overcommit_hugepages_store(struct kobject *kobj,
 
 	spin_lock(&hugetlb_lock);
 	h->nr_overcommit_huge_pages = input;
-	sysctl_overcommit_huge_pages[h - hstates] = h->nr_overcommit_huge_pages;
+	if (h == hstates)
+		sysctl_overcommit_huge_pages = h->nr_overcommit_huge_pages;
 	spin_unlock(&hugetlb_lock);
 
 	return count;
@@ -909,22 +911,18 @@ int hugetlb_sysctl_handler(struct ctl_table *table, int write,
 {
 	int err;
 
-	table->maxlen = max_hstate * sizeof(unsigned long);
 	err = proc_doulongvec_minmax(table, write, file, buffer, length, ppos);
 	if (err)
 		return err;
 
 	if (write) {
-		struct hstate *h;
-		for_each_hstate (h) {
-			int tmp;
-
-			h->max_huge_pages = set_max_huge_pages(h,
-					max_huge_pages[h - hstates], &tmp);
-			max_huge_pages[h - hstates] = h->max_huge_pages;
-			if (tmp && !err)
-				err = tmp;
-		}
+		struct hstate *h = hstates;
+		int tmp;
+
+		h->max_huge_pages = set_max_huge_pages(h, max_huge_pages, &tmp);
+		max_huge_pages = h->max_huge_pages;
+		if (tmp && !err)
+			err = tmp;
 	}
 	return err;
 }
@@ -933,7 +931,6 @@ int hugetlb_treat_movable_handler(struct ctl_table *table, int write,
 			struct file *file, void __user *buffer,
 			size_t *length, loff_t *ppos)
 {
- 	table->maxlen = max_hstate * sizeof(int);
 	proc_dointvec(table, write, file, buffer, length, ppos);
 	if (hugepages_treat_as_movable)
 		htlb_alloc_mask = GFP_HIGHUSER_MOVABLE;
@@ -948,19 +945,15 @@ int hugetlb_overcommit_handler(struct ctl_table *table, int write,
 {
 	int err;
 
-	table->maxlen = max_hstate * sizeof(unsigned long);
 	err = proc_doulongvec_minmax(table, write, file, buffer, length, ppos);
 	if (err)
 		return err;
 
 	if (write) {
-		struct hstate *h;
+		struct hstate *h = hstates;
 
 		spin_lock(&hugetlb_lock);
-		for_each_hstate (h) {
-			h->nr_overcommit_huge_pages =
-				sysctl_overcommit_huge_pages[h - hstates];
-		}
+		h->nr_overcommit_huge_pages = sysctl_overcommit_huge_pages;
 		spin_unlock(&hugetlb_lock);
 	}
 
@@ -969,48 +962,32 @@ int hugetlb_overcommit_handler(struct ctl_table *table, int write,
 
 #endif /* CONFIG_SYSCTL */
 
-static int dump_field(char *buf, unsigned field)
-{
-	int n = 0;
-	struct hstate *h;
-	for_each_hstate (h)
-		n += sprintf(buf + n, " %5lu", *(unsigned long *)((char *)h + field));
-	buf[n++] = '\n';
-	return n;
-}
-
 int hugetlb_report_meminfo(char *buf)
 {
-	struct hstate *h;
-	int n = 0;
-	n += sprintf(buf + 0, "HugePages_Total:");
-	n += dump_field(buf + n, offsetof(struct hstate, nr_huge_pages));
-	n += sprintf(buf + n, "HugePages_Free: ");
-	n += dump_field(buf + n, offsetof(struct hstate, free_huge_pages));
-	n += sprintf(buf + n, "HugePages_Rsvd: ");
-	n += dump_field(buf + n, offsetof(struct hstate, resv_huge_pages));
-	n += sprintf(buf + n, "HugePages_Surp: ");
-	n += dump_field(buf + n, offsetof(struct hstate, surplus_huge_pages));
-	n += sprintf(buf + n, "Hugepagesize:   ");
-	for_each_hstate (h)
-		n += sprintf(buf + n, " %5lu", huge_page_size(h) / 1024);
-	n += sprintf(buf + n, " kB\n");
-	return n;
+	struct hstate *h = hstates;
+	return sprintf(buf,
+			"HugePages_Total: %5lu\n"
+			"HugePages_Free:  %5lu\n"
+			"HugePages_Rsvd:  %5lu\n"
+			"HugePages_Surp:  %5lu\n"
+			"Hugepagesize:    %5lu kB\n",
+			h->nr_huge_pages,
+			h->free_huge_pages,
+			h->resv_huge_pages,
+			h->surplus_huge_pages,
+			huge_page_size(h) / 1024);
 }
 
 int hugetlb_report_node_meminfo(int nid, char *buf)
 {
-	int n = 0;
-	n += sprintf(buf, "Node %d HugePages_Total: ", nid);
-	n += dump_field(buf + n, offsetof(struct hstate,
-						nr_huge_pages_node[nid]));
-	n += sprintf(buf + n, "Node %d HugePages_Free: ", nid);
-	n += dump_field(buf + n, offsetof(struct hstate,
-						free_huge_pages_node[nid]));
-	n += sprintf(buf + n, "Node %d HugePages_Surp: ", nid);
-	n += dump_field(buf + n, offsetof(struct hstate,
-						surplus_huge_pages_node[nid]));
-	return n;
+	struct hstate *h = hstates;
+	return sprintf(buf,
+			"HugePages_Total: %5u\n"
+			"HugePages_Free:  %5u\n"
+			"HugePages_Surp:  %5u\n",
+			h->nr_huge_pages_node[nid],
+			h->free_huge_pages_node[nid],
+			h->surplus_huge_pages_node[nid]);
 }
 
 /* Return the number pages of memory we physically have, in PAGE_SIZE units. */

-- 
Nishanth Aravamudan <nacc@us.ibm.com>
IBM Linux Technology Center

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

  reply	other threads:[~2008-05-29  6:42 UTC|newest]

Thread overview: 88+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-25 14:23 [patch 00/23] multi size, giant hugetlb support, 1GB for x86, 16GB for powerpc npiggin
2008-05-25 14:23 ` [patch 01/23] hugetlb: fix lockdep error npiggin
2008-05-27 16:30   ` Nishanth Aravamudan
2008-05-27 19:55   ` Adam Litke
2008-05-25 14:23 ` [patch 02/23] hugetlb: factor out huge_new_page npiggin
2008-05-27 16:31   ` Nishanth Aravamudan
2008-05-27 20:03   ` Adam Litke
2008-05-25 14:23 ` [patch 03/23] hugetlb: modular state npiggin
2008-05-27 16:44   ` Nishanth Aravamudan
2008-05-28  8:40     ` Nick Piggin
2008-05-27 20:38   ` Adam Litke
2008-05-28  9:13     ` Nick Piggin
2008-05-25 14:23 ` [patch 04/23] hugetlb: multiple hstates npiggin
2008-05-27 16:52   ` Nishanth Aravamudan
2008-05-27 20:43   ` Adam Litke
2008-05-25 14:23 ` [patch 05/23] hugetlb: multi hstate proc files npiggin
2008-05-29  5:07   ` Nishanth Aravamudan
2008-05-29  5:44     ` Nishanth Aravamudan
2008-05-29  6:30       ` Nishanth Aravamudan
2008-05-29  9:04     ` Nick Piggin
2008-05-25 14:23 ` [patch 06/23] hugetlbfs: per mount hstates npiggin
2008-05-27 16:58   ` Nishanth Aravamudan
2008-05-27 20:50   ` Adam Litke
2008-05-25 14:23 ` [patch 07/23] hugetlb: multi hstate sysctls npiggin
2008-05-27 21:00   ` Adam Litke
2008-05-28  9:59     ` Nick Piggin
2008-05-29  4:59   ` Nishanth Aravamudan
2008-05-29  5:36     ` Nishanth Aravamudan
2008-05-29  8:59     ` Nick Piggin
2008-05-29  6:39   ` [RFC][PATCH 1/2] hugetlb: present information in sysfs Nishanth Aravamudan
2008-05-29  6:42     ` Nishanth Aravamudan [this message]
2008-05-30  3:51       ` [RFC][PATCH 2/2] hugetlb: remove multi-valued proc files Nick Piggin
2008-05-30  7:43         ` Nishanth Aravamudan
2008-05-30  2:58     ` [RFC][PATCH 1/2] hugetlb: present information in sysfs Greg KH
2008-05-30  3:37       ` Nick Piggin
2008-05-30  4:21         ` Greg KH
2008-05-30  4:28           ` Nick Piggin
2008-05-30  7:44           ` Nishanth Aravamudan
2008-05-30  7:41         ` Nishanth Aravamudan
2008-05-30 13:40         ` Adam Litke
2008-05-30  7:39       ` Nishanth Aravamudan
2008-05-25 14:23 ` [patch 08/23] hugetlb: abstract numa round robin selection npiggin
2008-05-27 17:01   ` Nishanth Aravamudan
2008-05-27 21:02   ` Adam Litke
2008-05-25 14:23 ` [patch 09/23] mm: introduce non panic alloc_bootmem npiggin
2008-05-25 14:23 ` [patch 10/23] mm: export prep_compound_page to mm npiggin
2008-05-27 21:05   ` Adam Litke
2008-05-25 14:23 ` [patch 11/23] hugetlb: support larger than MAX_ORDER npiggin
2008-05-27 21:23   ` Adam Litke
2008-05-28 10:22     ` Nick Piggin
2008-05-25 14:23 ` [patch 12/23] hugetlb: support boot allocate different sizes npiggin
2008-05-27 17:04   ` Nishanth Aravamudan
2008-05-27 21:28   ` Adam Litke
2008-05-28 10:57     ` Nick Piggin
2008-05-28 14:01       ` Nick Piggin
2008-05-28 14:35         ` Adam Litke
2008-05-25 14:23 ` [patch 13/23] hugetlb: printk cleanup npiggin
2008-05-27 17:05   ` Nishanth Aravamudan
2008-05-27 21:30   ` Adam Litke
2008-05-25 14:23 ` [patch 14/23] hugetlb: introduce huge_pud npiggin
2008-05-26 11:09   ` Hugh Dickins
2008-05-27  2:24     ` Nick Piggin
2008-05-25 14:23 ` [patch 15/23] x86: support GB hugepages on 64-bit npiggin
2008-05-27 21:35   ` Adam Litke
2008-05-25 14:23 ` [patch 16/23] x86: add hugepagesz option " npiggin
2008-05-25 14:23 ` [patch 17/23] hugetlb: do not always register default HPAGE_SIZE huge page size npiggin
2008-05-27 21:39   ` Adam Litke
2008-05-25 14:23 ` [patch 18/23] hugetlb: allow arch overried hugepage allocation npiggin
2008-05-27 21:41   ` Adam Litke
2008-05-25 14:23 ` [patch 19/23] powerpc: function to allocate gigantic hugepages npiggin
2008-05-27 21:44   ` Adam Litke
2008-05-25 14:23 ` [patch 20/23] powerpc: scan device tree for gigantic pages npiggin
2008-05-27 21:47   ` Adam Litke
2008-05-25 14:23 ` [patch 21/23] powerpc: define support for 16G hugepages npiggin
2008-05-25 14:23 ` [patch 22/23] fs: check for statfs overflow npiggin
2008-05-27 17:14   ` Nishanth Aravamudan
2008-05-27 17:19     ` Jon Tollefson
2008-05-28  9:02       ` Nick Piggin
2008-05-29 23:56         ` Andreas Dilger
2008-05-30  0:12           ` Nishanth Aravamudan
2008-05-30  1:14           ` Nick Piggin
2008-06-02  3:16             ` Andreas Dilger
2008-06-03  3:27               ` Nick Piggin
2008-06-03 17:17                 ` Andreas Dilger
2008-05-25 14:23 ` [patch 23/23] powerpc: support multiple hugepage sizes npiggin
2008-05-27 17:14   ` Nishanth Aravamudan
2008-05-28  8:49     ` Nick Piggin
2008-05-25 14:42 ` [patch 00/23] multi size, giant hugetlb support, 1GB for x86, 16GB for powerpc Nick Piggin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20080529064242.GD11357@us.ibm.com \
    --to=nacc@us.ibm.com \
    --cc=abh@cray.com \
    --cc=agl@us.ibm.com \
    --cc=andi@firstfloor.org \
    --cc=joachim.deguara@amd.com \
    --cc=kniht@us.ibm.com \
    --cc=linux-mm@kvack.org \
    --cc=npiggin@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).