[PATCH] shrink struct page
Reduce the size of the pageframe for NR_CPUS>4, CONFIG_PREEMPT back to the minimal size by unionising both ->private and ->mapping with the pagetable lock. It uses an anonymous struct and hence requires gcc-3.x. Cc: Hugh Dickins <hugh@veritas.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
59d9136b98
commit
349aef0bc4
1 changed files with 22 additions and 19 deletions
|
@ -223,24 +223,27 @@ struct page {
|
||||||
* & limit reverse map searches.
|
* & limit reverse map searches.
|
||||||
*/
|
*/
|
||||||
union {
|
union {
|
||||||
unsigned long private; /* Mapping-private opaque data:
|
struct {
|
||||||
* usually used for buffer_heads
|
unsigned long private; /* Mapping-private opaque data:
|
||||||
* if PagePrivate set; used for
|
* usually used for buffer_heads
|
||||||
* swp_entry_t if PageSwapCache
|
* if PagePrivate set; used for
|
||||||
* When page is free, this indicates
|
* swp_entry_t if PageSwapCache.
|
||||||
* order in the buddy system.
|
* When page is free, this
|
||||||
*/
|
* indicates order in the buddy
|
||||||
|
* system.
|
||||||
|
*/
|
||||||
|
struct address_space *mapping; /* If low bit clear, points to
|
||||||
|
* inode address_space, or NULL.
|
||||||
|
* If page mapped as anonymous
|
||||||
|
* memory, low bit is set, and
|
||||||
|
* it points to anon_vma object:
|
||||||
|
* see PAGE_MAPPING_ANON below.
|
||||||
|
*/
|
||||||
|
};
|
||||||
#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS
|
#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS
|
||||||
spinlock_t ptl;
|
spinlock_t ptl;
|
||||||
#endif
|
#endif
|
||||||
} u;
|
};
|
||||||
struct address_space *mapping; /* If low bit clear, points to
|
|
||||||
* inode address_space, or NULL.
|
|
||||||
* If page mapped as anonymous
|
|
||||||
* memory, low bit is set, and
|
|
||||||
* it points to anon_vma object:
|
|
||||||
* see PAGE_MAPPING_ANON below.
|
|
||||||
*/
|
|
||||||
pgoff_t index; /* Our offset within mapping. */
|
pgoff_t index; /* Our offset within mapping. */
|
||||||
struct list_head lru; /* Pageout list, eg. active_list
|
struct list_head lru; /* Pageout list, eg. active_list
|
||||||
* protected by zone->lru_lock !
|
* protected by zone->lru_lock !
|
||||||
|
@ -261,8 +264,8 @@ struct page {
|
||||||
#endif /* WANT_PAGE_VIRTUAL */
|
#endif /* WANT_PAGE_VIRTUAL */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define page_private(page) ((page)->u.private)
|
#define page_private(page) ((page)->private)
|
||||||
#define set_page_private(page, v) ((page)->u.private = (v))
|
#define set_page_private(page, v) ((page)->private = (v))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: take this include out, include page-flags.h in
|
* FIXME: take this include out, include page-flags.h in
|
||||||
|
@ -815,7 +818,7 @@ static inline pmd_t *pmd_alloc(struct mm_struct *mm, pud_t *pud, unsigned long a
|
||||||
* overflow into the next struct page (as it might with DEBUG_SPINLOCK).
|
* overflow into the next struct page (as it might with DEBUG_SPINLOCK).
|
||||||
* When freeing, reset page->mapping so free_pages_check won't complain.
|
* When freeing, reset page->mapping so free_pages_check won't complain.
|
||||||
*/
|
*/
|
||||||
#define __pte_lockptr(page) &((page)->u.ptl)
|
#define __pte_lockptr(page) &((page)->ptl)
|
||||||
#define pte_lock_init(_page) do { \
|
#define pte_lock_init(_page) do { \
|
||||||
spin_lock_init(__pte_lockptr(_page)); \
|
spin_lock_init(__pte_lockptr(_page)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
Loading…
Reference in a new issue