From: Roland Dreier Date: Sat, 3 Sep 2005 22:55:43 +0000 (-0700) Subject: [PATCH] ppc32: Don't sleep in flush_dcache_icache_page() X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=5a6a4d4320aed1918bf79dfb6bd841317f33b8e9;p=openwrt%2Fstaging%2Fblogic.git [PATCH] ppc32: Don't sleep in flush_dcache_icache_page() 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 Acked-by: Matt Porter Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/arch/ppc/mm/init.c b/arch/ppc/mm/init.c index 33ada72c7330..32ee49710267 100644 --- a/arch/ppc/mm/init.c +++ b/arch/ppc/mm/init.c @@ -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 --git a/include/asm-ppc/kmap_types.h b/include/asm-ppc/kmap_types.h index 2589f182a6ad..6d6fc78731e5 100644 --- a/include/asm-ppc/kmap_types.h +++ b/include/asm-ppc/kmap_types.h @@ -17,6 +17,7 @@ enum km_type { KM_SOFTIRQ0, KM_SOFTIRQ1, KM_PPC_SYNC_PAGE, + KM_PPC_SYNC_ICACHE, KM_TYPE_NR };