From 9f7bb651bfffb387c97d19ccf44e98c08b7a1a15 Mon Sep 17 00:00:00 2001 From: Nicolas Pitre Date: Thu, 3 Sep 2009 21:45:59 +0100 Subject: [PATCH] --- yaml --- r: 160979 b: refs/heads/master c: 7929eb9cf643ae416e5081b2a6fa558d37b9854c h: refs/heads/master i: 160977: 8463640ff65fd38cb6ebb8d4af6eed2bc7b71797 160975: f494cd3794f81b26380790db0c325f3a7e520e58 v: v3 --- [refs] | 2 +- trunk/arch/arm/mm/highmem.c | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 72a733d619b7..ddc2b759bdf3 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c47a830c08a26a7c210ae16a0ffe3f56ba86ea69 +refs/heads/master: 7929eb9cf643ae416e5081b2a6fa558d37b9854c diff --git a/trunk/arch/arm/mm/highmem.c b/trunk/arch/arm/mm/highmem.c index a34954d9df7d..73cae57fa707 100644 --- a/trunk/arch/arm/mm/highmem.c +++ b/trunk/arch/arm/mm/highmem.c @@ -40,11 +40,16 @@ void *kmap_atomic(struct page *page, enum km_type type) { unsigned int idx; unsigned long vaddr; + void *kmap; pagefault_disable(); if (!PageHighMem(page)) return page_address(page); + kmap = kmap_high_get(page); + if (kmap) + return kmap; + idx = type + KM_TYPE_NR * smp_processor_id(); vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); #ifdef CONFIG_DEBUG_HIGHMEM @@ -80,6 +85,9 @@ void kunmap_atomic(void *kvaddr, enum km_type type) #else (void) idx; /* to kill a warning */ #endif + } else if (vaddr >= PKMAP_ADDR(0) && vaddr < PKMAP_ADDR(LAST_PKMAP)) { + /* this address was obtained through kmap_high_get() */ + kunmap_high(pte_page(pkmap_page_table[PKMAP_NR(vaddr)])); } pagefault_enable(); }