All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andy Whitcroft <apw@shadowen.org>
To: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Andy Whitcroft <apw@shadowen.org>,
	Dave Hansen <haveblue@us.ibm.com>, Bob Picco <bob.picco@hp.com>,
	Ingo Molnar <mingo@elte.hu>,
	"Martin J. Bligh" <mbligh@mbligh.org>, Andi Kleen <ak@suse.de>,
	linux-kernel@vger.kernel.org, Andrew Morton <akpm@osdl.org>,
	Linux Memory Management <linux-mm@kvack.org>
Subject: [PATCH 3/3] zone allow unaligned zone boundries
Date: Tue, 9 May 2006 12:05:51 +0100	[thread overview]
Message-ID: <20060509110551.GA9839@shadowen.org> (raw)
In-Reply-To: exportbomb.1147172704@pinky

zone allow unaligned zone boundries

Currently the buddy allocator requires that zone boundries be
at MAX_ORDER boundries.  This may not always be desirable or
possible.  Add a config option to allow these boundies
to be arbitrary.

Signed-off-by: Andy Whitcroft <apw@shadowen.org>
---
 include/linux/mm.h     |    7 +++++--
 include/linux/mmzone.h |    4 ++++
 mm/page_alloc.c        |   21 ++++++++++++++-------
 3 files changed, 23 insertions(+), 9 deletions(-)
diff -upN reference/include/linux/mm.h current/include/linux/mm.h
--- reference/include/linux/mm.h
+++ current/include/linux/mm.h
@@ -466,10 +466,13 @@ static inline unsigned long page_zonenum
 struct zone;
 extern struct zone *zone_table[];
 
+static inline int page_zone_id(struct page *page)
+{
+	return (page->flags >> ZONETABLE_PGSHIFT) & ZONETABLE_MASK;
+}
 static inline struct zone *page_zone(struct page *page)
 {
-	return zone_table[(page->flags >> ZONETABLE_PGSHIFT) &
-			ZONETABLE_MASK];
+	return zone_table[page_zone_id(page)];
 }
 
 static inline unsigned long page_to_nid(struct page *page)
diff -upN reference/include/linux/mmzone.h current/include/linux/mmzone.h
--- reference/include/linux/mmzone.h
+++ current/include/linux/mmzone.h
@@ -390,7 +390,11 @@ static inline int is_dma(struct zone *zo
 
 static inline unsigned long zone_boundry_align_pfn(unsigned long pfn)
 {
+#ifdef CONFIG_UNALIGNED_ZONE_BOUNDRIES
+	return pfn;
+#else
 	return pfn & ~((1 << MAX_ORDER) - 1);
+#endif
 }
 
 /* These two functions are used to setup the per zone pages min values */
diff -upN reference/mm/page_alloc.c current/mm/page_alloc.c
--- reference/mm/page_alloc.c
+++ current/mm/page_alloc.c
@@ -285,22 +285,28 @@ __find_combined_index(unsigned long page
  * we can do coalesce a page and its buddy if
  * (a) the buddy is not in a hole &&
  * (b) the buddy is in the buddy system &&
- * (c) a page and its buddy have the same order.
+ * (c) a page and its buddy have the same order &&
+ * (d) a page and its buddy are in the same zone.
  *
  * For recording whether a page is in the buddy system, we use PG_buddy.
  * Setting, clearing, and testing PG_buddy is serialized by zone->lock.
  *
  * For recording page's order, we use page_private(page).
  */
-static inline int page_is_buddy(struct page *page, int order)
+static inline int page_is_buddy(struct page *page, struct page *buddy,
+								int order)
 {
 #ifdef CONFIG_HOLES_IN_ZONE
-	if (!pfn_valid(page_to_pfn(page)))
+	if (!pfn_valid(page_to_pfn(buddy)))
+		return 0;
+#endif
+#ifdef CONFIG_UNALIGNED_ZONE_BOUNDRIES
+	if (page_zone_id(page) != page_zone_id(buddy))
 		return 0;
 #endif
 
-	if (PageBuddy(page) && page_order(page) == order) {
-		BUG_ON(page_count(page) != 0);
+	if (PageBuddy(buddy) && page_order(buddy) == order) {
+		BUG_ON(page_count(buddy) != 0);
 		return 1;
 	}
 	return 0;
@@ -351,7 +357,7 @@ static inline void __free_one_page(struc
 		struct page *buddy;
 
 		buddy = __page_find_buddy(page, page_idx, order);
-		if (!page_is_buddy(buddy, order))
+		if (!page_is_buddy(page, buddy, order))
 			break;		/* Move the buddy up one level. */
 
 		list_del(&buddy->lru);
@@ -2080,7 +2086,8 @@ static void __init free_area_init_core(s
 
 		if (zone_boundry_align_pfn(zone_start_pfn) != zone_start_pfn)
 			printk(KERN_CRIT "node %d zone %s missaligned "
-					"start pfn\n", nid, zone_names[j]);
+				"start pfn, enable UNALIGNED_ZONE_BOUNDRIES\n",
+							nid, zone_names[j]);
 
 		realsize = size = zones_size[j];
 		if (zholes_size)

WARNING: multiple messages have this Message-ID (diff)
From: Andy Whitcroft <apw@shadowen.org>
To: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Andy Whitcroft <apw@shadowen.org>,
	Dave Hansen <haveblue@us.ibm.com>, Bob Picco <bob.picco@hp.com>,
	Ingo Molnar <mingo@elte.hu>,
	"Martin J. Bligh" <mbligh@mbligh.org>, Andi Kleen <ak@suse.de>,
	linux-kernel@vger.kernel.org, Andrew Morton <akpm@osdl.org>,
	Linux Memory Management <linux-mm@kvack.org>
Subject: [PATCH 3/3] zone allow unaligned zone boundries
Date: Tue, 9 May 2006 12:05:51 +0100	[thread overview]
Message-ID: <20060509110551.GA9839@shadowen.org> (raw)
In-Reply-To: exportbomb.1147172704@pinky

zone allow unaligned zone boundries

Currently the buddy allocator requires that zone boundries be
at MAX_ORDER boundries.  This may not always be desirable or
possible.  Add a config option to allow these boundies
to be arbitrary.

Signed-off-by: Andy Whitcroft <apw@shadowen.org>
---
 include/linux/mm.h     |    7 +++++--
 include/linux/mmzone.h |    4 ++++
 mm/page_alloc.c        |   21 ++++++++++++++-------
 3 files changed, 23 insertions(+), 9 deletions(-)
diff -upN reference/include/linux/mm.h current/include/linux/mm.h
--- reference/include/linux/mm.h
+++ current/include/linux/mm.h
@@ -466,10 +466,13 @@ static inline unsigned long page_zonenum
 struct zone;
 extern struct zone *zone_table[];
 
+static inline int page_zone_id(struct page *page)
+{
+	return (page->flags >> ZONETABLE_PGSHIFT) & ZONETABLE_MASK;
+}
 static inline struct zone *page_zone(struct page *page)
 {
-	return zone_table[(page->flags >> ZONETABLE_PGSHIFT) &
-			ZONETABLE_MASK];
+	return zone_table[page_zone_id(page)];
 }
 
 static inline unsigned long page_to_nid(struct page *page)
diff -upN reference/include/linux/mmzone.h current/include/linux/mmzone.h
--- reference/include/linux/mmzone.h
+++ current/include/linux/mmzone.h
@@ -390,7 +390,11 @@ static inline int is_dma(struct zone *zo
 
 static inline unsigned long zone_boundry_align_pfn(unsigned long pfn)
 {
+#ifdef CONFIG_UNALIGNED_ZONE_BOUNDRIES
+	return pfn;
+#else
 	return pfn & ~((1 << MAX_ORDER) - 1);
+#endif
 }
 
 /* These two functions are used to setup the per zone pages min values */
diff -upN reference/mm/page_alloc.c current/mm/page_alloc.c
--- reference/mm/page_alloc.c
+++ current/mm/page_alloc.c
@@ -285,22 +285,28 @@ __find_combined_index(unsigned long page
  * we can do coalesce a page and its buddy if
  * (a) the buddy is not in a hole &&
  * (b) the buddy is in the buddy system &&
- * (c) a page and its buddy have the same order.
+ * (c) a page and its buddy have the same order &&
+ * (d) a page and its buddy are in the same zone.
  *
  * For recording whether a page is in the buddy system, we use PG_buddy.
  * Setting, clearing, and testing PG_buddy is serialized by zone->lock.
  *
  * For recording page's order, we use page_private(page).
  */
-static inline int page_is_buddy(struct page *page, int order)
+static inline int page_is_buddy(struct page *page, struct page *buddy,
+								int order)
 {
 #ifdef CONFIG_HOLES_IN_ZONE
-	if (!pfn_valid(page_to_pfn(page)))
+	if (!pfn_valid(page_to_pfn(buddy)))
+		return 0;
+#endif
+#ifdef CONFIG_UNALIGNED_ZONE_BOUNDRIES
+	if (page_zone_id(page) != page_zone_id(buddy))
 		return 0;
 #endif
 
-	if (PageBuddy(page) && page_order(page) == order) {
-		BUG_ON(page_count(page) != 0);
+	if (PageBuddy(buddy) && page_order(buddy) == order) {
+		BUG_ON(page_count(buddy) != 0);
 		return 1;
 	}
 	return 0;
@@ -351,7 +357,7 @@ static inline void __free_one_page(struc
 		struct page *buddy;
 
 		buddy = __page_find_buddy(page, page_idx, order);
-		if (!page_is_buddy(buddy, order))
+		if (!page_is_buddy(page, buddy, order))
 			break;		/* Move the buddy up one level. */
 
 		list_del(&buddy->lru);
@@ -2080,7 +2086,8 @@ static void __init free_area_init_core(s
 
 		if (zone_boundry_align_pfn(zone_start_pfn) != zone_start_pfn)
 			printk(KERN_CRIT "node %d zone %s missaligned "
-					"start pfn\n", nid, zone_names[j]);
+				"start pfn, enable UNALIGNED_ZONE_BOUNDRIES\n",
+							nid, zone_names[j]);
 
 		realsize = size = zones_size[j];
 		if (zholes_size)

--
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>

  parent reply	other threads:[~2006-05-09 11:09 UTC|newest]

Thread overview: 105+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20060419112130.GA22648@elte.hu>
2006-04-20  9:18 ` assert/crash in __rmqueue() when enabling CONFIG_NUMA Nick Piggin
2006-04-21 11:20   ` Ingo Molnar
2006-04-21 11:45     ` Ingo Molnar
2006-05-01 12:49       ` Ingo Molnar
2006-05-02  6:48         ` Andi Kleen
2006-05-02  7:06           ` Ingo Molnar
2006-05-02  7:05             ` Andi Kleen
2006-05-02  8:27               ` Ingo Molnar
2006-05-02 14:02               ` Martin J. Bligh
2006-05-02 14:25                 ` Nick Piggin
2006-05-02 14:25                   ` Nick Piggin
2006-05-04  1:32                   ` Bob Picco
2006-05-04  1:32                     ` Bob Picco
2006-05-04  8:37                     ` Ingo Molnar
2006-05-04  8:37                       ` Ingo Molnar
2006-05-04  9:14                       ` Ingo Molnar
2006-05-04  9:14                         ` Ingo Molnar
2006-05-04  9:26                         ` Ingo Molnar
2006-05-04  9:26                           ` Ingo Molnar
2006-05-04  8:37                     ` Andy Whitcroft
2006-05-04  8:37                       ` Andy Whitcroft
2006-05-04 15:21                     ` Dave Hansen
2006-05-04 15:21                       ` Dave Hansen
2006-05-04 15:46                       ` Bob Picco
2006-05-04 15:46                         ` Bob Picco
2006-05-04 16:07                         ` Dave Hansen
2006-05-04 16:07                           ` Dave Hansen
2006-05-04 19:25                         ` Ingo Molnar
2006-05-04 19:25                           ` Ingo Molnar
2006-05-04 19:43                           ` Bob Picco
2006-05-04 19:43                             ` Bob Picco
2006-05-04 21:50                             ` Andy Whitcroft
2006-05-04 21:50                               ` Andy Whitcroft
2006-05-05  5:17                               ` Ingo Molnar
2006-05-05  5:17                                 ` Ingo Molnar
2006-05-05 13:55                               ` Bob Picco
2006-05-05 13:55                                 ` Bob Picco
2006-05-05 14:33                                 ` Dave Hansen
2006-05-05 14:33                                   ` Dave Hansen
2006-05-05 14:50                                   ` Bob Picco
2006-05-05 14:50                                     ` Bob Picco
2006-05-05 14:57                                     ` Dave Hansen
2006-05-05 14:57                                       ` Dave Hansen
2006-05-05 15:03                                       ` Martin J. Bligh
2006-05-05 15:03                                         ` Martin J. Bligh
2006-05-05 16:22                                         ` Bob Picco
2006-05-05 16:22                                           ` Bob Picco
2006-05-05 16:18                                       ` Bob Picco
2006-05-05 16:18                                         ` Bob Picco
2006-05-06  8:32                                       ` Nick Piggin
2006-05-06  8:32                                         ` Nick Piggin
2006-05-07 13:07                                         ` Andy Whitcroft
2006-05-07 13:07                                           ` Andy Whitcroft
2006-05-07 13:18                                           ` Nick Piggin
2006-05-07 13:18                                             ` Nick Piggin
2006-05-09 11:05                                             ` [PATCH 0/3] Zone boundry alignment fixes Andy Whitcroft
2006-05-09 11:05                                               ` Andy Whitcroft
2006-05-09 11:05                                               ` [PATCH 1/3] zone init check and report unaligned zone boundries Andy Whitcroft
2006-05-09 11:05                                                 ` Andy Whitcroft
2006-05-09 11:28                                                 ` Nick Piggin
2006-05-09 11:28                                                   ` Nick Piggin
2006-05-09 11:05                                               ` [PATCH 2/3] x86 align highmem zone boundries with NUMA Andy Whitcroft
2006-05-09 11:05                                                 ` Andy Whitcroft
2006-05-09 11:05                                               ` Andy Whitcroft [this message]
2006-05-09 11:05                                                 ` [PATCH 3/3] zone allow unaligned zone boundries Andy Whitcroft
2006-05-11  7:59                                               ` [PATCH 0/3] Zone boundry alignment fixes Andrew Morton
2006-05-11  7:59                                                 ` Andrew Morton
2006-05-12 14:19                                                 ` Ingo Molnar
2006-05-12 14:19                                                   ` Ingo Molnar
2006-05-13  1:39                                                   ` Nick Piggin
2006-05-13  1:39                                                     ` Nick Piggin
2006-05-18 14:20                                                 ` [PATCH 0/2] Zone boundary alignment fixes cleanups Andy Whitcroft
2006-05-18 14:20                                                   ` Andy Whitcroft
2006-05-18 14:21                                                   ` [PATCH 1/2] zone init check and report unaligned zone boundaries fix Andy Whitcroft
2006-05-18 14:21                                                     ` Andy Whitcroft
2006-05-18 14:21                                                   ` [PATCH 2/2] zone allow unaligned zone boundaries spelling fix Andy Whitcroft
2006-05-18 14:21                                                     ` Andy Whitcroft
2006-05-18 14:49                                                     ` Andy Whitcroft
2006-05-18 14:49                                                       ` Andy Whitcroft
2006-05-18 15:54                                                 ` [PATCH 0/2] Zone boundary alignment fixes, cleanups v2 Andy Whitcroft
2006-05-18 15:54                                                   ` Andy Whitcroft
2006-05-18 15:55                                                   ` [PATCH 1/2] zone init check and report unaligned zone boundaries fix Andy Whitcroft
2006-05-18 15:55                                                     ` Andy Whitcroft
2006-05-18 15:55                                                   ` [PATCH 2/2] zone allow unaligned zone boundaries spelling fix Andy Whitcroft
2006-05-18 15:55                                                     ` Andy Whitcroft
2006-05-02 15:03                 ` assert/crash in __rmqueue() when enabling CONFIG_NUMA Andi Kleen
2006-05-02 15:17                   ` Martin J. Bligh
2006-05-02 15:45                     ` Andi Kleen
2006-05-02 16:02                       ` Martin J. Bligh
2006-05-02 16:05                         ` Andi Kleen
2006-05-02 19:47                         ` Ingo Molnar
2006-05-02 19:48                       ` Ingo Molnar
2006-05-02 19:44                         ` Andi Kleen
2006-05-02 19:56                           ` Martin Bligh
2006-05-02 20:00                             ` Andi Kleen
2006-05-02 20:13                               ` Ingo Molnar
2006-05-02 20:12                                 ` Andi Kleen
2006-05-02 15:52                     ` Ingo Molnar
2006-05-02 19:55                       ` [RFC, PATCH] cond_resched() added to close_files() Eric Dumazet
2006-05-03  7:01                         ` Ingo Molnar
2006-05-12  9:44                           ` Andrew Morton
2006-05-12 10:20                             ` Ingo Molnar
2006-05-12 12:24                               ` Eric Dumazet
2006-05-14  0:09                               ` Lee Revell
2006-04-21 11:51     ` assert/crash in __rmqueue() when enabling CONFIG_NUMA 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=20060509110551.GA9839@shadowen.org \
    --to=apw@shadowen.org \
    --cc=ak@suse.de \
    --cc=akpm@osdl.org \
    --cc=bob.picco@hp.com \
    --cc=haveblue@us.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=mbligh@mbligh.org \
    --cc=mingo@elte.hu \
    --cc=nickpiggin@yahoo.com.au \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.