From: Johannes Weiner <hannes@saeurebad.de>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Ingo Molnar <mingo@elte.hu>, Yinghai Lu <yhlu.kernel@gmail.com>,
Andi Kleen <andi@firstfloor.org>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org
Subject: [PATCH -mm 07/14] bootmem: clean up free_all_bootmem_core
Date: Fri, 30 May 2008 21:42:27 +0200 [thread overview]
Message-ID: <20080530194738.582992063@saeurebad.de> (raw)
In-Reply-To: <20080530194220.286976884@saeurebad.de>
[-- Attachment #1: bootmem-cleanup-free_all_bootmem.patch --]
[-- Type: text/plain, Size: 3412 bytes --]
Rewrite the code in a more concise way using less variables.
Signed-off-by: Johannes Weiner <hannes@saeurebad.de>
CC: Ingo Molnar <mingo@elte.hu>
CC: Yinghai Lu <yhlu.kernel@gmail.com>
CC: Andi Kleen <andi@firstfloor.org>
---
mm/bootmem.c | 83 +++++++++++++++++++++++++++--------------------------------
1 file changed, 38 insertions(+), 45 deletions(-)
--- a/mm/bootmem.c
+++ b/mm/bootmem.c
@@ -144,66 +144,59 @@ unsigned long __init init_bootmem(unsign
static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
{
+ int aligned;
struct page *page;
- unsigned long pfn;
- unsigned long i, count;
- unsigned long idx, pages;
- unsigned long *map;
- int gofast = 0;
-
- BUG_ON(!bdata->node_bootmem_map);
-
- count = 0;
- /* first extant page of the node */
- pfn = PFN_DOWN(bdata->node_boot_start);
- idx = bdata->node_low_pfn - pfn;
- map = bdata->node_bootmem_map;
+ unsigned long start, end, pages, count = 0;
+
+ if (!bdata->node_bootmem_map)
+ return 0;
+
+ start = PFN_DOWN(bdata->node_boot_start);
+ end = bdata->node_low_pfn;
+
/*
- * Check if we are aligned to BITS_PER_LONG pages. If so, we might
- * be able to free page orders of that size at once.
+ * If the start is aligned to the machines wordsize, we might
+ * be able to free pages in bulks of that order.
*/
- if (!(pfn & (BITS_PER_LONG-1)))
- gofast = 1;
+ aligned = !(start & (BITS_PER_LONG - 1));
+
+ bdebug("nid=%d start=%lx end=%lx aligned=%d\n",
+ bdata - bootmem_node_data, start, end, aligned);
+
+ while (start < end) {
+ unsigned long *map, idx, vec;
- for (i = 0; i < idx; ) {
- unsigned long v = ~map[i / BITS_PER_LONG];
+ map = bdata->node_bootmem_map;
+ idx = start - PFN_DOWN(bdata->node_boot_start);
+ vec = ~map[idx / BITS_PER_LONG];
- if (gofast && v == ~0UL) {
- int order;
+ if (aligned && vec == ~0UL && start + BITS_PER_LONG < end) {
+ int order = ilog2(BITS_PER_LONG);
- page = pfn_to_page(pfn);
+ __free_pages_bootmem(pfn_to_page(start), order);
count += BITS_PER_LONG;
- order = ffs(BITS_PER_LONG) - 1;
- __free_pages_bootmem(page, order);
- i += BITS_PER_LONG;
- page += BITS_PER_LONG;
- } else if (v) {
- unsigned long m;
-
- page = pfn_to_page(pfn);
- for (m = 1; m && i < idx; m<<=1, page++, i++) {
- if (v & m) {
- count++;
+ } else {
+ unsigned long off = 0;
+
+ while (vec && off < BITS_PER_LONG) {
+ if (vec & 1) {
+ page = pfn_to_page(start + off);
__free_pages_bootmem(page, 0);
+ count++;
}
+ vec >>= 1;
+ off++;
}
- } else {
- i += BITS_PER_LONG;
}
- pfn += BITS_PER_LONG;
+ start += BITS_PER_LONG;
}
- /*
- * Now free the allocator bitmap itself, it's not
- * needed anymore:
- */
page = virt_to_page(bdata->node_bootmem_map);
pages = bdata->node_low_pfn - PFN_DOWN(bdata->node_boot_start);
- idx = bootmem_bootmap_pages(pages);
- for (i = 0; i < idx; i++, page++)
- __free_pages_bootmem(page, 0);
- count += i;
- bdata->node_bootmem_map = NULL;
+ pages = bootmem_bootmap_pages(pages);
+ count += pages;
+ while (pages--)
+ __free_pages_bootmem(page++, 0);
bdebug("nid=%d released=%ld\n", bdata - bootmem_node_data, count);
--
--
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-05-30 19:42 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-30 19:42 [PATCH -mm 00/14] bootmem rewrite v2 Johannes Weiner
2008-05-30 19:42 ` [PATCH -mm 01/14] bootmem: reorder code to match new bootmem structure Johannes Weiner
2008-05-30 19:42 ` [PATCH -mm 02/14] bootmem: clean up bootmem.c file header Johannes Weiner
2008-05-30 19:42 ` [PATCH -mm 03/14] bootmem: add documentation to API functions Johannes Weiner
2008-06-02 12:18 ` Chris Malley
2008-06-02 13:58 ` Johannes Weiner
2008-05-30 19:42 ` [PATCH -mm 04/14] bootmem: add debugging framework Johannes Weiner
2008-05-30 19:42 ` [PATCH -mm 05/14] bootmem: revisit bitmap size calculations Johannes Weiner
2008-05-30 19:42 ` [PATCH -mm 06/14] bootmem: revisit bootmem descriptor list handling Johannes Weiner
2008-05-30 19:42 ` Johannes Weiner [this message]
2008-05-30 19:42 ` [PATCH -mm 08/14] bootmem: clean up alloc_bootmem_core Johannes Weiner
2008-05-30 22:11 ` Johannes Weiner
2008-06-02 12:34 ` Yasunori Goto
2008-06-02 13:57 ` Johannes Weiner
2008-06-02 14:48 ` Yasunori Goto
2008-05-30 19:42 ` [PATCH -mm 09/14] bootmem: free/reserve helpers Johannes Weiner
2008-05-30 19:42 ` [PATCH -mm 10/14] bootmem: factor out the marking of a PFN range Johannes Weiner
2008-05-30 19:42 ` [PATCH -mm 11/14] bootmem: respect goal more likely Johannes Weiner
2008-05-30 20:16 ` Johannes Weiner
2008-05-30 19:42 ` [PATCH -mm 12/14] bootmem: Make __alloc_bootmem_low_node fall back to other nodes Johannes Weiner
2008-05-30 19:42 ` [PATCH -mm 13/14] bootmem: revisit alloc_bootmem_section Johannes Weiner
2008-05-30 19:42 ` [PATCH -mm 14/14] bootmem: replace node_boot_start in struct bootmem_data Johannes Weiner
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=20080530194738.582992063@saeurebad.de \
--to=hannes@saeurebad.de \
--cc=akpm@linux-foundation.org \
--cc=andi@firstfloor.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mingo@elte.hu \
--cc=yhlu.kernel@gmail.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