public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Dave Hansen <haveblue@us.ibm.com>
To: Patrick Mochel <mochel@digitalimplant.org>
Cc: Pavel Machek <pavel@suse.cz>,
	Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
Subject: [PATCH] reduce swsusp casting
Date: Wed, 28 Jul 2004 12:37:17 -0700	[thread overview]
Message-ID: <1091043436.2871.320.camel@nighthawk> (raw)

[-- Attachment #1: Type: text/plain, Size: 683 bytes --]

I noticed that swsusp uses quite a few interesting casts for __pa() and
cousins.  This patch moves some types around to eliminate some of those
casts in the normal code.  The casts that it adds are around alloc's and
frees, which is a much more usual place to see them.  

Pavel also noticed that there's a superfluous PAGE_ALIGN() right before
a >>PAGE_SHIFT in pfn_is_nosave(), so that's been removed as well.

I haven't had a chance to do anything but test it, because that would
involve me setting up a swsusp rig, which I'm more prone to screw up
than the patch itself :)  I'd appreciate if anyone with a stable setup
could make sure I didn't do anything too stupid.  

-- Dave

[-- Attachment #2: swsusp-types-2.6.8-rc1-mm1-1.patch --]
[-- Type: text/x-patch, Size: 5508 bytes --]

--- ./linux-2.6.8-rc1-mm1-typefix/kernel/power/swsusp.c.orig	2004-07-27 15:46:20.000000000 -0700
+++ ./linux-2.6.8-rc1-mm1-typefix/kernel/power/swsusp.c	2004-07-28 12:18:48.000000000 -0700
@@ -307,7 +307,6 @@ static int write_suspend_image(void)
 	swp_entry_t entry, prev = { 0 };
 	int nr_pgdir_pages = SUSPEND_PD_PAGES(nr_copy_pages);
 	union diskpage *cur,  *buffer = (union diskpage *)get_zeroed_page(GFP_ATOMIC);
-	unsigned long address;
 	struct page *page;
 
 	if (!buffer)
@@ -324,8 +323,7 @@ static int write_suspend_image(void)
 		if (swapfile_used[swp_type(entry)] != SWAPFILE_SUSPEND)
 			panic("\nPage %d: not enough swapspace on suspend device", i );
 	    
-		address = (pagedir_nosave+i)->address;
-		page = virt_to_page(address);
+		page = virt_to_page((pagedir_nosave+i)->address);
 		rw_swap_page_sync(WRITE, entry, page);
 		(pagedir_nosave+i)->swap_address = entry;
 	}
@@ -350,7 +348,7 @@ static int write_suspend_image(void)
 		BUG_ON (PAGE_SIZE % sizeof(struct pbe));
 
 		cur->link.next = prev;				
-		page = virt_to_page((unsigned long)cur);
+		page = virt_to_page(cur);
 		rw_swap_page_sync(WRITE, entry, page);
 		prev = entry;
 	}
@@ -370,7 +368,7 @@ static int write_suspend_image(void)
 		
 	cur->link.next = prev;
 
-	page = virt_to_page((unsigned long)cur);
+	page = virt_to_page(cur);
 	rw_swap_page_sync(WRITE, entry, page);
 	prev = entry;
 
@@ -471,8 +469,8 @@ static int restore_highmem(void)
 
 static int pfn_is_nosave(unsigned long pfn)
 {
-	unsigned long nosave_begin_pfn = __pa(&__nosave_begin) >> PAGE_SHIFT;
-	unsigned long nosave_end_pfn = PAGE_ALIGN(__pa(&__nosave_end)) >> PAGE_SHIFT;
+	unsigned long nosave_begin_pfn = virt_to_phys(&__nosave_begin) >> PAGE_SHIFT;
+	unsigned long nosave_end_pfn = virt_to_phys(&__nosave_end) >> PAGE_SHIFT;
 	return (pfn >= nosave_begin_pfn) && (pfn < nosave_end_pfn);
 }
 
@@ -527,12 +525,13 @@ static int count_and_copy_data_pages(str
 	return nr_copy_pages;
 }
 
-static void free_suspend_pagedir_zone(struct zone *zone, unsigned long pagedir)
+static void free_suspend_pagedir_zone(struct zone *zone, suspend_pagedir_t *pagedir)
 {
-	unsigned long zone_pfn, pagedir_end, pagedir_pfn, pagedir_end_pfn;
-	pagedir_end = pagedir + (PAGE_SIZE << pagedir_order);
-	pagedir_pfn = __pa(pagedir) >> PAGE_SHIFT;
-	pagedir_end_pfn = __pa(pagedir_end) >> PAGE_SHIFT;
+	unsigned long zone_pfn, pagedir_pfn, pagedir_end, pagedir_end_pfn;
+	unsigned long pagedir_paddr = virt_to_phys(pagedir);
+	pagedir_end = pagedir_paddr + (PAGE_SIZE << pagedir_order);
+	pagedir_pfn = pagedir_paddr >> PAGE_SHIFT;
+	pagedir_end_pfn = pagedir_end >> PAGE_SHIFT;
 	for (zone_pfn = 0; zone_pfn < zone->spanned_pages; ++zone_pfn) {
 		struct page *page;
 		unsigned long pfn = zone_pfn + zone->zone_start_pfn;
@@ -547,14 +546,14 @@ static void free_suspend_pagedir_zone(st
 	}
 }
 
-static void free_suspend_pagedir(unsigned long this_pagedir)
+static void free_suspend_pagedir(suspend_pagedir_t *this_pagedir)
 {
 	struct zone *zone;
 	for_each_zone(zone) {
 		if (!is_highmem(zone))
 			free_suspend_pagedir_zone(zone, this_pagedir);
 	}
-	free_pages(this_pagedir, pagedir_order);
+	free_pages((unsigned long)this_pagedir, pagedir_order);
 }
 
 static suspend_pagedir_t *create_suspend_pagedir(int nr_copy_pages)
@@ -575,9 +574,9 @@ static suspend_pagedir_t *create_suspend
 		SetPageNosave(page++);
 		
 	while(nr_copy_pages--) {
-		p->address = get_zeroed_page(GFP_ATOMIC | __GFP_COLD);
+		p->address = (unsigned char *)get_zeroed_page(GFP_ATOMIC | __GFP_COLD);
 		if (!p->address) {
-			free_suspend_pagedir((unsigned long) pagedir);
+			free_suspend_pagedir(pagedir);
 			return NULL;
 		}
 		SetPageNosave(virt_to_page(p->address));
@@ -735,7 +734,7 @@ asmlinkage void do_magic_resume_2(void)
 	__flush_tlb_global();		/* Even mappings of "global" things (vmalloc) need to be fixed */
 
 	PRINTK( "Freeing prev allocated pagedir\n" );
-	free_suspend_pagedir((unsigned long) pagedir_save);
+	free_suspend_pagedir(pagedir_save);
 
 #ifdef CONFIG_HIGHMEM
 	printk( "Restoring highmem\n" );
@@ -874,10 +873,11 @@ int software_suspend(void)
 /*
  * Returns true if given address/order collides with any orig_address 
  */
-static int does_collide_order(suspend_pagedir_t *pagedir, unsigned long addr,
+static int does_collide_order(suspend_pagedir_t *pagedir, void *ptr,
 		int order)
 {
 	int i;
+	unsigned long addr = (unsigned long)ptr;
 	unsigned long addre = addr + (PAGE_SIZE<<order);
 	
 	for(i=0; i < nr_copy_pages; i++)
@@ -897,15 +897,15 @@ static int check_pagedir(void)
 	int i;
 
 	for(i=0; i < nr_copy_pages; i++) {
-		unsigned long addr;
+		void *newpage;
 
 		do {
-			addr = get_zeroed_page(GFP_ATOMIC);
-			if(!addr)
+			newpage = (void *)get_zeroed_page(GFP_ATOMIC);
+			if(!newpage)
 				return -ENOMEM;
-		} while (does_collide(addr));
+		} while (does_collide(newpage));
 
-		(pagedir_nosave+i)->address = addr;
+		(pagedir_nosave+i)->address = newpage;
 	}
 	return 0;
 }
@@ -923,13 +923,13 @@ static int relocate_pagedir(void)
 
 	printk("Relocating pagedir ");
 
-	if(!does_collide_order(old_pagedir, (unsigned long)old_pagedir, pagedir_order)) {
+	if(!does_collide_order(old_pagedir, old_pagedir, pagedir_order)) {
 		printk("not necessary\n");
 		return 0;
 	}
 
 	while ((m = (void *) __get_free_pages(GFP_ATOMIC, pagedir_order)) != NULL) {
-		if (!does_collide_order(old_pagedir, (unsigned long)m, pagedir_order))
+		if (!does_collide_order(old_pagedir, m, pagedir_order))
 			break;
 		eaten_memory = m;
 		printk( "." ); 

             reply	other threads:[~2004-07-28 19:37 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-07-28 19:37 Dave Hansen [this message]
2004-07-28 21:07 ` [PATCH] reduce swsusp casting Patrick Mochel
2004-07-28 21:20   ` Dave Hansen
2004-07-28 22:27     ` Pavel Machek
2004-07-29 18:31     ` Dave Hansen
2004-07-29 19:17       ` Kevin Fenzi
2004-08-02  6:08     ` Patrick Mochel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1091043436.2871.320.camel@nighthawk \
    --to=haveblue@us.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mochel@digitalimplant.org \
    --cc=pavel@suse.cz \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox