* [RFC] / [CFT] convert node_start_paddr to node_start_pfn
@ 2002-04-19 23:04 Martin J. Bligh
2002-04-20 0:15 ` [RFC] / [CFT] convert zone_start_paddr to zone_start_pfn Martin J. Bligh
0 siblings, 1 reply; 2+ messages in thread
From: Martin J. Bligh @ 2002-04-19 23:04 UTC (permalink / raw)
To: linux-kernel
At present we store node_start_paddr as an unsigned long, which is
not correct - it may work for some architectures, but not for others
(eg ia32 with PAE, where a paddr is 36 bits and a ulong is 32).
Below is a (untested) patch to convert the paddr to a pfn. A similar
patch for zone_start_paddr will follow shortly.
node_start_pfn == node_start_paddr >> PAGE_SHIFT
M.
diff -urN virgin-2.5.8/arch/alpha/mm/numa.c
linux-2.5.8-node_start_paddr/arch/alpha/mm/numa.c
--- virgin-2.5.8/arch/alpha/mm/numa.c Sun Apr 14 12:18:43 2002
+++ linux-2.5.8-node_start_paddr/arch/alpha/mm/numa.c Fri Apr 19 15:24:11
2002
@@ -372,7 +372,7 @@
totalram_pages += free_all_bootmem_node(NODE_DATA(nid));
lmem_map = NODE_MEM_MAP(nid);
- pfn = NODE_DATA(nid)->node_start_paddr >> PAGE_SHIFT;
+ pfn = NODE_DATA(nid)->node_start_pfn;
for (i = 0; i < PLAT_NODE_DATA_SIZE(nid); i++, pfn++)
if (page_is_ram(pfn) && PageReserved(lmem_map+i))
reservedpages++;
diff -urN virgin-2.5.8/include/asm-alpha/mmzone.h
linux-2.5.8-node_start_paddr/include/asm-alpha/mmzone.h
--- virgin-2.5.8/include/asm-alpha/mmzone.h Sun Apr 14 12:18:50 2002
+++ linux-2.5.8-node_start_paddr/include/asm-alpha/mmzone.h Fri Apr 19
15:28:34 2002
@@ -52,14 +52,15 @@
#if 1
#define PLAT_NODE_DATA_LOCALNR(p, n) \
- (((p) - PLAT_NODE_DATA(n)->gendata.node_start_paddr) >> PAGE_SHIFT)
+ (((p) >> PAGE_SHIFT) - PLAT_NODE_DATA(n)->gendata.node_start_pfn)
#else
static inline unsigned long
PLAT_NODE_DATA_LOCALNR(unsigned long p, int n)
{
unsigned long temp;
- temp = p - PLAT_NODE_DATA(n)->gendata.node_start_paddr;
- return (temp >> PAGE_SHIFT);
+ temp = p >> PAGE_SHIFT;
+ temp -= PLAT_NODE_DATA(n)->gendata.node_start_pfn;
+ return (temp);
}
#endif
@@ -96,7 +97,7 @@
* and returns the kaddr corresponding to first physical page in the
* node's mem_map.
*/
-#define LOCAL_BASE_ADDR(kaddr) ((unsigned
long)__va(NODE_DATA(KVADDR_TO_NID(kaddr))->node_start_paddr))
+#define LOCAL_BASE_ADDR(kaddr) ( (unsigned long)
__va(NODE_DATA(KVADDR_TO_NID(kaddr))->node_start_pfn << PAGE_SHIFT) )
#define LOCAL_MAP_NR(kvaddr) \
(((unsigned long)(kvaddr)-LOCAL_BASE_ADDR(kvaddr)) >> PAGE_SHIFT)
diff -urN virgin-2.5.8/include/asm-mips64/mmzone.h
linux-2.5.8-node_start_paddr/include/asm-mips64/mmzone.h
--- virgin-2.5.8/include/asm-mips64/mmzone.h Sun Apr 14 12:18:44 2002
+++ linux-2.5.8-node_start_paddr/include/asm-mips64/mmzone.h Fri Apr 19
15:30:59 2002
@@ -27,7 +27,7 @@
#define PLAT_NODE_DATA_STARTNR(n)
(PLAT_NODE_DATA(n)->gendata.node_start_mapnr)
#define PLAT_NODE_DATA_SIZE(n) (PLAT_NODE_DATA(n)->gendata.node_size)
#define PLAT_NODE_DATA_LOCALNR(p, n) \
- (((p) - PLAT_NODE_DATA(n)->gendata.node_start_paddr) >> PAGE_SHIFT)
+ (((p) >> PAGE_SHIFT) - PLAT_NODE_DATA(n)->gendata.node_start_pfn)
#define numa_node_id() cputocnode(current->processor)
Binary files virgin-2.5.8/include/linux/.mmzone.h.foreachnode.swp and
linux-2.5.8-node_start_paddr/include/linux/.mmzone.h.foreachnode.swp differ
diff -urN virgin-2.5.8/include/linux/mmzone.h
linux-2.5.8-node_start_paddr/include/linux/mmzone.h
--- virgin-2.5.8/include/linux/mmzone.h Sun Apr 14 12:18:43 2002
+++ linux-2.5.8-node_start_paddr/include/linux/mmzone.h Fri Apr 19 15:23:28
2002
@@ -132,7 +132,7 @@
struct page *node_mem_map;
unsigned long *valid_addr_bitmap;
struct bootmem_data *bdata;
- unsigned long node_start_paddr;
+ unsigned long node_start_pfn;
unsigned long node_start_mapnr;
unsigned long node_size;
int node_id;
diff -urN virgin-2.5.8/mm/page_alloc.c
linux-2.5.8-node_start_paddr/mm/page_alloc.c
--- virgin-2.5.8/mm/page_alloc.c Sun Apr 14 12:18:44 2002
+++ linux-2.5.8-node_start_paddr/mm/page_alloc.c Fri Apr 19 15:32:01 2002
@@ -746,7 +746,7 @@
}
*gmap = pgdat->node_mem_map = lmem_map;
pgdat->node_size = totalpages;
- pgdat->node_start_paddr = zone_start_paddr;
+ pgdat->node_start_pfn = zone_start_paddr >> PAGE_SHIFT;
pgdat->node_start_mapnr = (lmem_map - mem_map);
pgdat->nr_zones = 0;
^ permalink raw reply [flat|nested] 2+ messages in thread
* [RFC] / [CFT] convert zone_start_paddr to zone_start_pfn
2002-04-19 23:04 [RFC] / [CFT] convert node_start_paddr to node_start_pfn Martin J. Bligh
@ 2002-04-20 0:15 ` Martin J. Bligh
0 siblings, 0 replies; 2+ messages in thread
From: Martin J. Bligh @ 2002-04-20 0:15 UTC (permalink / raw)
To: linux-kernel
At present we store zone_start_paddr as an unsigned long, which is
not correct - it may work for some architectures, but not for others
(eg ia32 with PAE, where a paddr is 36 bits and a ulong is 32).
Below is a (untested) patch to convert the paddr to a pfn. This patch
applies on top of the previous node_start_paddr, though there's only
one conflict, and it's easy to fix.
zone_start_pfn == zone_start_paddr >> PAGE_SHIFT
Comments ?
M.
diff -urN linux-2.5.8-node_start_paddr/arch/alpha/mm/numa.c linux-2.5.8-zone_start_paddr/arch/alpha/mm/numa.c
--- linux-2.5.8-node_start_paddr/arch/alpha/mm/numa.c Fri Apr 19 15:24:11 2002
+++ linux-2.5.8-zone_start_paddr/arch/alpha/mm/numa.c Fri Apr 19 16:50:20 2002
@@ -294,7 +294,7 @@
zones_size[ZONE_DMA] = dma_local_pfn;
zones_size[ZONE_NORMAL] = (end_pfn - start_pfn) - dma_local_pfn;
}
- free_area_init_node(nid, NODE_DATA(nid), NULL, zones_size, start_pfn<<PAGE_SHIFT, NULL);
+ free_area_init_node(nid, NODE_DATA(nid), NULL, zones_size, start_pfn, NULL);
lmax_mapnr = PLAT_NODE_DATA_STARTNR(nid) + PLAT_NODE_DATA_SIZE(nid);
if (lmax_mapnr > max_mapnr) {
max_mapnr = lmax_mapnr;
diff -urN linux-2.5.8-node_start_paddr/include/asm-alpha/pgtable.h linux-2.5.8-zone_start_paddr/include/asm-alpha/pgtable.h
--- linux-2.5.8-node_start_paddr/include/asm-alpha/pgtable.h Sun Apr 14 12:18:48 2002
+++ linux-2.5.8-zone_start_paddr/include/asm-alpha/pgtable.h Fri Apr 19 16:35:26 2002
@@ -194,8 +194,8 @@
#define PAGE_TO_PA(page) ((page - mem_map) << PAGE_SHIFT)
#else
#define PAGE_TO_PA(page) \
- ((((page)-(page)->zone->zone_mem_map) << PAGE_SHIFT) \
- + (page)->zone->zone_start_paddr)
+ (( ((page)-(page)->zone->zone_mem_map) \
+ + (page)->zone->zone_start_pfn) << PAGE_SHIFT)
#endif
#ifndef CONFIG_DISCONTIGMEM
@@ -214,7 +214,7 @@
unsigned long pfn; \
\
pfn = ((unsigned long)((page)-(page)->zone->zone_mem_map)) << 32; \
- pfn += (page)->zone->zone_start_paddr << (32-PAGE_SHIFT); \
+ pfn += (page)->zone->zone_start_pfn << 32; \
pte_val(pte) = pfn | pgprot_val(pgprot); \
\
pte; \
diff -urN linux-2.5.8-node_start_paddr/include/asm-mips64/pgtable.h linux-2.5.8-zone_start_paddr/include/asm-mips64/pgtable.h
--- linux-2.5.8-node_start_paddr/include/asm-mips64/pgtable.h Sun Apr 14 12:18:56 2002
+++ linux-2.5.8-zone_start_paddr/include/asm-mips64/pgtable.h Fri Apr 19 16:37:42 2002
@@ -484,8 +484,8 @@
#define PAGE_TO_PA(page) ((page - mem_map) << PAGE_SHIFT)
#else
#define PAGE_TO_PA(page) \
- ((((page)-(page)->zone->zone_mem_map) << PAGE_SHIFT) \
- + ((page)->zone->zone_start_paddr))
+ (( ((page)-(page)->zone->zone_mem_map) \
+ (page)->zone->zone_start_pfn) << PAGE_SHIFT)
#endif
#define mk_pte(page, pgprot) \
({ \
diff -urN linux-2.5.8-node_start_paddr/include/linux/mm.h linux-2.5.8-zone_start_paddr/include/linux/mm.h
--- linux-2.5.8-node_start_paddr/include/linux/mm.h Sun Apr 14 12:18:43 2002
+++ linux-2.5.8-zone_start_paddr/include/linux/mm.h Fri Apr 19 16:21:27 2002
@@ -363,8 +363,8 @@
#else /* CONFIG_HIGHMEM || WANT_PAGE_VIRTUAL */
#define page_address(page) \
- __va( (((page) - page_zone(page)->zone_mem_map) << PAGE_SHIFT) \
- + page_zone(page)->zone_start_paddr)
+ __va( ( ((page) - page_zone(page)->zone_mem_map) \
+ + page_zone(page)->zone_start_pfn) << PAGE_SHIFT)
#endif /* CONFIG_HIGHMEM || WANT_PAGE_VIRTUAL */
@@ -461,7 +461,7 @@
extern void free_area_init(unsigned long * zones_size);
extern void free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
- unsigned long * zones_size, unsigned long zone_start_paddr,
+ unsigned long * zones_size, unsigned long zone_start_pfn,
unsigned long *zholes_size);
extern void mem_init(void);
extern void show_mem(void);
diff -urN linux-2.5.8-node_start_paddr/include/linux/mmzone.h linux-2.5.8-zone_start_paddr/include/linux/mmzone.h
--- linux-2.5.8-node_start_paddr/include/linux/mmzone.h Fri Apr 19 15:23:28 2002
+++ linux-2.5.8-zone_start_paddr/include/linux/mmzone.h Fri Apr 19 16:23:42 2002
@@ -81,7 +81,8 @@
*/
struct pglist_data *zone_pgdat;
struct page *zone_mem_map;
- unsigned long zone_start_paddr;
+ /* zone_start_pfn == zone_start_paddr >> PAGE_SHIFT */
+ unsigned long zone_start_pfn;
unsigned long zone_start_mapnr;
/*
diff -urN linux-2.5.8-node_start_paddr/mm/highmem.c linux-2.5.8-zone_start_paddr/mm/highmem.c
--- linux-2.5.8-node_start_paddr/mm/highmem.c Sun Apr 14 12:18:44 2002
+++ linux-2.5.8-zone_start_paddr/mm/highmem.c Fri Apr 19 16:41:40 2002
@@ -379,7 +379,7 @@
/*
* is destination page below bounce pfn?
*/
- if ((page - page_zone(page)->zone_mem_map) + (page_zone(page)->zone_start_paddr >> PAGE_SHIFT) < pfn)
+ if ( ( (page - page_zone(page)->zone_mem_map) + page_zone(page)->zone_start_pfn ) < pfn)
continue;
/*
diff -urN linux-2.5.8-node_start_paddr/mm/numa.c linux-2.5.8-zone_start_paddr/mm/numa.c
--- linux-2.5.8-node_start_paddr/mm/numa.c Sun Apr 14 12:18:49 2002
+++ linux-2.5.8-zone_start_paddr/mm/numa.c Fri Apr 19 16:49:37 2002
@@ -22,11 +22,11 @@
* Should be invoked with paramters (0, 0, unsigned long *[], start_paddr).
*/
void __init free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
- unsigned long *zones_size, unsigned long zone_start_paddr,
+ unsigned long *zones_size, unsigned long zone_start_pfn,
unsigned long *zholes_size)
{
free_area_init_core(0, &contig_page_data, &mem_map, zones_size,
- zone_start_paddr, zholes_size, pmap);
+ zone_start_pfn, zholes_size, pmap);
}
#endif /* !CONFIG_DISCONTIGMEM */
@@ -59,7 +59,7 @@
* Nodes can be initialized parallely, in no particular order.
*/
void __init free_area_init_node(int nid, pg_data_t *pgdat, struct page *pmap,
- unsigned long *zones_size, unsigned long zone_start_paddr,
+ unsigned long *zones_size, unsigned long zone_start_pfn,
unsigned long *zholes_size)
{
int i, size = 0;
@@ -68,7 +68,7 @@
if (mem_map == (mem_map_t *)NULL)
mem_map = (mem_map_t *)PAGE_OFFSET;
- free_area_init_core(nid, pgdat, &discard, zones_size, zone_start_paddr,
+ free_area_init_core(nid, pgdat, &discard, zones_size, zone_start_pfn,
zholes_size, pmap);
pgdat->node_id = nid;
diff -urN linux-2.5.8-node_start_paddr/mm/page_alloc.c linux-2.5.8-zone_start_paddr/mm/page_alloc.c
--- linux-2.5.8-node_start_paddr/mm/page_alloc.c Fri Apr 19 15:32:01 2002
+++ linux-2.5.8-zone_start_paddr/mm/page_alloc.c Fri Apr 19 16:55:43 2002
@@ -705,7 +705,7 @@
* - clear the memory bitmaps
*/
void __init free_area_init_core(int nid, pg_data_t *pgdat, struct page **gmap,
- unsigned long *zones_size, unsigned long zone_start_paddr,
+ unsigned long *zones_size, unsigned long zone_start_pfn,
unsigned long *zholes_size, struct page *lmem_map)
{
unsigned long i, j;
@@ -713,9 +713,6 @@
unsigned long totalpages, offset, realtotalpages;
const unsigned long zone_required_alignment = 1UL << (MAX_ORDER-1);
- if (zone_start_paddr & ~PAGE_MASK)
- BUG();
-
totalpages = 0;
for (i = 0; i < MAX_NR_ZONES; i++) {
unsigned long size = zones_size[i];
@@ -746,7 +743,7 @@
}
*gmap = pgdat->node_mem_map = lmem_map;
pgdat->node_size = totalpages;
- pgdat->node_start_pfn = zone_start_paddr >> PAGE_SHIFT;
+ pgdat->node_start_pfn = zone_start_pfn;
pgdat->node_start_mapnr = (lmem_map - mem_map);
pgdat->nr_zones = 0;
@@ -798,9 +795,9 @@
zone->zone_mem_map = mem_map + offset;
zone->zone_start_mapnr = offset;
- zone->zone_start_paddr = zone_start_paddr;
+ zone->zone_start_pfn = zone_start_pfn;
- if ((zone_start_paddr >> PAGE_SHIFT) & (zone_required_alignment-1))
+ if ((zone_start_pfn) & (zone_required_alignment-1))
printk("BUG: wrong zone alignment, it will crash\n");
/*
@@ -815,8 +812,9 @@
__SetPageReserved(page);
memlist_init(&page->list);
if (j != ZONE_HIGHMEM)
- set_page_address(page, __va(zone_start_paddr));
- zone_start_paddr += PAGE_SIZE;
+ /* WARNING - this looks dangerous, could overflow */
+ set_page_address(page, __va(zone_start_pfn << PAGE_SHIFT));
+ zone_start_pfn++;
}
offset += size;
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2002-04-19 23:30 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-04-19 23:04 [RFC] / [CFT] convert node_start_paddr to node_start_pfn Martin J. Bligh
2002-04-20 0:15 ` [RFC] / [CFT] convert zone_start_paddr to zone_start_pfn Martin J. Bligh
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.