On Wed, 4 Mar 2009 01:01:04 +0900 Akinobu Mita <akinobu.mita@xxxxxxxxx> wrote: > +static void unpoison_page(struct page *page) > +{ > + unsigned char *mem; > + int i; > + > + if (!page->poison) > + return; > + > + mem = kmap_atomic(page, KM_USER0); > + for (i = 0; i < PAGE_SIZE; i++) { > + if (mem[i] != PAGE_POISON) { > + dump_broken_mem(mem); > + break; > + } > + } > + kunmap_atomic(mem, KM_USER0); > + page->poison = false; > +} > + > +static void unpoison_pages(struct page *page, int n) > +{ > + int i; > + > + for (i = 0; i < n; i++) > + unpoison_page(page + i); > +} > + > +void kernel_map_pages(struct page *page, int numpages, int enable) > +{ > + if (!debug_pagealloc_enabled) > + return; > + > + if (enable) > + unpoison_pages(page, numpages); > + else > + poison_pages(page, numpages); > +} kernel_map_pages() is called from the memory-allocation and memory-freeing paths. Hence it can be called from interrupt contexts. KM_USER0 must not be used from interrupt context - it will corrupt the non-interrupt context's pte, causing unpleasing very hard to track down memory corruption. Often memory which is getting written to the user's disk. This makes users unhappy. We could use KM_IRQ0 here. The code should disable local interrupts when holding a KM_IRQ0 kmap. If this code were to switch to using KM_IRQ0 then we still have a problem - if any other place in the kernel does a memory allcoation or free while holding a KM_IRQ0 kmap, then this new code will corrupt the caller's pte. So I guess we'll need to create a new kmap_atomic slot for this application. It will need interrupt protection - the page allocator can be called from interrupt context while it is already running in non-interrupt context. Alternatively, we could just not do the kmap_atomic() at all. i386 won't be using this code and IIRC the only other highmem architecture is powerpc32, and ppc32 appears to also have its own DEBUG_PAGEALLOC implementation. So you could remove the kmap_atomic() stuff and put #ifdef CONFIG_HIGHMEM #error i goofed #endif in there. -- To unsubscribe from this list: send the line "unsubscribe linux-arch" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html