fix iounmap for non page aligned addresses
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 ;
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 ;