From: Roland Dreier flush_dcache_icache_page() will be called on an instruction page fault. We can't sleep in the fault handler, so use kmap_atomic() instead of just kmap() for the Book-E case. Signed-off-by: Roland Dreier Cc: Matt Porter Signed-off-by: Andrew Morton --- arch/ppc/mm/init.c | 5 +++-- include/asm-ppc/kmap_types.h | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff -puN arch/ppc/mm/init.c~ppc32-dont-sleep-in-flush_dcache_icache_page arch/ppc/mm/init.c --- devel/arch/ppc/mm/init.c~ppc32-dont-sleep-in-flush_dcache_icache_page 2005-08-18 10:54:28.000000000 -0700 +++ devel-akpm/arch/ppc/mm/init.c 2005-08-18 10:54:28.000000000 -0700 @@ -560,8 +560,9 @@ void flush_dcache_page(struct page *page void flush_dcache_icache_page(struct page *page) { #ifdef CONFIG_BOOKE - __flush_dcache_icache(kmap(page)); - kunmap(page); + void *start = kmap_atomic(page, KM_PPC_SYNC_ICACHE); + __flush_dcache_icache(start); + kunmap_atomic(start, KM_PPC_SYNC_ICACHE); #elif CONFIG_8xx /* On 8xx there is no need to kmap since highmem is not supported */ __flush_dcache_icache(page_address(page)); diff -puN include/asm-ppc/kmap_types.h~ppc32-dont-sleep-in-flush_dcache_icache_page include/asm-ppc/kmap_types.h --- devel/include/asm-ppc/kmap_types.h~ppc32-dont-sleep-in-flush_dcache_icache_page 2005-08-18 10:54:28.000000000 -0700 +++ devel-akpm/include/asm-ppc/kmap_types.h 2005-08-18 10:54:28.000000000 -0700 @@ -17,6 +17,7 @@ enum km_type { KM_SOFTIRQ0, KM_SOFTIRQ1, KM_PPC_SYNC_PAGE, + KM_PPC_SYNC_ICACHE, KM_TYPE_NR }; _