Skip to contentSkip to conversation

fix iounmap for non page aligned addresses

PATCH In review Andi Kleen 2 participants 2 messages Jul 9, 2002

lore
Share & tools
lore

Andi Kleen

author
#0 lore raw

PATCH 1/1 fix iounmap for non page aligned addresses

Hi Linus,

This fixes a problem introduced by the pageattr ioremap/unmap patches. iounmap lost the ability to free non page aligned addresses, which are e.g. used by the bootflag code. This patch fixes this.

Also fix a potential off by one bug.

-Andi

arch/i386/mm/ioremap.c renamed from arch/i386/mm/ioremap.c.~2~ +2 -2
@@ -213,9 +213,9 @@
 void iounmap(void *addr)
 { 
 	struct vm_struct *p;
-	if (addr < high_memory) 
+	if (addr <= high_memory) 
 		return; 
-	p = remove_kernel_area(addr); 
+	p = remove_kernel_area(PAGE_MASK & (unsigned long) addr); 
 	if (!p) { 
 		printk("__iounmap: bad address %p\n", addr);
 		return;
#1 lore raw
Quoted 4 lines · Andi Kleen

This fixes a problem introduced by the pageattr ioremap/unmap patches. iounmap lost the ability to free non page aligned addresses, which are e.g. used by the bootflag code. This patch fixes this.

Good.

Quoted 1 line

Also fix a potential off by one bug.

Niggle: changing "< high_memory" to "<= high_memory"? I think that change is wrong (though admittedly no wronger than what's in 2.4).

So long as VMALLOC_OFFSET enforces an arbitrary gap of at least 8MB between high_memory and the vmalloc address area, it doesn't matter. But one day someone may remove that gap (why not?) to make a few more addresses available, then "<= high_memory" test could go wrong.

Hugh

Quoted 14 lines
arch/i386/mm/ioremap.c renamed from arch/i386/mm/ioremap.c.~2~ +2 -2
@@ -213,9 +213,9 @@
 void iounmap(void *addr)
 { 
 	struct vm_struct *p;
-	if (addr < high_memory) 
+	if (addr <= high_memory) 
 		return; 
-	p = remove_kernel_area(addr); 
+	p = remove_kernel_area(PAGE_MASK & (unsigned long) addr); 
 	if (!p) { 
 		printk("__iounmap: bad address %p\n", addr);
 		return;