From: Nishanth Aravamudan <nacc@us.ibm.com>
To: Adam Litke <agl@us.ibm.com>
Cc: wli@holomorphy.com, clameter@sgi.com, luick@cray.com,
Lee.Schermerhorn@hp.com, linux-mm@kvack.org, npiggin@suse.de
Subject: Re: [RFC][PATCH 2/5] hugetlb: numafy several functions
Date: Mon, 14 Apr 2008 14:10:17 -0700 [thread overview]
Message-ID: <20080414211017.GC6350@us.ibm.com> (raw)
In-Reply-To: <1208184770.17385.93.camel@localhost.localdomain>
On 14.04.2008 [09:52:50 -0500], Adam Litke wrote:
>
> On Fri, 2008-04-11 at 16:47 -0700, Nishanth Aravamudan wrote:
> > +#define persistent_huge_pages_node(nid) \
> > + (nr_huge_pages_node[nid] - surplus_huge_pages_node[nid])
> > +static ssize_t hugetlb_write_nr_hugepages_node(struct sys_device *dev,
> > + const char *buf, size_t count)
> > +{
> > + int nid = dev->id;
> > + unsigned long target;
> > + unsigned long free_on_other_nodes;
> > + unsigned long nr_huge_pages_req = simple_strtoul(buf, NULL, 10);
> > +
> > + /*
> > + * Increase the pool size on the node
> > + * First take pages out of surplus state. Then make up the
> > + * remaining difference by allocating fresh huge pages.
> > + *
> > + * We might race with alloc_buddy_huge_page() here and be unable
> > + * to convert a surplus huge page to a normal huge page. That is
> > + * not critical, though, it just means the overall size of the
> > + * pool might be one hugepage larger than it needs to be, but
> > + * within all the constraints specified by the sysctls.
> > + */
> > + spin_lock(&hugetlb_lock);
> > + while (surplus_huge_pages_node[nid] &&
> > + nr_huge_pages_req > persistent_huge_pages_node(nid)) {
> > + if (!adjust_pool_surplus_node(-1, nid))
> > + break;
> > + }
> > +
> > + while (nr_huge_pages_req > persistent_huge_pages_node(nid)) {
> > + struct page *ret;
> > + /*
> > + * If this allocation races such that we no longer need the
> > + * page, free_huge_page will handle it by freeing the page
> > + * and reducing the surplus.
> > + */
> > + spin_unlock(&hugetlb_lock);
> > + ret = alloc_fresh_huge_page_node(nid);
> > + spin_lock(&hugetlb_lock);
> > + if (!ret)
> > + goto out;
> > +
> > + }
> > +
> > + if (nr_huge_pages_req >= nr_huge_pages_node[nid])
> > + goto out;
> > +
> > + /*
> > + * Decrease the pool size
> > + * First return free pages to the buddy allocator (being careful
> > + * to keep enough around to satisfy reservations). Then place
> > + * pages into surplus state as needed so the pool will shrink
> > + * to the desired size as pages become free.
> > + *
> > + * By placing pages into the surplus state independent of the
> > + * overcommit value, we are allowing the surplus pool size to
> > + * exceed overcommit. There are few sane options here. Since
> > + * alloc_buddy_huge_page() is checking the global counter,
> > + * though, we'll note that we're not allowed to exceed surplus
> > + * and won't grow the pool anywhere else. Not until one of the
> > + * sysctls are changed, or the surplus pages go out of use.
> > + */
> > + free_on_other_nodes = free_huge_pages - free_huge_pages_node[nid];
> > + if (free_on_other_nodes >= resv_huge_pages) {
> > + /* other nodes can satisfy reserve */
> > + target = nr_huge_pages_req;
> > + } else {
> > + /* this node needs some free to satisfy reserve */
> > + target = max((resv_huge_pages - free_on_other_nodes),
> > + nr_huge_pages_req);
> > + }
> > + try_to_free_low_node(nid, target);
> > + while (target < persistent_huge_pages_node(nid)) {
> > + struct page *page = dequeue_huge_page_node(NULL, nid);
> > + if (!page)
> > + break;
> > + update_and_free_page(nid, page);
> > + }
> > +
> > + while (target < persistent_huge_pages_node(nid)) {
> > + if (!adjust_pool_surplus_node(1, nid))
> > + break;
> > + }
> > +out:
> > + spin_unlock(&hugetlb_lock);
> > + return count;
> > +}
>
> Hmm, this function looks very familiar ;) Is there any way we can
> consolidate it with set_max_huge_pages()? Perhaps the new node helpers
> from the beginning of this series will help?
A good idea. I think I was more worried about getting something wrong if
I did that in my first cut after the dynamic pool was merged and just
hadn't recombined. I will work on it for the next version, once we've
come up with a consensus on the interface's location.
Thanks for the review,
Nish
--
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>
next prev parent reply other threads:[~2008-04-14 21:10 UTC|newest]
Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-04-11 23:44 [PATCH 1/5] hugetlb: numafy several functions Nishanth Aravamudan
2008-04-11 23:47 ` [RFC][PATCH 2/5] " Nishanth Aravamudan
2008-04-11 23:47 ` [PATCH 3/5] hugetlb: interleave dequeueing of huge pages Nishanth Aravamudan
2008-04-11 23:49 ` [RFC][PATCH 4/5] Documentation: add node files to sysfs ABI Nishanth Aravamudan
2008-04-11 23:50 ` [RFC][PATCH 5/5] Documentation: update ABI and hugetlbpage.txt for per-node files Nishanth Aravamudan
2008-04-11 23:56 ` [RFC][PATCH 4/5] Documentation: add node files to sysfs ABI Greg KH
2008-04-12 0:27 ` Nishanth Aravamudan
2008-04-12 9:41 ` Nick Piggin
2008-04-12 10:26 ` Christoph Lameter
2008-04-14 21:09 ` Nishanth Aravamudan
2008-04-13 3:41 ` Greg KH
2008-04-14 21:05 ` Nishanth Aravamudan
2008-04-17 23:16 ` Nishanth Aravamudan
2008-04-17 23:22 ` Christoph Lameter
2008-04-17 23:36 ` Nishanth Aravamudan
2008-04-17 23:39 ` Christoph Lameter
2008-04-18 6:04 ` Nishanth Aravamudan
2008-04-18 17:27 ` Nishanth Aravamudan
2008-04-20 2:24 ` Greg KH
2008-04-21 16:43 ` Nishanth Aravamudan
2008-04-20 2:21 ` Greg KH
2008-04-21 6:06 ` Christoph Lameter
2008-04-21 16:41 ` Nishanth Aravamudan
2008-04-22 5:14 ` Nick Piggin
2008-04-22 16:56 ` Nishanth Aravamudan
2008-04-23 1:03 ` Nick Piggin
2008-04-23 18:32 ` Nishanth Aravamudan
2008-04-23 19:07 ` Adam Litke
2008-04-24 7:13 ` Nick Piggin
2008-04-24 15:54 ` Nishanth Aravamudan
2008-04-27 3:49 ` [RFC][PATCH] hugetlb: add information and interface in sysfs [Was Re: [RFC][PATCH 4/5] Documentation: add node files to sysfs ABI] Nishanth Aravamudan
2008-04-27 5:10 ` Greg KH
2008-04-28 17:22 ` Nishanth Aravamudan
2008-04-28 17:29 ` Greg KH
2008-04-29 17:11 ` Nishanth Aravamudan
2008-04-29 17:22 ` Greg KH
2008-04-29 18:14 ` Nishanth Aravamudan
2008-04-29 18:26 ` Greg KH
2008-04-29 23:48 ` Nishanth Aravamudan
2008-05-01 3:07 ` Greg KH
2008-05-01 18:25 ` Nishanth Aravamudan
2008-04-30 19:19 ` Nishanth Aravamudan
2008-05-01 3:08 ` Greg KH
2008-05-02 17:58 ` Nishanth Aravamudan
2008-04-28 20:31 ` Christoph Lameter
2008-04-28 20:52 ` Nishanth Aravamudan
2008-04-28 21:29 ` Christoph Lameter
2008-04-29 16:43 ` Nishanth Aravamudan
2008-04-29 17:01 ` Christoph Lameter
2008-04-14 14:52 ` [RFC][PATCH 2/5] hugetlb: numafy several functions Adam Litke
2008-04-14 21:10 ` Nishanth Aravamudan [this message]
-- strict thread matches above, loose matches on Subject: below --
2007-08-06 16:32 [RFC][PATCH 0/5] hugetlb NUMA improvements Nishanth Aravamudan
2007-08-06 16:37 ` [RFC][PATCH 1/5] Fix hugetlb pool allocation with empty nodes V9 Nishanth Aravamudan
2007-08-06 16:38 ` [RFC][PATCH 2/5] hugetlb: numafy several functions Nishanth Aravamudan
2007-08-06 17:59 ` Christoph Lameter
2007-08-06 18:15 ` Nishanth Aravamudan
2007-08-07 0:34 ` Nishanth Aravamudan
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=20080414211017.GC6350@us.ibm.com \
--to=nacc@us.ibm.com \
--cc=Lee.Schermerhorn@hp.com \
--cc=agl@us.ibm.com \
--cc=clameter@sgi.com \
--cc=linux-mm@kvack.org \
--cc=luick@cray.com \
--cc=npiggin@suse.de \
--cc=wli@holomorphy.com \
/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).