Commit 422e43d4 authored by Dave Hansen's avatar Dave Hansen Committed by Linus Torvalds

[PATCH] kill off highmem_start_page

People love to do comparisons with highmem_start_page.  However, where
CONFIG_HIGHMEM=y and there is no actual highmem, there's no real page at
*highmem_start_page.

That's usually not a problem, but CONFIG_NONLINEAR is a bit more strict and
catches the bogus address tranlations. 

There are about a gillion different ways to find out of a 'struct page' is
highmem or not.  Why not just check page_flags?  Just use PageHighMem()
wherever there used to be a highmem_start_page comparison.  Then, kill off
highmem_start_page.

This removes more code than it adds, and gets rid of some nasty
#ifdefs in .c files.
Signed-off-by: default avatarDave Hansen <haveblue@us.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent ea86630e
...@@ -464,11 +464,6 @@ void __init set_highmem_pages_init(int bad_ppro) ...@@ -464,11 +464,6 @@ void __init set_highmem_pages_init(int bad_ppro)
void __init set_max_mapnr_init(void) void __init set_max_mapnr_init(void)
{ {
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
struct zone *high0 = &NODE_DATA(0)->node_zones[ZONE_HIGHMEM];
if (high0->spanned_pages > 0)
highmem_start_page = high0->zone_mem_map;
else
highmem_start_page = pfn_to_page(max_low_pfn - 1) + 1;
num_physpages = highend_pfn; num_physpages = highend_pfn;
#else #else
num_physpages = max_low_pfn; num_physpages = max_low_pfn;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
void *kmap(struct page *page) void *kmap(struct page *page)
{ {
might_sleep(); might_sleep();
if (page < highmem_start_page) if (!PageHighMem(page))
return page_address(page); return page_address(page);
return kmap_high(page); return kmap_high(page);
} }
...@@ -12,7 +12,7 @@ void kunmap(struct page *page) ...@@ -12,7 +12,7 @@ void kunmap(struct page *page)
{ {
if (in_interrupt()) if (in_interrupt())
BUG(); BUG();
if (page < highmem_start_page) if (!PageHighMem(page))
return; return;
kunmap_high(page); kunmap_high(page);
} }
...@@ -32,7 +32,7 @@ void *kmap_atomic(struct page *page, enum km_type type) ...@@ -32,7 +32,7 @@ void *kmap_atomic(struct page *page, enum km_type type)
/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
inc_preempt_count(); inc_preempt_count();
if (page < highmem_start_page) if (!PageHighMem(page))
return page_address(page); return page_address(page);
idx = type + KM_TYPE_NR*smp_processor_id(); idx = type + KM_TYPE_NR*smp_processor_id();
......
...@@ -555,7 +555,6 @@ void __init test_wp_bit(void) ...@@ -555,7 +555,6 @@ void __init test_wp_bit(void)
static void __init set_max_mapnr_init(void) static void __init set_max_mapnr_init(void)
{ {
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
highmem_start_page = pfn_to_page(highstart_pfn);
max_mapnr = num_physpages = highend_pfn; max_mapnr = num_physpages = highend_pfn;
#else #else
max_mapnr = num_physpages = max_low_pfn; max_mapnr = num_physpages = max_low_pfn;
......
...@@ -111,10 +111,7 @@ __change_page_attr(struct page *page, pgprot_t prot) ...@@ -111,10 +111,7 @@ __change_page_attr(struct page *page, pgprot_t prot)
unsigned long address; unsigned long address;
struct page *kpte_page; struct page *kpte_page;
#ifdef CONFIG_HIGHMEM BUG_ON(PageHighMem(page));
if (page >= highmem_start_page)
BUG();
#endif
address = (unsigned long)page_address(page); address = (unsigned long)page_address(page);
kpte = lookup_address(address); kpte = lookup_address(address);
......
...@@ -8,7 +8,7 @@ void *__kmap(struct page *page) ...@@ -8,7 +8,7 @@ void *__kmap(struct page *page)
void *addr; void *addr;
might_sleep(); might_sleep();
if (page < highmem_start_page) if (!PageHighMem(page))
return page_address(page); return page_address(page);
addr = kmap_high(page); addr = kmap_high(page);
flush_tlb_one((unsigned long)addr); flush_tlb_one((unsigned long)addr);
...@@ -20,7 +20,7 @@ void __kunmap(struct page *page) ...@@ -20,7 +20,7 @@ void __kunmap(struct page *page)
{ {
if (in_interrupt()) if (in_interrupt())
BUG(); BUG();
if (page < highmem_start_page) if (!PageHighMem(page))
return; return;
kunmap_high(page); kunmap_high(page);
} }
...@@ -41,7 +41,7 @@ void *__kmap_atomic(struct page *page, enum km_type type) ...@@ -41,7 +41,7 @@ void *__kmap_atomic(struct page *page, enum km_type type)
/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
inc_preempt_count(); inc_preempt_count();
if (page < highmem_start_page) if (!PageHighMem(page))
return page_address(page); return page_address(page);
idx = type + KM_TYPE_NR*smp_processor_id(); idx = type + KM_TYPE_NR*smp_processor_id();
......
...@@ -204,7 +204,6 @@ void __init mem_init(void) ...@@ -204,7 +204,6 @@ void __init mem_init(void)
unsigned long tmp, ram; unsigned long tmp, ram;
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
highmem_start_page = mem_map + highstart_pfn;
#ifdef CONFIG_DISCONTIGMEM #ifdef CONFIG_DISCONTIGMEM
#error "CONFIG_HIGHMEM and CONFIG_DISCONTIGMEM dont work together yet" #error "CONFIG_HIGHMEM and CONFIG_DISCONTIGMEM dont work together yet"
#endif #endif
......
...@@ -411,7 +411,6 @@ void __init mem_init(void) ...@@ -411,7 +411,6 @@ void __init mem_init(void)
unsigned long highmem_mapnr; unsigned long highmem_mapnr;
highmem_mapnr = total_lowmem >> PAGE_SHIFT; highmem_mapnr = total_lowmem >> PAGE_SHIFT;
highmem_start_page = mem_map + highmem_mapnr;
#endif /* CONFIG_HIGHMEM */ #endif /* CONFIG_HIGHMEM */
max_mapnr = total_memory >> PAGE_SHIFT; max_mapnr = total_memory >> PAGE_SHIFT;
......
...@@ -36,7 +36,7 @@ void *kmap_atomic(struct page *page, enum km_type type) ...@@ -36,7 +36,7 @@ void *kmap_atomic(struct page *page, enum km_type type)
/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
inc_preempt_count(); inc_preempt_count();
if (page < highmem_start_page) if (!PageHighMem(page))
return page_address(page); return page_address(page);
idx = type + KM_TYPE_NR*smp_processor_id(); idx = type + KM_TYPE_NR*smp_processor_id();
......
...@@ -402,8 +402,6 @@ void __init mem_init(void) ...@@ -402,8 +402,6 @@ void __init mem_init(void)
int reservedpages = 0; int reservedpages = 0;
int i; int i;
highmem_start_page = pfn_to_page(highstart_pfn);
if (PKMAP_BASE+LAST_PKMAP*PAGE_SIZE >= FIXADDR_START) { if (PKMAP_BASE+LAST_PKMAP*PAGE_SIZE >= FIXADDR_START) {
prom_printf("BUG: fixmap and pkmap areas overlap\n"); prom_printf("BUG: fixmap and pkmap areas overlap\n");
prom_printf("pkbase: 0x%lx pkend: 0x%lx fixstart 0x%lx\n", prom_printf("pkbase: 0x%lx pkend: 0x%lx fixstart 0x%lx\n",
......
...@@ -49,8 +49,6 @@ static void setup_highmem(unsigned long highmem_start, ...@@ -49,8 +49,6 @@ static void setup_highmem(unsigned long highmem_start,
unsigned long highmem_pfn; unsigned long highmem_pfn;
int i; int i;
highmem_start_page = virt_to_page(highmem_start);
highmem_pfn = __pa(highmem_start) >> PAGE_SHIFT; highmem_pfn = __pa(highmem_start) >> PAGE_SHIFT;
for(i = 0; i < highmem_len >> PAGE_SHIFT; i++){ for(i = 0; i < highmem_len >> PAGE_SHIFT; i++){
page = &mem_map[highmem_pfn + i]; page = &mem_map[highmem_pfn + i];
......
...@@ -56,7 +56,7 @@ extern void kunmap_high(struct page *page); ...@@ -56,7 +56,7 @@ extern void kunmap_high(struct page *page);
static inline void *kmap(struct page *page) static inline void *kmap(struct page *page)
{ {
might_sleep(); might_sleep();
if (page < highmem_start_page) if (!PageHighMem(page))
return page_address(page); return page_address(page);
return kmap_high(page); return kmap_high(page);
} }
...@@ -64,7 +64,7 @@ static inline void *kmap(struct page *page) ...@@ -64,7 +64,7 @@ static inline void *kmap(struct page *page)
static inline void kunmap(struct page *page) static inline void kunmap(struct page *page)
{ {
BUG_ON(in_interrupt()); BUG_ON(in_interrupt());
if (page < highmem_start_page) if (!PageHighMem(page))
return; return;
kunmap_high(page); kunmap_high(page);
} }
...@@ -82,7 +82,7 @@ static inline void *kmap_atomic(struct page *page, enum km_type type) ...@@ -82,7 +82,7 @@ static inline void *kmap_atomic(struct page *page, enum km_type type)
/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */ /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
inc_preempt_count(); inc_preempt_count();
if (page < highmem_start_page) if (!PageHighMem(page))
return page_address(page); return page_address(page);
idx = type + KM_TYPE_NR*smp_processor_id(); idx = type + KM_TYPE_NR*smp_processor_id();
......
...@@ -57,7 +57,7 @@ extern void kunmap_high(struct page *page); ...@@ -57,7 +57,7 @@ extern void kunmap_high(struct page *page);
static inline void *kmap(struct page *page) static inline void *kmap(struct page *page)
{ {
BUG_ON(in_interrupt()); BUG_ON(in_interrupt());
if (page < highmem_start_page) if (!PageHighMem(page))
return page_address(page); return page_address(page);
return kmap_high(page); return kmap_high(page);
} }
...@@ -65,7 +65,7 @@ static inline void *kmap(struct page *page) ...@@ -65,7 +65,7 @@ static inline void *kmap(struct page *page)
static inline void kunmap(struct page *page) static inline void kunmap(struct page *page)
{ {
BUG_ON(in_interrupt()); BUG_ON(in_interrupt());
if (page < highmem_start_page) if (!PageHighMem(page))
return; return;
kunmap_high(page); kunmap_high(page);
} }
......
...@@ -9,8 +9,6 @@ ...@@ -9,8 +9,6 @@
#ifdef CONFIG_HIGHMEM #ifdef CONFIG_HIGHMEM
extern struct page *highmem_start_page;
#include <asm/highmem.h> #include <asm/highmem.h>
/* declarations for linux/mm/highmem.c */ /* declarations for linux/mm/highmem.c */
......
...@@ -76,11 +76,9 @@ unsigned long num_physpages; ...@@ -76,11 +76,9 @@ unsigned long num_physpages;
* and ZONE_HIGHMEM. * and ZONE_HIGHMEM.
*/ */
void * high_memory; void * high_memory;
struct page *highmem_start_page;
unsigned long vmalloc_earlyreserve; unsigned long vmalloc_earlyreserve;
EXPORT_SYMBOL(num_physpages); EXPORT_SYMBOL(num_physpages);
EXPORT_SYMBOL(highmem_start_page);
EXPORT_SYMBOL(high_memory); EXPORT_SYMBOL(high_memory);
EXPORT_SYMBOL(vmalloc_earlyreserve); EXPORT_SYMBOL(vmalloc_earlyreserve);
......
...@@ -1119,7 +1119,7 @@ static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb) ...@@ -1119,7 +1119,7 @@ static inline int illegal_highdma(struct net_device *dev, struct sk_buff *skb)
return 0; return 0;
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) for (i = 0; i < skb_shinfo(skb)->nr_frags; i++)
if (skb_shinfo(skb)->frags[i].page >= highmem_start_page) if (PageHighMem(skb_shinfo(skb)->frags[i].page))
return 1; return 1;
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment