summaryrefslogtreecommitdiff
path: root/include/linux
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-03-15 15:15:17 -0800
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-03-15 15:15:17 -0800
commit5bfec9f6eadf728647754ef156aac340de1cc214 (patch)
treec5e3ec54060842363715ec580359645312556a56 /include/linux
parent952a0ae394f450c878aa2e408c23236896a2efac (diff)
[PATCH] Save some memory in mem_map on x86-64
From: Andi Kleen <ak@suse.de> This patch saves 2MB of memory on a 1GB x86-64 machine, 20MB on a 10GB machine. It does this by eliminating 8 bytes of useless padding in struct page. This resurrects an older patch in a hopefully cleaner form.
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/mm.h10
-rw-r--r--include/linux/mmzone.h2
-rw-r--r--include/linux/rmap-locking.h4
3 files changed, 11 insertions, 5 deletions
diff --git a/include/linux/mm.h b/include/linux/mm.h
index da8873610af3..aaca9bd6ff8a 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -152,6 +152,12 @@ struct pte_chain;
struct mmu_gather;
struct inode;
+#ifdef ARCH_HAS_ATOMIC_UNSIGNED
+typedef unsigned page_flags_t;
+#else
+typedef unsigned long page_flags_t;
+#endif
+
/*
* Each physical page in the system has a struct page associated with
* it to keep track of whatever it is we are using the page for at the
@@ -168,7 +174,7 @@ struct inode;
* TODO: make this structure smaller, it could be as small as 32 bytes.
*/
struct page {
- unsigned long flags; /* atomic flags, some possibly
+ page_flags_t flags; /* atomic flags, some possibly
updated asynchronously */
atomic_t count; /* Usage count, see below. */
struct list_head list; /* ->mapping has some page lists. */
@@ -333,7 +339,7 @@ static inline void put_page(struct page *page)
* We'll have up to (MAX_NUMNODES * MAX_NR_ZONES) zones total,
* so we use (MAX_NODES_SHIFT + MAX_ZONES_SHIFT) here to get enough bits.
*/
-#define NODEZONE_SHIFT (BITS_PER_LONG - MAX_NODES_SHIFT - MAX_ZONES_SHIFT)
+#define NODEZONE_SHIFT (sizeof(page_flags_t)*8 - MAX_NODES_SHIFT - MAX_ZONES_SHIFT)
#define NODEZONE(node, zone) ((node << ZONES_SHIFT) | zone)
static inline unsigned long page_zonenum(struct page *page)
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 091159691236..7056b88aad40 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -316,7 +316,7 @@ extern struct pglist_data contig_page_data;
#include <asm/mmzone.h>
-#if BITS_PER_LONG == 32
+#if BITS_PER_LONG == 32 || defined(ARCH_HAS_ATOMIC_UNSIGNED)
/*
* with 32 bit page->flags field, we reserve 8 bits for node/zone info.
* there are 3 zones (2 bits) and this leaves 8-2=6 bits for nodes.
diff --git a/include/linux/rmap-locking.h b/include/linux/rmap-locking.h
index d4dd60e34e25..cb30ed470cf6 100644
--- a/include/linux/rmap-locking.h
+++ b/include/linux/rmap-locking.h
@@ -10,8 +10,8 @@
struct pte_chain;
extern kmem_cache_t *pte_chain_cache;
-#define pte_chain_lock(page) bit_spin_lock(PG_chainlock, &page->flags)
-#define pte_chain_unlock(page) bit_spin_unlock(PG_chainlock, &page->flags)
+#define pte_chain_lock(page) bit_spin_lock(PG_chainlock, (unsigned long *)&page->flags)
+#define pte_chain_unlock(page) bit_spin_unlock(PG_chainlock, (unsigned long *)&page->flags)
struct pte_chain *pte_chain_alloc(int gfp_flags);
void __pte_chain_free(struct pte_chain *pte_chain);