All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC] reduce usage of mem_map
@ 2002-08-02  6:38 Martin J. Bligh
  2002-08-02  7:09 ` William Lee Irwin III
  0 siblings, 1 reply; 2+ messages in thread
From: Martin J. Bligh @ 2002-08-02  6:38 UTC (permalink / raw)
  To: linux-mm

I've tried to cut down the usage of mem_map somewhat.
There's already macros to do the conversion between
pfns to pages, and it doesn't work the way they've
embedded it for discontigmem systems. Comments?
Please don't apply - not tested yet ;-)

M.

diff -urN virgin-2.5.30/arch/i386/mm/init.c linux-2.5.30-pfn_to_page/arch/i386/mm/init.c
--- virgin-2.5.30/arch/i386/mm/init.c	Thu Aug  1 14:16:13 2002
+++ linux-2.5.30-pfn_to_page/arch/i386/mm/init.c	Thu Aug  1 22:39:17 2002
@@ -217,7 +217,7 @@
 {
 	int pfn;
 	for (pfn = highstart_pfn; pfn < highend_pfn; pfn++) {
-		struct page *page = mem_map + pfn;
+		struct page *page = pfn_to_page(pfn);
 
 		if (!page_is_ram(pfn)) {
 			SetPageReserved(page);
@@ -419,7 +419,7 @@
 	bad_ppro = ppro_with_ram_bug();
 
 #ifdef CONFIG_HIGHMEM
-	highmem_start_page = mem_map + highstart_pfn;
+	highmem_start_page = pfn_to_page(highstart_pfn);
 	max_mapnr = num_physpages = highend_pfn;
 #else
 	max_mapnr = num_physpages = max_low_pfn;
@@ -437,7 +437,7 @@
 		/*
 		 * Only count reserved RAM pages
 		 */
-		if (page_is_ram(tmp) && PageReserved(mem_map+tmp))
+		if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp)))
 			reservedpages++;
 
 	set_highmem_pages_init(bad_ppro);
diff -urN virgin-2.5.30/arch/i386/mm/pgtable.c linux-2.5.30-pfn_to_page/arch/i386/mm/pgtable.c
--- virgin-2.5.30/arch/i386/mm/pgtable.c	Thu Aug  1 14:17:27 2002
+++ linux-2.5.30-pfn_to_page/arch/i386/mm/pgtable.c	Thu Aug  1 17:55:07 2002
@@ -22,24 +22,26 @@
 
 void show_mem(void)
 {
-	int i, total = 0, reserved = 0;
+	int pfn, total = 0, reserved = 0;
 	int shared = 0, cached = 0;
 	int highmem = 0;
+	struct page *page;
 
 	printk("Mem-info:\n");
 	show_free_areas();
 	printk("Free swap:       %6dkB\n",nr_swap_pages<<(PAGE_SHIFT-10));
-	i = max_mapnr;
-	while (i-- > 0) {
+	pfn = max_mapnr;
+	while (pfn-- > 0) {
+		page = pfn_to_page(pfn);
 		total++;
-		if (PageHighMem(mem_map+i))
+		if (PageHighMem(page)
 			highmem++;
-		if (PageReserved(mem_map+i))
+		if (PageReserved(page))
 			reserved++;
-		else if (PageSwapCache(mem_map+i))
+		else if (PageSwapCache(page))
 			cached++;
-		else if (page_count(mem_map+i))
-			shared += page_count(mem_map+i) - 1;
+		else if (page_count(page))
+			shared += page_count(page) - 1;
 	}
 	printk("%d pages of RAM\n", total);
 	printk("%d pages of HIGHMEM\n",highmem);
diff -urN virgin-2.5.30/drivers/net/ns83820.c linux-2.5.30-pfn_to_page/drivers/net/ns83820.c
--- virgin-2.5.30/drivers/net/ns83820.c	Thu Aug  1 14:16:44 2002
+++ linux-2.5.30-pfn_to_page/drivers/net/ns83820.c	Thu Aug  1 22:43:41 2002
@@ -1081,7 +1081,7 @@
 				   frag->page_offset,
 				   frag->size, PCI_DMA_TODEVICE);
 		dprintk("frag: buf=%08Lx  page=%08lx offset=%08lx\n",
-			(long long)buf, (long)(frag->page - mem_map),
+			(long long)buf, (long) page_to_pfn(frag->page),
 			frag->page_offset);
 		len = frag->size;
 		frag++;
diff -urN virgin-2.5.30/include/asm-i386/pci.h linux-2.5.30-pfn_to_page/include/asm-i386/pci.h
--- virgin-2.5.30/include/asm-i386/pci.h	Thu Aug  1 14:16:22 2002
+++ linux-2.5.30-pfn_to_page/include/asm-i386/pci.h	Thu Aug  1 23:00:43 2002
@@ -109,7 +109,7 @@
 	if (direction == PCI_DMA_NONE)
 		BUG();
 
-	return (dma_addr_t)(page - mem_map) * PAGE_SIZE + offset;
+	return (dma_addr_t)(page_to_pfn(page)) * PAGE_SIZE + offset;
 }
 
 static inline void pci_unmap_page(struct pci_dev *hwdev, dma_addr_t dma_address,
@@ -240,7 +240,7 @@
 {
 	unsigned long poff = (dma_addr >> PAGE_SHIFT);
 
-	return mem_map + poff;
+	return pfn_to_page(poff);
 }
 
 static __inline__ unsigned long
diff -urN virgin-2.5.30/include/asm-i386/pgtable.h linux-2.5.30-pfn_to_page/include/asm-i386/pgtable.h
--- virgin-2.5.30/include/asm-i386/pgtable.h	Thu Aug  1 14:16:32 2002
+++ linux-2.5.30-pfn_to_page/include/asm-i386/pgtable.h	Thu Aug  1 23:11:30 2002
@@ -235,7 +235,7 @@
 ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
 
 #define pmd_page(pmd) \
-	(mem_map + (pmd_val(pmd) >> PAGE_SHIFT))
+	(pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
 
 #define pmd_large(pmd) \
 	((pmd_val(pmd) & (_PAGE_PSE|_PAGE_PRESENT)) == (_PAGE_PSE|_PAGE_PRESENT))
diff -urN virgin-2.5.30/kernel/suspend.c linux-2.5.30-pfn_to_page/kernel/suspend.c
--- virgin-2.5.30/kernel/suspend.c	Thu Aug  1 14:16:15 2002
+++ linux-2.5.30-pfn_to_page/kernel/suspend.c	Thu Aug  1 23:17:51 2002
@@ -468,31 +468,33 @@
 {
 	int chunk_size;
 	int nr_copy_pages = 0;
-	int loop;
+	int pfn;
+	struct page *page;
 	
 	if (max_mapnr != num_physpages)
 		panic("mapnr is not expected");
-	for (loop = 0; loop < max_mapnr; loop++) {
-		if (PageHighMem(mem_map+loop))
+	for (pfn = 0; pfn < max_mapnr; pfn++) {
+		page = pfn_to_page(pfn);
+		if (PageHighMem(page))
 			panic("Swsusp not supported on highmem boxes. Send 1GB of RAM to <pavel@ucw.cz> and try again ;-).");
-		if (!PageReserved(mem_map+loop)) {
-			if (PageNosave(mem_map+loop))
+		if (!PageReserved(page)) {
+			if (PageNosave(page))
 				continue;
 
-			if ((chunk_size=is_head_of_free_region(mem_map+loop))!=0) {
-				loop += chunk_size - 1;
+			if ((chunk_size=is_head_of_free_region(page))!=0) {
+				pfn += chunk_size - 1;
 				continue;
 			}
-		} else if (PageReserved(mem_map+loop)) {
-			BUG_ON (PageNosave(mem_map+loop));
+		} else if (PageReserved(page)) {
+			BUG_ON (PageNosave(page));
 
 			/*
 			 * Just copy whole code segment. Hopefully it is not that big.
 			 */
-			if (ADDRESS(loop) >= (unsigned long)
-				&__nosave_begin && ADDRESS(loop) < 
+			if (ADDRESS(pfn) >= (unsigned long)
+				&__nosave_begin && ADDRESS(pfn) < 
 				(unsigned long)&__nosave_end) {
-				PRINTK("[nosave %x]", ADDRESS(loop));
+				PRINTK("[nosave %x]", ADDRESS(pfn));
 				continue;
 			}
 			/* Hmm, perhaps copying all reserved pages is not too healthy as they may contain 
@@ -501,7 +503,7 @@
 
 		nr_copy_pages++;
 		if (pagedir_p) {
-			pagedir_p->orig_address = ADDRESS(loop);
+			pagedir_p->orig_address = ADDRESS(pfn);
 			copy_page(pagedir_p->address, pagedir_p->orig_address);
 			pagedir_p++;
 		}
diff -urN virgin-2.5.30/mm/page_alloc.c linux-2.5.30-pfn_to_page/mm/page_alloc.c
--- virgin-2.5.30/mm/page_alloc.c	Thu Aug  1 14:16:06 2002
+++ linux-2.5.30-pfn_to_page/mm/page_alloc.c	Thu Aug  1 23:25:13 2002
@@ -47,9 +47,9 @@
  */
 static inline int bad_range(zone_t *zone, struct page *page)
 {
-	if (page - mem_map >= zone->zone_start_mapnr + zone->size)
+	if (page_to_pfn(page) >= zone->zone_start_mapnr + zone->size)
 		return 1;
-	if (page - mem_map < zone->zone_start_mapnr)
+	if (page_to_pfn(page) < zone->zone_start_mapnr)
 		return 1;
 	if (zone != page_zone(page))
 		return 1;

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2002-08-02  7:09 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-08-02  6:38 [RFC] reduce usage of mem_map Martin J. Bligh
2002-08-02  7:09 ` William Lee Irwin III

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.