Skip to contentSkip to conversation

mm, highmem: kmap_atomic rework

RFC PATCH In review Peter Zijlstra 5 participants 19 messages Aug 19, 2010 – Aug 24, 2010

Subsystems (86)
lore
Share & tools
lore
#0 lore raw

cover mm, highmem: kmap_atomic rework

This patch-set reworks the kmap_atomic API to be a stack based, instead of static slot based. Some might remember this from last year, some not ;-)

The advantage is that you no longer need to worry about KM_foo, the disadvantage is that kmap_atomic/kunmap_atomic now needs to be strictly nested (CONFIG_HIGHMEM_DEBUG should complain in case its not) -- and of course its a big massive patch changing a widely used API.

The patch-set is currently based on tip/master as of today, and compile tested on: i386-all{mod,yes}config, mips-yosemite_defconfig, sparc-sparc32_defconfig, powerpc-ppc6xx_defconfig, and some arm config.

(Sorry dhowells, I again couldn't find frv/mn10300 compilers)

Boot tested with i386-defconfig on kvm.

Since its a rather large set, and somewhat tedious to rebase, I wanted to ask how to go about getting this merged?

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

#1 lore raw

RFC PATCH 1/6 mm: strictly nested kmap_atomic

Ensure kmap_atomic usage is strictly nested

---
 crypto/async_tx/async_memcpy.c |    2 +-
 crypto/blkcipher.c             |    2 +-
 drivers/block/loop.c           |    4 ++--
 include/linux/highmem.h        |    4 ++--
 kernel/power/snapshot.c        |    4 ++--
 5 files changed, 8 insertions(+), 8 deletions(-)
crypto/async_tx/async_memcpy.c +1 -1
Index: linux-2.6/crypto/async_tx/async_memcpy.c
===================================================================
@@ -83,8 +83,8 @@ async_memcpy(struct page *dest, struct p
 
 		memcpy(dest_buf, src_buf, len);
 
-		kunmap_atomic(dest_buf, KM_USER0);
 		kunmap_atomic(src_buf, KM_USER1);
+		kunmap_atomic(dest_buf, KM_USER0);
 
 		async_tx_sync_epilog(submit);
 	}
crypto/blkcipher.c +1 -1
Index: linux-2.6/crypto/blkcipher.c
===================================================================
@@ -89,9 +89,9 @@ static inline unsigned int blkcipher_don
 		memcpy(walk->dst.virt.addr, walk->page, n);
 		blkcipher_unmap_dst(walk);
 	} else if (!(walk->flags & BLKCIPHER_WALK_PHYS)) {
-		blkcipher_unmap_src(walk);
 		if (walk->flags & BLKCIPHER_WALK_DIFF)
 			blkcipher_unmap_dst(walk);
+		blkcipher_unmap_src(walk);
 	}
 
 	scatterwalk_advance(&walk->in, n);
drivers/block/loop.c +2 -2
Index: linux-2.6/drivers/block/loop.c
===================================================================
@@ -99,8 +99,8 @@ static int transfer_none(struct loop_dev
 	else
 		memcpy(raw_buf, loop_buf, size);
 
-	kunmap_atomic(raw_buf, KM_USER0);
 	kunmap_atomic(loop_buf, KM_USER1);
+	kunmap_atomic(raw_buf, KM_USER0);
 	cond_resched();
 	return 0;
 }
@@ -128,8 +128,8 @@ static int transfer_xor(struct loop_devi
 	for (i = 0; i < size; i++)
 		*out++ = *in++ ^ key[(i & 511) % keysize];
 
-	kunmap_atomic(raw_buf, KM_USER0);
 	kunmap_atomic(loop_buf, KM_USER1);
+	kunmap_atomic(raw_buf, KM_USER0);
 	cond_resched();
 	return 0;
 }
include/linux/highmem.h +2 -2
Index: linux-2.6/include/linux/highmem.h
===================================================================
@@ -191,8 +191,8 @@ static inline void copy_user_highpage(st
 	vfrom = kmap_atomic(from, KM_USER0);
 	vto = kmap_atomic(to, KM_USER1);
 	copy_user_page(vto, vfrom, vaddr, to);
-	kunmap_atomic(vfrom, KM_USER0);
 	kunmap_atomic(vto, KM_USER1);
+	kunmap_atomic(vfrom, KM_USER0);
 }
 
 #endif
@@ -204,8 +204,8 @@ static inline void copy_highpage(struct 
 	vfrom = kmap_atomic(from, KM_USER0);
 	vto = kmap_atomic(to, KM_USER1);
 	copy_page(vto, vfrom);
-	kunmap_atomic(vfrom, KM_USER0);
 	kunmap_atomic(vto, KM_USER1);
+	kunmap_atomic(vfrom, KM_USER0);
 }
 
 #endif /* _LINUX_HIGHMEM_H */
kernel/power/snapshot.c +2 -2
Index: linux-2.6/kernel/power/snapshot.c
===================================================================
@@ -978,8 +978,8 @@ static void copy_data_page(unsigned long
 		src = kmap_atomic(s_page, KM_USER0);
 		dst = kmap_atomic(d_page, KM_USER1);
 		do_copy_page(dst, src);
-		kunmap_atomic(src, KM_USER0);
 		kunmap_atomic(dst, KM_USER1);
+		kunmap_atomic(src, KM_USER0);
 	} else {
 		if (PageHighMem(d_page)) {
 			/* Page pointed to by src may contain some kernel
@@ -2253,8 +2253,8 @@ swap_two_pages_data(struct page *p1, str
 	memcpy(buf, kaddr1, PAGE_SIZE);
 	memcpy(kaddr1, kaddr2, PAGE_SIZE);
 	memcpy(kaddr2, buf, PAGE_SIZE);
-	kunmap_atomic(kaddr1, KM_USER0);
 	kunmap_atomic(kaddr2, KM_USER1);
+	kunmap_atomic(kaddr1, KM_USER0);
 }
 
 /**

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

Reviewed-by on v1 1/6
#2 lore raw

Re: [RFC][PATCH 1/6] mm: strictly nested kmap_atomic

Quoted 3 lines · Peter Zijlstra

Ensure kmap_atomic usage is strictly nested

Signature · 7 lines
All rights reversed

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to [email protected].  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
#4 lore raw

RFC PATCH 2/6 mm: stack based kmap_atomic

In reply to Peter Zijlstra

Keep the current interface but ignore the KM_type and use a stack based approach.

---
 arch/arm/mm/highmem.c              |    8 ++++
 arch/frv/include/asm/highmem.h     |    3 +
 arch/mips/mm/highmem.c             |   12 ++++---
 arch/mn10300/include/asm/highmem.h |   36 +++++++++++++--------
 arch/powerpc/mm/highmem.c          |   26 +++++++++------
 arch/sparc/mm/highmem.c            |   37 ++++++++++++----------
 arch/x86/mm/highmem_32.c           |   33 ++++++++++++-------
 arch/x86/mm/iomap_32.c             |   28 +++++++++++-----
 include/linux/highmem.h            |   32 +++++++++++--------
 mm/highmem.c                       |   62 ++-----------------------------------
 10 files changed, 139 insertions(+), 138 deletions(-)
arch/arm/mm/highmem.c +7 -1
Index: linux-2.6/arch/arm/mm/highmem.c
===================================================================
@@ -61,6 +61,8 @@ void *kmap_atomic(struct page *page, enu
 	if (kmap)
 		return kmap;
 
+	type = kmap_atomic_idx_push();
+
 	idx = type + KM_TYPE_NR * smp_processor_id();
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 #ifdef CONFIG_DEBUG_HIGHMEM
@@ -85,9 +87,12 @@ EXPORT_SYMBOL(kmap_atomic);
 void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-	unsigned int idx = type + KM_TYPE_NR * smp_processor_id();
+	unsigned int idx;
 
 	if (kvaddr >= (void *)FIXADDR_START) {
+		type = kmap_atomic_idx_pop();
+		idx = type + KM_TYPE_NR * smp_processor_id();
+
 		if (cache_is_vivt())
 			__cpuc_flush_dcache_area((void *)vaddr, PAGE_SIZE);
 #ifdef CONFIG_DEBUG_HIGHMEM
@@ -112,6 +117,7 @@ void *kmap_atomic_pfn(unsigned long pfn,
 
 	pagefault_disable();
 
+	type = kmap_atomic_idx_push();
 	idx = type + KM_TYPE_NR * smp_processor_id();
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 #ifdef CONFIG_DEBUG_HIGHMEM
arch/frv/include/asm/highmem.h +2 -1
Index: linux-2.6/arch/frv/include/asm/highmem.h
===================================================================
@@ -117,7 +117,7 @@ static inline void *kmap_atomic(struct p
 	unsigned long paddr;
 
 	pagefault_disable();
-	debug_kmap_atomic(type);
+	type = kmap_atomic_idx_push();
 	paddr = page_to_phys(page);
 
 	switch (type) {
@@ -154,6 +154,7 @@ do {									\
 
 static inline void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
 {
+	type = kmap_atomic_idx_pop();
 	switch (type) {
         case 0:		__kunmap_atomic_primary(0, 2);	break;
         case 1:		__kunmap_atomic_primary(1, 3);	break;
arch/mips/mm/highmem.c +7 -5
Index: linux-2.6/arch/mips/mm/highmem.c
===================================================================
@@ -51,7 +51,7 @@ void *__kmap_atomic(struct page *page, e
 	if (!PageHighMem(page))
 		return page_address(page);
 
-	debug_kmap_atomic(type);
+	type = kmap_atomic_idx_push();
 	idx = type + KM_TYPE_NR*smp_processor_id();
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 #ifdef CONFIG_DEBUG_HIGHMEM
@@ -66,15 +66,18 @@ EXPORT_SYMBOL(__kmap_atomic);
 
 void __kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
 {
-#ifdef CONFIG_DEBUG_HIGHMEM
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-	enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
+	unsigned int idx;
 
 	if (vaddr < FIXADDR_START) { // FIXME
 		pagefault_enable();
 		return;
 	}
 
+	type = kmap_atomic_idx_pop();
+#ifdef CONFIG_DEBUG_HIGHMEM
+	idx = type + KM_TYPE_NR * smp_processor_id();
+
 	BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
 
 	/*
@@ -84,7 +87,6 @@ void __kunmap_atomic_notypecheck(void *k
 	pte_clear(&init_mm, vaddr, kmap_pte-idx);
 	local_flush_tlb_one(vaddr);
 #endif
-
 	pagefault_enable();
 }
 EXPORT_SYMBOL(__kunmap_atomic_notypecheck);
@@ -100,7 +102,7 @@ void *kmap_atomic_pfn(unsigned long pfn,
 
 	pagefault_disable();
 
-	debug_kmap_atomic(type);
+	type = kmap_atomic_idx_push();
 	idx = type + KM_TYPE_NR*smp_processor_id();
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 	set_pte(kmap_pte-idx, pfn_pte(pfn, PAGE_KERNEL));
arch/mn10300/include/asm/highmem.h +22 -14
Index: linux-2.6/arch/mn10300/include/asm/highmem.h
===================================================================
@@ -75,10 +75,11 @@ static inline unsigned long kmap_atomic(
 	enum fixed_addresses idx;
 	unsigned long vaddr;
 
+	pagefault_disable();
 	if (page < highmem_start_page)
 		return page_address(page);
 
-	debug_kmap_atomic(type);
+	type = kmap_atomic_idx_push();
 	idx = type + KM_TYPE_NR * smp_processor_id();
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 #if HIGHMEM_DEBUG
@@ -93,24 +94,31 @@ static inline unsigned long kmap_atomic(
 
 static inline void kunmap_atomic_notypecheck(unsigned long vaddr, enum km_type type)
 {
-#if HIGHMEM_DEBUG
-	enum fixed_addresses idx = type + KM_TYPE_NR * smp_processor_id();
-
-	if (vaddr < FIXADDR_START) /* FIXME */
+	if (vaddr < FIXADDR_START) { /* FIXME */
+		pagefault_enable();
 		return;
+	}
 
-	if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx))
-		BUG();
+	type = kmap_atomic_idx_pop();
 
-	/*
-	 * force other mappings to Oops if they'll try to access
-	 * this pte without first remap it
-	 */
-	pte_clear(kmap_pte - idx);
-	__flush_tlb_one(vaddr);
+#if HIGHMEM_DEBUG
+	{
+		unsigned int idx;
+		idx = type + KM_TYPE_NR * smp_processor_id();
+
+		if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx))
+			BUG();
+
+		/*
+		 * force other mappings to Oops if they'll try to access
+		 * this pte without first remap it
+		 */
+		pte_clear(kmap_pte - idx);
+		__flush_tlb_one(vaddr);
+	}
 #endif
+	pagefault_enable();
 }
-
 #endif /* __KERNEL__ */
 
 #endif /* _ASM_HIGHMEM_H */
arch/powerpc/mm/highmem.c +16 -10
Index: linux-2.6/arch/powerpc/mm/highmem.c
===================================================================
@@ -39,7 +39,7 @@ void *kmap_atomic_prot(struct page *page
 	if (!PageHighMem(page))
 		return page_address(page);
 
-	debug_kmap_atomic(type);
+	type = kmap_atomic_idx_push();
 	idx = type + KM_TYPE_NR*smp_processor_id();
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 #ifdef CONFIG_DEBUG_HIGHMEM
@@ -54,23 +54,29 @@ EXPORT_SYMBOL(kmap_atomic_prot);
 
 void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
 {
-#ifdef CONFIG_DEBUG_HIGHMEM
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-	enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
 
 	if (vaddr < __fix_to_virt(FIX_KMAP_END)) {
 		pagefault_enable();
 		return;
 	}
 
-	BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
+	type = kmap_atomic_idx_pop();
 
-	/*
-	 * force other mappings to Oops if they'll try to access
-	 * this pte without first remap it
-	 */
-	pte_clear(&init_mm, vaddr, kmap_pte-idx);
-	local_flush_tlb_page(NULL, vaddr);
+#ifdef CONFIG_DEBUG_HIGHMEM
+	{
+		unsigned int idx;
+
+		idx = type + KM_TYPE_NR * smp_processor_id();
+		BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
+
+		/*
+		 * force other mappings to Oops if they'll try to access
+		 * this pte without first remap it
+		 */
+		pte_clear(&init_mm, vaddr, kmap_pte-idx);
+		local_flush_tlb_page(NULL, vaddr);
+	}
 #endif
 	pagefault_enable();
 }
arch/sparc/mm/highmem.c +21 -16
Index: linux-2.6/arch/sparc/mm/highmem.c
===================================================================
@@ -39,7 +39,7 @@ void *kmap_atomic(struct page *page, enu
 	if (!PageHighMem(page))
 		return page_address(page);
 
-	debug_kmap_atomic(type);
+	type = kmap_atomic_idx_push();
 	idx = type + KM_TYPE_NR*smp_processor_id();
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 
@@ -67,37 +67,42 @@ EXPORT_SYMBOL(kmap_atomic);
 
 void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
 {
-#ifdef CONFIG_DEBUG_HIGHMEM
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-	unsigned long idx = type + KM_TYPE_NR*smp_processor_id();
 
 	if (vaddr < FIXADDR_START) { // FIXME
 		pagefault_enable();
 		return;
 	}
 
-	BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx));
+	type = kmap_atomic_idx_pop();
 
-/* XXX Fix - Anton */
+#ifdef CONFIG_DEBUG_HIGHMEM
+	{
+		unsigned long idx;
+
+		idx = type + KM_TYPE_NR * smp_processor_id();
+		BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx));
+
+		/* XXX Fix - Anton */
 #if 0
-	__flush_cache_one(vaddr);
+		__flush_cache_one(vaddr);
 #else
-	flush_cache_all();
+		flush_cache_all();
 #endif
 
-	/*
-	 * force other mappings to Oops if they'll try to access
-	 * this pte without first remap it
-	 */
-	pte_clear(&init_mm, vaddr, kmap_pte-idx);
-/* XXX Fix - Anton */
+		/*
+		 * force other mappings to Oops if they'll try to access
+		 * this pte without first remap it
+		 */
+		pte_clear(&init_mm, vaddr, kmap_pte-idx);
+		/* XXX Fix - Anton */
 #if 0
-	__flush_tlb_one(vaddr);
+		__flush_tlb_one(vaddr);
 #else
-	flush_tlb_all();
+		flush_tlb_all();
 #endif
+	}
 #endif
-
 	pagefault_enable();
 }
 EXPORT_SYMBOL(kunmap_atomic_notypecheck);
arch/x86/mm/highmem_32.c +21 -12
Index: linux-2.6/arch/x86/mm/highmem_32.c
===================================================================
@@ -38,8 +38,7 @@ void *kmap_atomic_prot(struct page *page
 	if (!PageHighMem(page))
 		return page_address(page);
 
-	debug_kmap_atomic(type);
-
+	type = kmap_atomic_idx_push();
 	idx = type + KM_TYPE_NR*smp_processor_id();
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 	BUG_ON(!pte_none(*(kmap_pte-idx)));
@@ -56,22 +55,32 @@ void *kmap_atomic(struct page *page, enu
 void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-	enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
+	enum fixed_addresses idx;
+
+	if (vaddr >= __fix_to_virt(FIX_KMAP_END) &&
+	    vaddr <= __fix_to_virt(FIX_KMAP_BEGIN)) {
+
+		type = kmap_atomic_idx_pop();
+		idx = type + KM_TYPE_NR * smp_processor_id();
 
-	/*
-	 * Force other mappings to Oops if they'll try to access this pte
-	 * without first remap it.  Keeping stale mappings around is a bad idea
-	 * also, in case the page changes cacheability attributes or becomes
-	 * a protected page in a hypervisor.
-	 */
-	if (vaddr == __fix_to_virt(FIX_KMAP_BEGIN+idx))
+#ifdef CONFIG_DEBUG_HIGHMEM
+		WARN_ON_ONCE(idx !=
+			((vaddr - __fix_to_virt(FIX_KMAP_BEGIN)) >> PAGE_SHIFT));
+#endif
+		/*
+		 * Force other mappings to Oops if they'll try to access this
+		 * pte without first remap it.  Keeping stale mappings around
+		 * is a bad idea also, in case the page changes cacheability
+		 * attributes or becomes a protected page in a hypervisor.
+		 */
 		kpte_clear_flush(kmap_pte-idx, vaddr);
-	else {
+	}
 #ifdef CONFIG_DEBUG_HIGHMEM
+	else {
 		BUG_ON(vaddr < PAGE_OFFSET);
 		BUG_ON(vaddr >= (unsigned long)high_memory);
-#endif
 	}
+#endif
 
 	pagefault_enable();
 }
include/linux/highmem.h +20 -12
Index: linux-2.6/include/linux/highmem.h
===================================================================
@@ -28,18 +28,6 @@ static inline void invalidate_kernel_vma
 
 #include <asm/kmap_types.h>
 
-#ifdef CONFIG_DEBUG_HIGHMEM
-
-void debug_kmap_atomic(enum km_type type);
-
-#else
-
-static inline void debug_kmap_atomic(enum km_type type)
-{
-}
-
-#endif
-
 #ifdef CONFIG_HIGHMEM
 #include <asm/highmem.h>
 
@@ -49,6 +37,26 @@ extern unsigned long totalhigh_pages;
 
 void kmap_flush_unused(void);
 
+DECLARE_PER_CPU(int, __kmap_atomic_idx);
+
+static inline int kmap_atomic_idx_push(void)
+{
+	int idx = __get_cpu_var(__kmap_atomic_idx)++;
+#ifdef CONFIG_DEBUG_HIGHMEM
+	BUG_ON(idx > KM_TYPE_NR);
+#endif
+	return idx;
+}
+
+static inline int kmap_atomic_idx_pop(void)
+{
+	int idx = --__get_cpu_var(__kmap_atomic_idx);
+#ifdef CONFIG_DEBUG_HIGHMEM
+	BUG_ON(idx < 0);
+#endif
+	return idx;
+}
+
 #else /* CONFIG_HIGHMEM */
 
 static inline unsigned int nr_free_highpages(void) { return 0; }
mm/highmem.c +4 -58

71 lines not on this page · raw message

arch/x86/mm/iomap_32.c +19 -9
Index: linux-2.6/arch/x86/mm/iomap_32.c
===================================================================
@@ -62,7 +62,7 @@ void *kmap_atomic_prot_pfn(unsigned long
 
 	pagefault_disable();
 
-	debug_kmap_atomic(type);
+	type = kmap_atomic_idx_push();
 	idx = type + KM_TYPE_NR * smp_processor_id();
 	vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
 	set_pte(kmap_pte - idx, pfn_pte(pfn, prot));
@@ -94,16 +94,26 @@ void
 iounmap_atomic(void *kvaddr, enum km_type type)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-	enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
+	enum fixed_addresses idx;
 
-	/*
-	 * Force other mappings to Oops if they'll try to access this pte
-	 * without first remap it.  Keeping stale mappings around is a bad idea
-	 * also, in case the page changes cacheability attributes or becomes
-	 * a protected page in a hypervisor.
-	 */
-	if (vaddr == __fix_to_virt(FIX_KMAP_BEGIN+idx))
+	if (vaddr >= __fix_to_virt(FIX_KMAP_END) &&
+	    vaddr <= __fix_to_virt(FIX_KMAP_BEGIN)) {
+
+		type = kmap_atomic_idx_pop();
+		idx = type + KM_TYPE_NR * smp_processor_id();
+
+#ifdef CONFIG_DEBUG_HIGHMEM
+		WARN_ON_ONCE(idx !=
+			((vaddr - __fix_to_virt(FIX_KMAP_BEGIN)) >> PAGE_SHIFT));
+#endif
+		/*
+		 * Force other mappings to Oops if they'll try to access this
+		 * pte without first remap it.  Keeping stale mappings around
+		 * is a bad idea also, in case the page changes cacheability
+		 * attributes or becomes a protected page in a hypervisor.
+		 */
 		kpte_clear_flush(kmap_pte-idx, vaddr);
+	}
 
 	pagefault_enable();
 }

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

Acked-by on v1 2/6
#5 lore raw

Re: [RFC][PATCH 2/6] mm: stack based kmap_atomic

Quoted 4 lines · Peter Zijlstra

Keep the current interface but ignore the KM_type and use a stack based approach.

Signature · 7 lines
All rights reversed

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to [email protected].  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
#6 lore raw

Re: [RFC][PATCH 2/6] mm: stack based kmap_atomic

In reply to Peter Zijlstra
Quoted 18 lines · On Thu, 19 Aug 2010 22:13:19 +0200 Peter Zijlstra <[email protected]>…

Keep the current interface but ignore the KM_type and use a stack based approach.

---

include/linux/highmem.h +11 -0
+DECLARE_PER_CPU(int, __kmap_atomic_idx);
+
+static inline int kmap_atomic_idx_push(void)
+{
+	int idx = __get_cpu_var(__kmap_atomic_idx)++;
+#ifdef CONFIG_DEBUG_HIGHMEM
+	BUG_ON(idx > KM_TYPE_NR);
+#endif
+	return idx;
+}
+

include/linux/highmem.h extern unsigned long totalhigh_pages; · line 60

Quoted 10 lines
include/linux/highmem.h +9 -0
+static inline int kmap_atomic_idx_pop(void)
+{
+	int idx = --__get_cpu_var(__kmap_atomic_idx);
+#ifdef CONFIG_DEBUG_HIGHMEM
+	BUG_ON(idx < 0);
+#endif
+	return idx;
+}
+
 #else /* CONFIG_HIGHMEM */

I may don't understand anything... Is irq already disabled ?
And Is it documented that kmap_atomic shouln't be used under NMI or something special interrupts ?

Thanks,
-Kame

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

#7 lore raw

Re: [RFC][PATCH 2/6] mm: stack based kmap_atomic

Quoted 3 lines · On Tue, 24 Aug 2010 16:24:27 +0900 KAMEZAWA Hiroyuki…

And Is it documented that kmap_atomic shouln't be used under NMI or something special interrupts ?

Sorry, I missed something..Maybe not trouble.

-Kame

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

maintainer
#8 lore raw

Re: [RFC][PATCH 2/6] mm: stack based kmap_atomic

Quoted 7 lines · KAMEZAWA Hiroyuki
Quoted 3 lines · On Tue, 24 Aug 2010 16:24:27 +0900 KAMEZAWA Hiroyuki…

And Is it documented that kmap_atomic shouln't be used under NMI or something special interrupts ?

Sorry, I missed something..Maybe not trouble.

In particular, we actually do use kmap_atomic from NMI context ;-)

It only relies on preempt_disable(), which for now is implied by pagefault_disable(), if at some point those get split kmap_atomic will need to do both (currently only PREEMPT_RT splits it, but then that has a totally different kmap implementation too).

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

#9 lore raw

RFC PATCH 3/6 mm, frv: Out-of-line kmap-atomic

In reply to Peter Zijlstra

Out-of-line the kmap_atomic implementation since the dynamic type destroys all the constant value reduction previously used.

Also, remove the first 4 primary maps, since those are used by the architecture for special purposes, mostly through direct assembly, but also through the __kmap_atomic_primary() interface.

---
 arch/frv/include/asm/highmem.h  |   53 +---------------------------------------
 arch/frv/mb93090-mb00/pci-dma.c |    4 +--
 arch/frv/mm/cache-page.c        |    8 +++---
 arch/frv/mm/highmem.c           |   50 +++++++++++++++++++++++++++++++++++++
 4 files changed, 58 insertions(+), 57 deletions(-)
arch/frv/include/asm/highmem.h +2 -51
Index: linux-2.6/arch/frv/include/asm/highmem.h
===================================================================
@@ -112,34 +112,6 @@ extern struct page *kmap_atomic_to_page(
 	(void *) damlr;										  \
 })
 
-static inline void *kmap_atomic(struct page *page, enum km_type type)
-{
-	unsigned long paddr;
-
-	pagefault_disable();
-	type = kmap_atomic_idx_push();
-	paddr = page_to_phys(page);
-
-	switch (type) {
-        case 0:		return __kmap_atomic_primary(0, paddr, 2);
-        case 1:		return __kmap_atomic_primary(1, paddr, 3);
-        case 2:		return __kmap_atomic_primary(2, paddr, 4);
-        case 3:		return __kmap_atomic_primary(3, paddr, 5);
-        case 4:		return __kmap_atomic_primary(4, paddr, 6);
-        case 5:		return __kmap_atomic_primary(5, paddr, 7);
-        case 6:		return __kmap_atomic_primary(6, paddr, 8);
-        case 7:		return __kmap_atomic_primary(7, paddr, 9);
-        case 8:		return __kmap_atomic_primary(8, paddr, 10);
-
-	case 9 ... 9 + NR_TLB_LINES - 1:
-		return __kmap_atomic_secondary(type - 9, paddr);
-
-	default:
-		BUG();
-		return NULL;
-	}
-}
-
 #define __kunmap_atomic_primary(type, ampr)				\
 do {									\
 	asm volatile("movgs gr0,dampr"#ampr"\n" ::: "memory");		\
@@ -152,29 +124,8 @@ do {									\
 	asm volatile("tlbpr %0,gr0,#4,#1" : : "r"(vaddr) : "memory");	\
 } while(0)
 
-static inline void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
-{
-	type = kmap_atomic_idx_pop();
-	switch (type) {
-        case 0:		__kunmap_atomic_primary(0, 2);	break;
-        case 1:		__kunmap_atomic_primary(1, 3);	break;
-        case 2:		__kunmap_atomic_primary(2, 4);	break;
-        case 3:		__kunmap_atomic_primary(3, 5);	break;
-        case 4:		__kunmap_atomic_primary(4, 6);	break;
-        case 5:		__kunmap_atomic_primary(5, 7);	break;
-        case 6:		__kunmap_atomic_primary(6, 8);	break;
-        case 7:		__kunmap_atomic_primary(7, 9);	break;
-        case 8:		__kunmap_atomic_primary(8, 10);	break;
-
-	case 9 ... 9 + NR_TLB_LINES - 1:
-		__kunmap_atomic_secondary(type - 9, kvaddr);
-		break;
-
-	default:
-		BUG();
-	}
-	pagefault_enable();
-}
+void *kmap_atomic(struct page *page, enum km_type type);
+void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type);
 
 #endif /* !__ASSEMBLY__ */
 
arch/frv/mm/cache-page.c +4 -4
Index: linux-2.6/arch/frv/mm/cache-page.c
===================================================================
@@ -26,11 +26,11 @@ void flush_dcache_page(struct page *page
 
 	dampr2 = __get_DAMPR(2);
 
-	vaddr = kmap_atomic(page, __KM_CACHE);
+	vaddr = __kmap_atomic_primary(0, page, 2);
 
 	frv_dcache_writeback((unsigned long) vaddr, (unsigned long) vaddr + PAGE_SIZE);
 
-	kunmap_atomic(vaddr, __KM_CACHE);
+	__kunmap_atomic_primary(0, 2);
 
 	if (dampr2) {
 		__set_DAMPR(2, dampr2);
@@ -54,12 +54,12 @@ void flush_icache_user_range(struct vm_a
 
 	dampr2 = __get_DAMPR(2);
 
-	vaddr = kmap_atomic(page, __KM_CACHE);
+	vaddr = __kmap_atomic_primary(0, page, 2);
 
 	start = (start & ~PAGE_MASK) | (unsigned long) vaddr;
 	frv_cache_wback_inv(start, start + len);
 
-	kunmap_atomic(vaddr, __KM_CACHE);
+	__kunmap_atomic_primary(0, 2);
 
 	if (dampr2) {
 		__set_DAMPR(2, dampr2);
arch/frv/mm/highmem.c +50 -0

53 lines not on this page · raw message

arch/frv/mb93090-mb00/pci-dma.c +2 -2
Index: linux-2.6/arch/frv/mb93090-mb00/pci-dma.c
===================================================================
@@ -61,14 +61,14 @@ int dma_map_sg(struct device *dev, struc
 	dampr2 = __get_DAMPR(2);
 
 	for (i = 0; i < nents; i++) {
-		vaddr = kmap_atomic(sg_page(&sg[i]), __KM_CACHE);
+		vaddr = __kmap_atomic_primary(0, sg_page(&sg[i]), 2);
 
 		frv_dcache_writeback((unsigned long) vaddr,
 				     (unsigned long) vaddr + PAGE_SIZE);
 
 	}
 
-	kunmap_atomic(vaddr, __KM_CACHE);
+	__kunmap_atomic_primary(0, 2);
 	if (dampr2) {
 		__set_DAMPR(2, dampr2);
 		__set_IAMPR(2, dampr2);

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

Acked-by on v1 3/6
#10 lore raw

Re: [RFC][PATCH 3/6] mm, frv: Out-of-line kmap-atomic

Quoted 8 lines · Peter Zijlstra

Out-of-line the kmap_atomic implementation since the dynamic type destroys all the constant value reduction previously used.

Also, remove the first 4 primary maps, since those are used by the architecture for special purposes, mostly through direct assembly, but also through the __kmap_atomic_primary() interface.

Signature · 7 lines
All rights reversed

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to [email protected].  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
#11 lore raw

RFC PATCH 4/6 mm: Remove all KM_type arguments

In reply to Peter Zijlstra

Do the bulk of the km_type and KM_type removement by script.

git grep -l -e km_type -e KM_ | grep -v xfs | while read file; do

	quilt add $file;
        sed -i -e 's/,[[:space:]]*enum km_type type[[:space:]]*//g'         \
               -e 's/,[[:space:]]*KM_[[:digit:][:upper:]_]*[[:space:]]*//g' \
            $file;

done

---
 arch/arm/include/asm/highmem.h            |    6 -
 arch/arm/include/asm/pgtable.h            |    8 +-
 arch/arm/mm/copypage-fa.c                 |   12 +--
 arch/arm/mm/copypage-feroceon.c           |   12 +--
 arch/arm/mm/copypage-v3.c                 |   12 +--
 arch/arm/mm/copypage-v4mc.c               |    8 +-
 arch/arm/mm/copypage-v4wb.c               |   12 +--
 arch/arm/mm/copypage-v4wt.c               |   12 +--
 arch/arm/mm/copypage-v6.c                 |   12 +--
 arch/arm/mm/copypage-xsc3.c               |   12 +--
 arch/arm/mm/copypage-xscale.c             |    8 +-
 arch/arm/mm/highmem.c                     |    6 -
 arch/frv/include/asm/highmem.h            |    4 -
 arch/frv/include/asm/pgtable.h            |    8 +-
 arch/frv/mm/highmem.c                     |    4 -
 arch/microblaze/include/asm/pgtable.h     |    8 +-
 arch/mips/include/asm/highmem.h           |    6 -
 arch/mips/mm/c-r4k.c                      |    4 -
 arch/mips/mm/highmem.c                    |    6 -
 arch/mips/mm/init.c                       |    8 +-
 arch/mn10300/include/asm/highmem.h        |    4 -
 arch/powerpc/include/asm/highmem.h        |    6 -
 arch/powerpc/include/asm/pgtable-ppc32.h  |    8 +-
 arch/powerpc/kvm/book3s.c                 |    4 -
 arch/powerpc/mm/dma-noncoherent.c         |    2 
 arch/powerpc/mm/highmem.c                 |    4 -
 arch/powerpc/mm/mem.c                     |    4 -
 arch/s390/crypto/des_s390.c               |    8 +-
 arch/sh/mm/cache-sh4.c                    |    4 -
 arch/sh/mm/cache.c                        |   12 +--
 arch/sparc/include/asm/highmem.h          |    4 -
 arch/sparc/mm/highmem.c                   |    4 -
 arch/tile/include/asm/highmem.h           |   10 +--
 arch/tile/include/asm/pgtable.h           |    8 +-
 arch/tile/kernel/machine_kexec.c          |    6 -
 arch/tile/mm/highmem.c                    |   12 +--
 arch/tile/mm/pgtable.c                    |    2 
 arch/um/kernel/skas/uaccess.c             |    4 -
 arch/x86/include/asm/highmem.h            |   10 +--
 arch/x86/include/asm/iomap.h              |    4 -
 arch/x86/include/asm/pgtable_32.h         |    4 -
 arch/x86/kernel/crash_dump_32.c           |    8 +-
 arch/x86/kvm/lapic.c                      |    8 +-
 arch/x86/kvm/paging_tmpl.h                |    4 -
 arch/x86/kvm/x86.c                        |    8 +-
 arch/x86/lib/usercopy_32.c                |    4 -
 arch/x86/mm/highmem_32.c                  |    8 +-
 arch/x86/mm/iomap_32.c                    |    6 -
 crypto/async_tx/async_memcpy.c            |    8 +-
 drivers/ata/libata-sff.c                  |    8 +-
 drivers/block/brd.c                       |   20 +++---
 drivers/block/drbd/drbd_bitmap.c          |   30 ++++-----
 drivers/block/drbd/drbd_nl.c              |    4 -
 drivers/block/loop.c                      |   16 ++---
 drivers/block/pktcdvd.c                   |    8 +-
 drivers/crypto/hifn_795x.c                |   10 +--
 drivers/edac/edac_mc.c                    |    4 -
 drivers/gpu/drm/drm_cache.c               |    8 +-
 drivers/gpu/drm/i915/i915_debugfs.c       |    4 -
 drivers/gpu/drm/i915/i915_gem.c           |   22 +++----
 drivers/gpu/drm/i915/i915_gem_debug.c     |   10 +--
 drivers/gpu/drm/i915/i915_irq.c           |    4 -
 drivers/gpu/drm/i915/intel_overlay.c      |    2 
 drivers/gpu/drm/nouveau/nouveau_bios.c    |    8 +-
 drivers/gpu/drm/ttm/ttm_bo_util.c         |    8 +-
 drivers/gpu/drm/ttm/ttm_tt.c              |   16 ++---
 drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c       |    6 -
 drivers/ide/ide-taskfile.c                |    4 -
 drivers/infiniband/ulp/iser/iser_memory.c |    8 +-
 drivers/md/bitmap.c                       |   36 +++++------
 drivers/media/video/ivtv/ivtv-udma.c      |    4 -
 drivers/memstick/host/jmb38x_ms.c         |    4 -
 drivers/memstick/host/tifm_ms.c           |    4 -
 drivers/mmc/host/at91_mci.c               |    8 +-
 drivers/mmc/host/msm_sdcc.c               |    2 
 drivers/mmc/host/sdhci.c                  |    4 -
 drivers/mmc/host/tifm_sd.c                |   16 ++---
 drivers/mmc/host/tmio_mmc.h               |    4 -
 drivers/net/cassini.c                     |    4 -
 drivers/net/e1000e/netdev.c               |    4 -
 drivers/scsi/arcmsr/arcmsr_hba.c          |    8 +-
 drivers/scsi/cxgb3i/cxgb3i_pdu.c          |    2 
 drivers/scsi/fcoe/fcoe.c                  |    6 -
 drivers/scsi/gdth.c                       |    4 -
 drivers/scsi/ips.c                        |    6 -
 drivers/scsi/libfc/fc_fcp.c               |    8 +-
 drivers/scsi/libfc/fc_lport.c             |    2 
 drivers/scsi/libiscsi_tcp.c               |    4 -
 drivers/scsi/libsas/sas_host_smp.c        |    8 +-
 drivers/scsi/megaraid.c                   |    4 -
 drivers/scsi/mvsas/mv_sas.c               |    8 +-
 drivers/scsi/scsi_debug.c                 |   24 +++----
 drivers/scsi/scsi_lib.c                   |    4 -
 drivers/scsi/sd_dif.c                     |   12 +--
 drivers/staging/hv/netvsc_drv.c           |    2 
 drivers/staging/hv/rndis_filter.c         |    4 -
 drivers/staging/hv/storvsc_drv.c          |   18 ++---
 drivers/staging/pohmelfs/inode.c          |    8 +-
 drivers/staging/zram/xvmalloc.c           |   34 +++++-----
 drivers/staging/zram/zram_drv.c           |   38 ++++++------
 drivers/vhost/vhost.c                     |    4 -
 fs/afs/fsclient.c                         |    8 +-
 fs/afs/mntpt.c                            |    4 -
 fs/aio.c                                  |   24 +++----
 fs/bio-integrity.c                        |   10 +--
 fs/btrfs/compression.c                    |    8 +-
 fs/btrfs/ctree.c                          |   30 ++++-----
 fs/btrfs/ctree.h                          |    8 +-
 fs/btrfs/disk-io.c                        |    4 -
 fs/btrfs/extent_io.c                      |   56 ++++++++---------
 fs/btrfs/file-item.c                      |   10 +--
 fs/btrfs/inode.c                          |   26 ++++----
 fs/btrfs/struct-funcs.c                   |   10 +--
 fs/btrfs/zlib.c                           |    8 +-
 fs/cifs/file.c                            |    4 -
 fs/ecryptfs/mmap.c                        |    4 -
 fs/ecryptfs/read_write.c                  |    8 +-
 fs/exec.c                                 |    4 -
 fs/exofs/dir.c                            |    4 -
 fs/ext2/dir.c                             |    4 -
 fs/fuse/dev.c                             |    8 +-
 fs/fuse/file.c                            |    4 -
 fs/gfs2/aops.c                            |   12 +--
 fs/gfs2/lops.c                            |    8 +-
 fs/gfs2/quota.c                           |    4 -
 fs/jbd/journal.c                          |   12 +--
 fs/jbd/transaction.c                      |    4 -
 fs/jbd2/commit.c                          |    4 -
 fs/jbd2/journal.c                         |   12 +--
 fs/jbd2/transaction.c                     |    4 -
 fs/logfs/dir.c                            |   18 ++---
 fs/logfs/readwrite.c                      |   38 ++++++------
 fs/logfs/segment.c                        |    4 -
 fs/minix/dir.c                            |    4 -
 fs/namei.c                                |    4 -
 fs/nfs/dir.c                              |    4 -
 fs/nfs/nfs2xdr.c                          |    8 +-
 fs/nfs/nfs3xdr.c                          |    8 +-
 fs/nfs/nfs4proc.c                         |    4 -
 fs/nfs/nfs4xdr.c                          |   10 +--
 fs/nilfs2/cpfile.c                        |   94 +++++++++++++++---------------
 fs/nilfs2/dat.c                           |   38 ++++++------
 fs/nilfs2/dir.c                           |    4 -
 fs/nilfs2/ifile.c                         |    4 -
 fs/nilfs2/mdt.c                           |    4 -
 fs/nilfs2/page.c                          |    8 +-
 fs/nilfs2/recovery.c                      |    4 -
 fs/nilfs2/segbuf.c                        |    4 -
 fs/nilfs2/segment.c                       |    4 -
 fs/nilfs2/sufile.c                        |   58 +++++++++---------
 fs/ntfs/aops.c                            |   20 +++---
 fs/ntfs/attrib.c                          |   20 +++---
 fs/ntfs/file.c                            |   16 ++---
 fs/ntfs/super.c                           |    8 +-
 fs/ocfs2/aops.c                           |   16 ++---
 fs/pipe.c                                 |    8 +-
 fs/reiserfs/stree.c                       |    4 -
 fs/reiserfs/tail_conversion.c             |    4 -
 fs/splice.c                               |    4 -
 fs/squashfs/file.c                        |    8 +-
 fs/squashfs/symlink.c                     |    4 -
 fs/ubifs/file.c                           |    4 -
 fs/udf/file.c                             |    4 -
 include/linux/bio.h                       |    4 -
 include/linux/highmem.h                   |   28 ++++----
 kernel/debug/kdb/kdb_support.c            |    4 -
 kernel/power/snapshot.c                   |   28 ++++----
 lib/scatterlist.c                         |    4 -
 lib/swiotlb.c                             |    2 
 mm/bounce.c                               |    4 -
 mm/filemap.c                              |    8 +-
 mm/ksm.c                                  |   12 +--
 mm/memory.c                               |    4 -
 mm/shmem.c                                |   14 ++--
 mm/swapfile.c                             |   30 ++++-----
 mm/vmalloc.c                              |    8 +-
 net/core/kmap_skb.h                       |    4 -
 net/rds/ib_recv.c                         |   12 +--
 net/rds/info.c                            |    6 -
 net/rds/iw_recv.c                         |    4 -
 net/rds/loop.c                            |    2 
 net/rds/page.c                            |    4 -
 net/rds/tcp_recv.c                        |    4 -
 net/sunrpc/auth_gss/gss_krb5_wrap.c       |    4 -
 net/sunrpc/socklib.c                      |    4 -
 net/sunrpc/xdr.c                          |   16 ++---
 net/sunrpc/xprtrdma/rpc_rdma.c            |    4 -
 187 files changed, 904 insertions(+), 904 deletions(-)
arch/arm/include/asm/highmem.h +3 -3
Index: linux-2.6/arch/arm/include/asm/highmem.h
===================================================================
@@ -35,9 +35,9 @@ extern void kunmap_high_l1_vipt(struct p
 #ifdef CONFIG_HIGHMEM
 extern void *kmap(struct page *page);
 extern void kunmap(struct page *page);
-extern void *kmap_atomic(struct page *page, enum km_type type);
-extern void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type);
-extern void *kmap_atomic_pfn(unsigned long pfn, enum km_type type);
+extern void *kmap_atomic(struct page *page);
+extern void kunmap_atomic_notypecheck(void *kvaddr);
+extern void *kmap_atomic_pfn(unsigned long pfn);
 extern struct page *kmap_atomic_to_page(const void *ptr);
 #endif
 
arch/arm/include/asm/pgtable.h +4 -4
Index: linux-2.6/arch/arm/include/asm/pgtable.h
===================================================================
@@ -263,10 +263,10 @@ extern struct page *empty_zero_page;
 #define pte_page(pte)		(pfn_to_page(pte_pfn(pte)))
 #define pte_offset_kernel(dir,addr)	(pmd_page_vaddr(*(dir)) + __pte_index(addr))
 
-#define pte_offset_map(dir,addr)	(__pte_map(dir, KM_PTE0) + __pte_index(addr))
-#define pte_offset_map_nested(dir,addr)	(__pte_map(dir, KM_PTE1) + __pte_index(addr))
-#define pte_unmap(pte)			__pte_unmap(pte, KM_PTE0)
-#define pte_unmap_nested(pte)		__pte_unmap(pte, KM_PTE1)
+#define pte_offset_map(dir,addr)	(__pte_map(dir) + __pte_index(addr))
+#define pte_offset_map_nested(dir,addr)	(__pte_map(dir) + __pte_index(addr))
+#define pte_unmap(pte)			__pte_unmap(pte)
+#define pte_unmap_nested(pte)		__pte_unmap(pte)
 
 #ifndef CONFIG_HIGHPTE
 #define __pte_map(dir,km)	pmd_page_vaddr(*(dir))
arch/arm/mm/copypage-fa.c +6 -6
Index: linux-2.6/arch/arm/mm/copypage-fa.c
===================================================================
@@ -44,11 +44,11 @@ void fa_copy_user_highpage(struct page *
 {
 	void *kto, *kfrom;
 
-	kto = kmap_atomic(to, KM_USER0);
-	kfrom = kmap_atomic(from, KM_USER1);
+	kto = kmap_atomic(to);
+	kfrom = kmap_atomic(from);
 	fa_copy_user_page(kto, kfrom);
-	kunmap_atomic(kfrom, KM_USER1);
-	kunmap_atomic(kto, KM_USER0);
+	kunmap_atomic(kfrom);
+	kunmap_atomic(kto);
 }
 
 /*
@@ -58,7 +58,7 @@ void fa_copy_user_highpage(struct page *
  */
 void fa_clear_user_highpage(struct page *page, unsigned long vaddr)
 {
-	void *ptr, *kaddr = kmap_atomic(page, KM_USER0);
+	void *ptr, *kaddr = kmap_atomic(page);
 	asm volatile("\
 	mov	r1, %2				@ 1\n\
 	mov	r2, #0				@ 1\n\
@@ -77,7 +77,7 @@ void fa_clear_user_highpage(struct page 
 	: "=r" (ptr)
 	: "0" (kaddr), "I" (PAGE_SIZE / 32)
 	: "r1", "r2", "r3", "ip", "lr");
-	kunmap_atomic(kaddr, KM_USER0);
+	kunmap_atomic(kaddr);
 }
 
 struct cpu_user_fns fa_user_fns __initdata = {
arch/arm/mm/copypage-feroceon.c +6 -6
Index: linux-2.6/arch/arm/mm/copypage-feroceon.c
===================================================================
@@ -72,17 +72,17 @@ void feroceon_copy_user_highpage(struct 
 {
 	void *kto, *kfrom;
 
-	kto = kmap_atomic(to, KM_USER0);
-	kfrom = kmap_atomic(from, KM_USER1);
+	kto = kmap_atomic(to);
+	kfrom = kmap_atomic(from);
 	flush_cache_page(vma, vaddr, page_to_pfn(from));
 	feroceon_copy_user_page(kto, kfrom);
-	kunmap_atomic(kfrom, KM_USER1);
-	kunmap_atomic(kto, KM_USER0);
+	kunmap_atomic(kfrom);
+	kunmap_atomic(kto);
 }
 
 void feroceon_clear_user_highpage(struct page *page, unsigned long vaddr)
 {
-	void *ptr, *kaddr = kmap_atomic(page, KM_USER0);
+	void *ptr, *kaddr = kmap_atomic(page);
 	asm volatile ("\
 	mov	r1, %2				\n\
 	mov	r2, #0				\n\
@@ -102,7 +102,7 @@ void feroceon_clear_user_highpage(struct
 	: "=r" (ptr)
 	: "0" (kaddr), "I" (PAGE_SIZE / 32)
 	: "r1", "r2", "r3", "r4", "r5", "r6", "r7", "ip", "lr");
-	kunmap_atomic(kaddr, KM_USER0);
+	kunmap_atomic(kaddr);
 }
 
 struct cpu_user_fns feroceon_user_fns __initdata = {
arch/arm/mm/copypage-v3.c +6 -6
Index: linux-2.6/arch/arm/mm/copypage-v3.c
===================================================================
@@ -42,11 +42,11 @@ void v3_copy_user_highpage(struct page *
 {
 	void *kto, *kfrom;
 
-	kto = kmap_atomic(to, KM_USER0);
-	kfrom = kmap_atomic(from, KM_USER1);
+	kto = kmap_atomic(to);
+	kfrom = kmap_atomic(from);
 	v3_copy_user_page(kto, kfrom);
-	kunmap_atomic(kfrom, KM_USER1);
-	kunmap_atomic(kto, KM_USER0);
+	kunmap_atomic(kfrom);
+	kunmap_atomic(kto);
 }
 
 /*
@@ -56,7 +56,7 @@ void v3_copy_user_highpage(struct page *
  */
 void v3_clear_user_highpage(struct page *page, unsigned long vaddr)
 {
-	void *ptr, *kaddr = kmap_atomic(page, KM_USER0);
+	void *ptr, *kaddr = kmap_atomic(page);
 	asm volatile("\n\
 	mov	r1, %2				@ 1\n\
 	mov	r2, #0				@ 1\n\
@@ -72,7 +72,7 @@ void v3_clear_user_highpage(struct page 
 	: "=r" (ptr)
 	: "0" (kaddr), "I" (PAGE_SIZE / 64)
 	: "r1", "r2", "r3", "ip", "lr");
-	kunmap_atomic(kaddr, KM_USER0);
+	kunmap_atomic(kaddr);
 }
 
 struct cpu_user_fns v3_user_fns __initdata = {
arch/arm/mm/copypage-v4mc.c +4 -4
Index: linux-2.6/arch/arm/mm/copypage-v4mc.c
===================================================================
@@ -71,7 +71,7 @@ mc_copy_user_page(void *from, void *to)
 void v4_mc_copy_user_highpage(struct page *to, struct page *from,
 	unsigned long vaddr, struct vm_area_struct *vma)
 {
-	void *kto = kmap_atomic(to, KM_USER1);
+	void *kto = kmap_atomic(to);
 
 	if (test_and_clear_bit(PG_dcache_dirty, &from->flags))
 		__flush_dcache_page(page_mapping(from), from);
@@ -85,7 +85,7 @@ void v4_mc_copy_user_highpage(struct pag
 
 	spin_unlock(&minicache_lock);
 
-	kunmap_atomic(kto, KM_USER1);
+	kunmap_atomic(kto);
 }
 
 /*
@@ -93,7 +93,7 @@ void v4_mc_copy_user_highpage(struct pag
  */
 void v4_mc_clear_user_highpage(struct page *page, unsigned long vaddr)
 {
-	void *ptr, *kaddr = kmap_atomic(page, KM_USER0);
+	void *ptr, *kaddr = kmap_atomic(page);
 	asm volatile("\
 	mov	r1, %2				@ 1\n\
 	mov	r2, #0				@ 1\n\
@@ -111,7 +111,7 @@ void v4_mc_clear_user_highpage(struct pa
 	: "=r" (ptr)
 	: "0" (kaddr), "I" (PAGE_SIZE / 64)
 	: "r1", "r2", "r3", "ip", "lr");
-	kunmap_atomic(kaddr, KM_USER0);
+	kunmap_atomic(kaddr);
 }
 
 struct cpu_user_fns v4_mc_user_fns __initdata = {
arch/arm/mm/copypage-v4wb.c +6 -6
Index: linux-2.6/arch/arm/mm/copypage-v4wb.c
===================================================================
@@ -52,12 +52,12 @@ void v4wb_copy_user_highpage(struct page
 {
 	void *kto, *kfrom;
 
-	kto = kmap_atomic(to, KM_USER0);
-	kfrom = kmap_atomic(from, KM_USER1);
+	kto = kmap_atomic(to);
+	kfrom = kmap_atomic(from);
 	flush_cache_page(vma, vaddr, page_to_pfn(from));
 	v4wb_copy_user_page(kto, kfrom);
-	kunmap_atomic(kfrom, KM_USER1);
-	kunmap_atomic(kto, KM_USER0);
+	kunmap_atomic(kfrom);
+	kunmap_atomic(kto);
 }
 
 /*
@@ -67,7 +67,7 @@ void v4wb_copy_user_highpage(struct page
  */
 void v4wb_clear_user_highpage(struct page *page, unsigned long vaddr)
 {
-	void *ptr, *kaddr = kmap_atomic(page, KM_USER0);
+	void *ptr, *kaddr = kmap_atomic(page);
 	asm volatile("\
 	mov	r1, %2				@ 1\n\
 	mov	r2, #0				@ 1\n\
@@ -86,7 +86,7 @@ void v4wb_clear_user_highpage(struct pag
 	: "=r" (ptr)
 	: "0" (kaddr), "I" (PAGE_SIZE / 64)
 	: "r1", "r2", "r3", "ip", "lr");
-	kunmap_atomic(kaddr, KM_USER0);
+	kunmap_atomic(kaddr);
 }
 
 struct cpu_user_fns v4wb_user_fns __initdata = {
arch/arm/mm/copypage-v4wt.c +6 -6
Index: linux-2.6/arch/arm/mm/copypage-v4wt.c
===================================================================
@@ -48,11 +48,11 @@ void v4wt_copy_user_highpage(struct page
 {
 	void *kto, *kfrom;
 
-	kto = kmap_atomic(to, KM_USER0);
-	kfrom = kmap_atomic(from, KM_USER1);
+	kto = kmap_atomic(to);
+	kfrom = kmap_atomic(from);
 	v4wt_copy_user_page(kto, kfrom);
-	kunmap_atomic(kfrom, KM_USER1);
-	kunmap_atomic(kto, KM_USER0);
+	kunmap_atomic(kfrom);
+	kunmap_atomic(kto);
 }
 
 /*
@@ -62,7 +62,7 @@ void v4wt_copy_user_highpage(struct page
  */
 void v4wt_clear_user_highpage(struct page *page, unsigned long vaddr)
 {
-	void *ptr, *kaddr = kmap_atomic(page, KM_USER0);
+	void *ptr, *kaddr = kmap_atomic(page);
 	asm volatile("\
 	mov	r1, %2				@ 1\n\
 	mov	r2, #0				@ 1\n\
@@ -79,7 +79,7 @@ void v4wt_clear_user_highpage(struct pag
 	: "=r" (ptr)
 	: "0" (kaddr), "I" (PAGE_SIZE / 64)
 	: "r1", "r2", "r3", "ip", "lr");
-	kunmap_atomic(kaddr, KM_USER0);
+	kunmap_atomic(kaddr);
 }
 
 struct cpu_user_fns v4wt_user_fns __initdata = {
arch/arm/mm/copypage-v6.c +6 -6
Index: linux-2.6/arch/arm/mm/copypage-v6.c
===================================================================
@@ -38,12 +38,12 @@ static void v6_copy_user_highpage_nonali
 {
 	void *kto, *kfrom;
 
-	kfrom = kmap_atomic(from, KM_USER0);
-	kto = kmap_atomic(to, KM_USER1);
+	kfrom = kmap_atomic(from);
+	kto = kmap_atomic(to);
 	copy_page(kto, kfrom);
 	__cpuc_flush_dcache_area(kto, PAGE_SIZE);
-	kunmap_atomic(kto, KM_USER1);
-	kunmap_atomic(kfrom, KM_USER0);
+	kunmap_atomic(kto);
+	kunmap_atomic(kfrom);
 }
 
 /*
@@ -52,9 +52,9 @@ static void v6_copy_user_highpage_nonali
  */
 static void v6_clear_user_highpage_nonaliasing(struct page *page, unsigned long vaddr)
 {
-	void *kaddr = kmap_atomic(page, KM_USER0);
+	void *kaddr = kmap_atomic(page);
 	clear_page(kaddr);
-	kunmap_atomic(kaddr, KM_USER0);
+	kunmap_atomic(kaddr);
 }
 
 /*
arch/arm/mm/copypage-xsc3.c +6 -6
Index: linux-2.6/arch/arm/mm/copypage-xsc3.c
===================================================================
@@ -75,12 +75,12 @@ void xsc3_mc_copy_user_highpage(struct p
 {
 	void *kto, *kfrom;
 
-	kto = kmap_atomic(to, KM_USER0);
-	kfrom = kmap_atomic(from, KM_USER1);
+	kto = kmap_atomic(to);
+	kfrom = kmap_atomic(from);
 	flush_cache_page(vma, vaddr, page_to_pfn(from));
 	xsc3_mc_copy_user_page(kto, kfrom);
-	kunmap_atomic(kfrom, KM_USER1);
-	kunmap_atomic(kto, KM_USER0);
+	kunmap_atomic(kfrom);
+	kunmap_atomic(kto);
 }
 
 /*
@@ -90,7 +90,7 @@ void xsc3_mc_copy_user_highpage(struct p
  */
 void xsc3_mc_clear_user_highpage(struct page *page, unsigned long vaddr)
 {
-	void *ptr, *kaddr = kmap_atomic(page, KM_USER0);
+	void *ptr, *kaddr = kmap_atomic(page);
 	asm volatile ("\
 	mov	r1, %2				\n\
 	mov	r2, #0				\n\
@@ -105,7 +105,7 @@ void xsc3_mc_clear_user_highpage(struct 
 	: "=r" (ptr)
 	: "0" (kaddr), "I" (PAGE_SIZE / 32)
 	: "r1", "r2", "r3");
-	kunmap_atomic(kaddr, KM_USER0);
+	kunmap_atomic(kaddr);
 }
 
 struct cpu_user_fns xsc3_mc_user_fns __initdata = {
arch/arm/mm/copypage-xscale.c +4 -4
Index: linux-2.6/arch/arm/mm/copypage-xscale.c
===================================================================
@@ -93,7 +93,7 @@ mc_copy_user_page(void *from, void *to)
 void xscale_mc_copy_user_highpage(struct page *to, struct page *from,
 	unsigned long vaddr, struct vm_area_struct *vma)
 {
-	void *kto = kmap_atomic(to, KM_USER1);
+	void *kto = kmap_atomic(to);
 
 	if (test_and_clear_bit(PG_dcache_dirty, &from->flags))
 		__flush_dcache_page(page_mapping(from), from);
@@ -107,7 +107,7 @@ void xscale_mc_copy_user_highpage(struct
 
 	spin_unlock(&minicache_lock);
 
-	kunmap_atomic(kto, KM_USER1);
+	kunmap_atomic(kto);
 }
 
 /*
@@ -116,7 +116,7 @@ void xscale_mc_copy_user_highpage(struct
 void
 xscale_mc_clear_user_highpage(struct page *page, unsigned long vaddr)
 {
-	void *ptr, *kaddr = kmap_atomic(page, KM_USER0);
+	void *ptr, *kaddr = kmap_atomic(page);
 	asm volatile(
 	"mov	r1, %2				\n\
 	mov	r2, #0				\n\
@@ -133,7 +133,7 @@ xscale_mc_clear_user_highpage(struct pag
 	: "=r" (ptr)
 	: "0" (kaddr), "I" (PAGE_SIZE / 32)
 	: "r1", "r2", "r3", "ip");
-	kunmap_atomic(kaddr, KM_USER0);
+	kunmap_atomic(kaddr);
 }
 
 struct cpu_user_fns xscale_mc_user_fns __initdata = {
arch/arm/mm/highmem.c +3 -3
Index: linux-2.6/arch/arm/mm/highmem.c
===================================================================
@@ -36,7 +36,7 @@ void kunmap(struct page *page)
 }
 EXPORT_SYMBOL(kunmap);
 
-void *kmap_atomic(struct page *page, enum km_type type)
+void *kmap_atomic(struct page *page)
 {
 	unsigned int idx;
 	unsigned long vaddr;
@@ -84,7 +84,7 @@ void *kmap_atomic(struct page *page, enu
 }
 EXPORT_SYMBOL(kmap_atomic);
 
-void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
+void kunmap_atomic_notypecheck(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
 	unsigned int idx;
@@ -110,7 +110,7 @@ void kunmap_atomic_notypecheck(void *kva
 }
 EXPORT_SYMBOL(kunmap_atomic_notypecheck);
 
-void *kmap_atomic_pfn(unsigned long pfn, enum km_type type)
+void *kmap_atomic_pfn(unsigned long pfn)
 {
 	unsigned int idx;
 	unsigned long vaddr;
arch/frv/include/asm/highmem.h +2 -2
Index: linux-2.6/arch/frv/include/asm/highmem.h
===================================================================
@@ -124,8 +124,8 @@ do {									\
 	asm volatile("tlbpr %0,gr0,#4,#1" : : "r"(vaddr) : "memory");	\
 } while(0)
 
-void *kmap_atomic(struct page *page, enum km_type type);
-void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type);
+void *kmap_atomic(struct page *page);
+void kunmap_atomic_notypecheck(void *kvaddr);
 
 #endif /* !__ASSEMBLY__ */
 
arch/frv/include/asm/pgtable.h +4 -4
Index: linux-2.6/arch/frv/include/asm/pgtable.h
===================================================================
@@ -451,11 +451,11 @@ static inline pte_t pte_modify(pte_t pte
 
 #if defined(CONFIG_HIGHPTE)
 #define pte_offset_map(dir, address) \
-	((pte_t *)kmap_atomic(pmd_page(*(dir)),KM_PTE0) + pte_index(address))
+	((pte_t *)kmap_atomic(pmd_page(*(dir))) + pte_index(address))
 #define pte_offset_map_nested(dir, address) \
-	((pte_t *)kmap_atomic(pmd_page(*(dir)),KM_PTE1) + pte_index(address))
-#define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
-#define pte_unmap_nested(pte) kunmap_atomic((pte), KM_PTE1)
+	((pte_t *)kmap_atomic(pmd_page(*(dir))) + pte_index(address))
+#define pte_unmap(pte) kunmap_atomic(pte)
+#define pte_unmap_nested(pte) kunmap_atomic((pte))
 #else
 #define pte_offset_map(dir, address) \
 	((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address))
arch/frv/mm/highmem.c +2 -2
Index: linux-2.6/arch/frv/mm/highmem.c
===================================================================
@@ -37,7 +37,7 @@ struct page *kmap_atomic_to_page(void *p
 	return virt_to_page(ptr);
 }
 
-void *kmap_atomic(struct page *page, enum km_type type)
+void *kmap_atomic(struct page *page)
 {
 	unsigned long paddr;
 
@@ -65,7 +65,7 @@ void *kmap_atomic(struct page *page, enu
 }
 EXPORT_SYMBOL(kmap_atomic);
 
-void kunmap_atomic(void *kvaddr, enum km_type type)
+void kunmap_atomic(void *kvaddr)
 {
 	type = kmap_atomic_idx_pop();
 	switch (type) {
arch/microblaze/include/asm/pgtable.h +4 -4
Index: linux-2.6/arch/microblaze/include/asm/pgtable.h
===================================================================
@@ -497,12 +497,12 @@ static inline pmd_t *pmd_offset(pgd_t *d
 #define pte_offset_kernel(dir, addr)	\
 	((pte_t *) pmd_page_kernel(*(dir)) + pte_index(addr))
 #define pte_offset_map(dir, addr)		\
-	((pte_t *) kmap_atomic(pmd_page(*(dir)), KM_PTE0) + pte_index(addr))
+	((pte_t *) kmap_atomic(pmd_page(*(dir))) + pte_index(addr))
 #define pte_offset_map_nested(dir, addr)	\
-	((pte_t *) kmap_atomic(pmd_page(*(dir)), KM_PTE1) + pte_index(addr))
+	((pte_t *) kmap_atomic(pmd_page(*(dir))) + pte_index(addr))
 
-#define pte_unmap(pte)		kunmap_atomic(pte, KM_PTE0)
-#define pte_unmap_nested(pte)	kunmap_atomic(pte, KM_PTE1)
+#define pte_unmap(pte)		kunmap_atomic(pte)
+#define pte_unmap_nested(pte)	kunmap_atomic(pte)
 
 /* Encode and decode a nonlinear file mapping entry */
 #define PTE_FILE_MAX_BITS	29
arch/mips/include/asm/highmem.h +3 -3
Index: linux-2.6/arch/mips/include/asm/highmem.h
===================================================================
@@ -47,9 +47,9 @@ extern void kunmap_high(struct page *pag
 
 extern void *__kmap(struct page *page);
 extern void __kunmap(struct page *page);
-extern void *__kmap_atomic(struct page *page, enum km_type type);
-extern void __kunmap_atomic_notypecheck(void *kvaddr, enum km_type type);
-extern void *kmap_atomic_pfn(unsigned long pfn, enum km_type type);
+extern void *__kmap_atomic(struct page *page);
+extern void __kunmap_atomic_notypecheck(void *kvaddr);
+extern void *kmap_atomic_pfn(unsigned long pfn);
 extern struct page *__kmap_atomic_to_page(void *ptr);
 
 #define kmap			__kmap
arch/mips/mm/c-r4k.c +2 -2
Index: linux-2.6/arch/mips/mm/c-r4k.c
===================================================================
@@ -498,7 +498,7 @@ static inline void local_r4k_flush_cache
 		if (map_coherent)
 			vaddr = kmap_coherent(page, addr);
 		else
-			vaddr = kmap_atomic(page, KM_USER0);
+			vaddr = kmap_atomic(page);
 		addr = (unsigned long)vaddr;
 	}
 
@@ -521,7 +521,7 @@ static inline void local_r4k_flush_cache
 		if (map_coherent)
 			kunmap_coherent();
 		else
-			kunmap_atomic(vaddr, KM_USER0);
+			kunmap_atomic(vaddr);
 	}
 }
 
arch/mips/mm/highmem.c +3 -3
Index: linux-2.6/arch/mips/mm/highmem.c
===================================================================
@@ -41,7 +41,7 @@ EXPORT_SYMBOL(__kunmap);
  * kmaps are appropriate for short, tight code paths only.
  */
 
-void *__kmap_atomic(struct page *page, enum km_type type)
+void *__kmap_atomic(struct page *page)
 {
 	enum fixed_addresses idx;
 	unsigned long vaddr;
@@ -64,7 +64,7 @@ void *__kmap_atomic(struct page *page, e
 }
 EXPORT_SYMBOL(__kmap_atomic);
 
-void __kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
+void __kunmap_atomic_notypecheck(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
 	unsigned int idx;
@@ -95,7 +95,7 @@ EXPORT_SYMBOL(__kunmap_atomic);
  * This is the same as kmap_atomic() but can map memory that doesn't
  * have a struct page associated with it.
  */
-void *kmap_atomic_pfn(unsigned long pfn, enum km_type type)
+void *kmap_atomic_pfn(unsigned long pfn)
 {
 	enum fixed_addresses idx;
 	unsigned long vaddr;
arch/mips/mm/init.c +4 -4
Index: linux-2.6/arch/mips/mm/init.c
===================================================================
@@ -209,21 +209,21 @@ void copy_user_highpage(struct page *to,
 {
 	void *vfrom, *vto;
 
-	vto = kmap_atomic(to, KM_USER1);
+	vto = kmap_atomic(to);
 	if (cpu_has_dc_aliases &&
 	    page_mapped(from) && !Page_dcache_dirty(from)) {
 		vfrom = kmap_coherent(from, vaddr);
 		copy_page(vto, vfrom);
 		kunmap_coherent();
 	} else {
-		vfrom = kmap_atomic(from, KM_USER0);
+		vfrom = kmap_atomic(from);
 		copy_page(vto, vfrom);
-		kunmap_atomic(vfrom, KM_USER0);
+		kunmap_atomic(vfrom);
 	}
 	if ((!cpu_has_ic_fills_f_dc) ||
 	    pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK))
 		flush_data_cache_page((unsigned long)vto);
-	kunmap_atomic(vto, KM_USER1);
+	kunmap_atomic(vto);
 	/* Make sure this page is cleared on other CPU's too before using it */
 	smp_wmb();
 }
arch/mn10300/include/asm/highmem.h +2 -2
Index: linux-2.6/arch/mn10300/include/asm/highmem.h
===================================================================
@@ -70,7 +70,7 @@ static inline void kunmap(struct page *p
  * be used in IRQ contexts, so in some (very limited) cases we need
  * it.
  */
-static inline unsigned long kmap_atomic(struct page *page, enum km_type type)
+static inline unsigned long kmap_atomic(struct page *page)
 {
 	enum fixed_addresses idx;
 	unsigned long vaddr;
@@ -92,7 +92,7 @@ static inline unsigned long kmap_atomic(
 	return vaddr;
 }
 
-static inline void kunmap_atomic_notypecheck(unsigned long vaddr, enum km_type type)
+static inline void kunmap_atomic_notypecheck(unsigned long vaddr)
 {
 	if (vaddr < FIXADDR_START) { /* FIXME */
 		pagefault_enable();
arch/powerpc/include/asm/highmem.h +3 -3
Index: linux-2.6/arch/powerpc/include/asm/highmem.h
===================================================================
@@ -60,9 +60,9 @@ extern pte_t *pkmap_page_table;
 
 extern void *kmap_high(struct page *page);
 extern void kunmap_high(struct page *page);
-extern void *kmap_atomic_prot(struct page *page, enum km_type type,
+extern void *kmap_atomic_prot(struct page *page,
 			      pgprot_t prot);
-extern void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type);
+extern void kunmap_atomic_notypecheck(void *kvaddr);
 
 static inline void *kmap(struct page *page)
 {
@@ -80,7 +80,7 @@ static inline void kunmap(struct page *p
 	kunmap_high(page);
 }
 
-static inline void *kmap_atomic(struct page *page, enum km_type type)
+static inline void *kmap_atomic(struct page *page)
 {
 	return kmap_atomic_prot(page, type, kmap_prot);
 }
arch/powerpc/include/asm/pgtable-ppc32.h +4 -4
Index: linux-2.6/arch/powerpc/include/asm/pgtable-ppc32.h
===================================================================
@@ -308,12 +308,12 @@ static inline void __ptep_set_access_fla
 #define pte_offset_kernel(dir, addr)	\
 	((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(addr))
 #define pte_offset_map(dir, addr)		\
-	((pte_t *) kmap_atomic(pmd_page(*(dir)), KM_PTE0) + pte_index(addr))
+	((pte_t *) kmap_atomic(pmd_page(*(dir))) + pte_index(addr))
 #define pte_offset_map_nested(dir, addr)	\
-	((pte_t *) kmap_atomic(pmd_page(*(dir)), KM_PTE1) + pte_index(addr))
+	((pte_t *) kmap_atomic(pmd_page(*(dir))) + pte_index(addr))
 
-#define pte_unmap(pte)		kunmap_atomic(pte, KM_PTE0)
-#define pte_unmap_nested(pte)	kunmap_atomic(pte, KM_PTE1)
+#define pte_unmap(pte)		kunmap_atomic(pte)
+#define pte_unmap_nested(pte)	kunmap_atomic(pte)
 
 /*
  * Encode and decode a swap entry.
arch/powerpc/kvm/book3s.c +2 -2
Index: linux-2.6/arch/powerpc/kvm/book3s.c
===================================================================
@@ -423,14 +423,14 @@ static void kvmppc_patch_dcbz(struct kvm
 	hpage_offset /= 4;
 
 	get_page(hpage);
-	page = kmap_atomic(hpage, KM_USER0);
+	page = kmap_atomic(hpage);
 
 	/* patch dcbz into reserved instruction, so we trap */
 	for (i=hpage_offset; i < hpage_offset + (HW_PAGE_SIZE / 4); i++)
 		if ((page[i] & 0xff0007ff) == INS_DCBZ)
 			page[i] &= 0xfffffff7;
 
-	kunmap_atomic(page, KM_USER0);
+	kunmap_atomic(page);
 	put_page(hpage);
 }
 
arch/powerpc/mm/dma-noncoherent.c +1 -1
Index: linux-2.6/arch/powerpc/mm/dma-noncoherent.c
===================================================================
@@ -369,7 +369,7 @@ static inline void __dma_sync_page_highm
 
 		/* Sync this buffer segment */
 		__dma_sync((void *)start, seg_size, direction);
-		kunmap_atomic((void *)start, KM_PPC_SYNC_PAGE);
+		kunmap_atomic((void *)start);
 		seg_nr++;
 
 		/* Calculate next buffer segment size */
arch/powerpc/mm/highmem.c +2 -2
Index: linux-2.6/arch/powerpc/mm/highmem.c
===================================================================
@@ -29,7 +29,7 @@
  * be used in IRQ contexts, so in some (very limited) cases we need
  * it.
  */
-void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot)
+void *kmap_atomic_prot(struct page *page, pgprot_t prot)
 {
 	unsigned int idx;
 	unsigned long vaddr;
@@ -52,7 +52,7 @@ void *kmap_atomic_prot(struct page *page
 }
 EXPORT_SYMBOL(kmap_atomic_prot);
 
-void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
+void kunmap_atomic_notypecheck(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
 
arch/powerpc/mm/mem.c +2 -2
Index: linux-2.6/arch/powerpc/mm/mem.c
===================================================================
@@ -433,9 +433,9 @@ void flush_dcache_icache_page(struct pag
 #endif
 #ifdef CONFIG_BOOKE
 	{
-		void *start = kmap_atomic(page, KM_PPC_SYNC_ICACHE);
+		void *start = kmap_atomic(page);
 		__flush_dcache_icache(start);
-		kunmap_atomic(start, KM_PPC_SYNC_ICACHE);
+		kunmap_atomic(start);
 	}
 #elif defined(CONFIG_8xx) || defined(CONFIG_PPC64)
 	/* On 8xx there is no need to kmap since highmem is not supported */
arch/s390/crypto/des_s390.c +4 -4
Index: linux-2.6/arch/s390/crypto/des_s390.c
===================================================================
@@ -143,7 +143,7 @@ static int ecb_des_encrypt(struct blkcip
 	struct blkcipher_walk walk;
 
 	blkcipher_walk_init(&walk, dst, src, nbytes);
-	return ecb_desall_crypt(desc, KM_DEA_ENCRYPT, sctx->key, &walk);
+	return ecb_desall_crypt(desc, sctx->key, &walk);
 }
 
 static int ecb_des_decrypt(struct blkcipher_desc *desc,
@@ -154,7 +154,7 @@ static int ecb_des_decrypt(struct blkcip
 	struct blkcipher_walk walk;
 
 	blkcipher_walk_init(&walk, dst, src, nbytes);
-	return ecb_desall_crypt(desc, KM_DEA_DECRYPT, sctx->key, &walk);
+	return ecb_desall_crypt(desc, sctx->key, &walk);
 }
 
 static struct crypto_alg ecb_des_alg = {
@@ -296,7 +296,7 @@ static int ecb_des3_192_encrypt(struct b
 	struct blkcipher_walk walk;
 
 	blkcipher_walk_init(&walk, dst, src, nbytes);
-	return ecb_desall_crypt(desc, KM_TDEA_192_ENCRYPT, sctx->key, &walk);
+	return ecb_desall_crypt(desc, sctx->key, &walk);
 }
 
 static int ecb_des3_192_decrypt(struct blkcipher_desc *desc,
@@ -307,7 +307,7 @@ static int ecb_des3_192_decrypt(struct b
 	struct blkcipher_walk walk;
 
 	blkcipher_walk_init(&walk, dst, src, nbytes);
-	return ecb_desall_crypt(desc, KM_TDEA_192_DECRYPT, sctx->key, &walk);
+	return ecb_desall_crypt(desc, sctx->key, &walk);
 }
 
 static struct crypto_alg ecb_des3_192_alg = {
arch/sh/mm/cache-sh4.c +2 -2
Index: linux-2.6/arch/sh/mm/cache-sh4.c
===================================================================
@@ -244,7 +244,7 @@ static void sh4_flush_cache_page(void *a
 		if (map_coherent)
 			vaddr = kmap_coherent(page, address);
 		else
-			vaddr = kmap_atomic(page, KM_USER0);
+			vaddr = kmap_atomic(page);
 
 		address = (unsigned long)vaddr;
 	}
@@ -259,7 +259,7 @@ static void sh4_flush_cache_page(void *a
 		if (map_coherent)
 			kunmap_coherent(vaddr);
 		else
-			kunmap_atomic(vaddr, KM_USER0);
+			kunmap_atomic(vaddr);
 	}
 }
 
arch/sh/mm/cache.c +6 -6
Index: linux-2.6/arch/sh/mm/cache.c
===================================================================
@@ -95,7 +95,7 @@ void copy_user_highpage(struct page *to,
 {
 	void *vfrom, *vto;
 
-	vto = kmap_atomic(to, KM_USER1);
+	vto = kmap_atomic(to);
 
 	if (boot_cpu_data.dcache.n_aliases && page_mapped(from) &&
 	    !test_bit(PG_dcache_dirty, &from->flags)) {
@@ -103,15 +103,15 @@ void copy_user_highpage(struct page *to,
 		copy_page(vto, vfrom);
 		kunmap_coherent(vfrom);
 	} else {
-		vfrom = kmap_atomic(from, KM_USER0);
+		vfrom = kmap_atomic(from);
 		copy_page(vto, vfrom);
-		kunmap_atomic(vfrom, KM_USER0);
+		kunmap_atomic(vfrom);
 	}
 
 	if (pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK))
 		__flush_purge_region(vto, PAGE_SIZE);
 
-	kunmap_atomic(vto, KM_USER1);
+	kunmap_atomic(vto);
 	/* Make sure this page is cleared on other CPU's too before using it */
 	smp_wmb();
 }
@@ -119,14 +119,14 @@ EXPORT_SYMBOL(copy_user_highpage);
 
 void clear_user_highpage(struct page *page, unsigned long vaddr)
 {
-	void *kaddr = kmap_atomic(page, KM_USER0);
+	void *kaddr = kmap_atomic(page);
 
 	clear_page(kaddr);
 
 	if (pages_do_alias((unsigned long)kaddr, vaddr & PAGE_MASK))
 		__flush_purge_region(kaddr, PAGE_SIZE);
 
-	kunmap_atomic(kaddr, KM_USER0);
+	kunmap_atomic(kaddr);
 }
 EXPORT_SYMBOL(clear_user_highpage);
 
arch/sparc/include/asm/highmem.h +2 -2
Index: linux-2.6/arch/sparc/include/asm/highmem.h
===================================================================
@@ -70,8 +70,8 @@ static inline void kunmap(struct page *p
 	kunmap_high(page);
 }
 
-extern void *kmap_atomic(struct page *page, enum km_type type);
-extern void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type);
+extern void *kmap_atomic(struct page *page);
+extern void kunmap_atomic_notypecheck(void *kvaddr);
 extern struct page *kmap_atomic_to_page(void *vaddr);
 
 #define flush_cache_kmaps()	flush_cache_all()
arch/sparc/mm/highmem.c +2 -2
Index: linux-2.6/arch/sparc/mm/highmem.c
===================================================================
@@ -29,7 +29,7 @@
 #include <asm/tlbflush.h>
 #include <asm/fixmap.h>
 
-void *kmap_atomic(struct page *page, enum km_type type)
+void *kmap_atomic(struct page *page)
 {
 	unsigned long idx;
 	unsigned long vaddr;
@@ -65,7 +65,7 @@ void *kmap_atomic(struct page *page, enu
 }
 EXPORT_SYMBOL(kmap_atomic);
 
-void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
+void kunmap_atomic_notypecheck(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
 
arch/tile/include/asm/highmem.h +5 -5
Index: linux-2.6/arch/tile/include/asm/highmem.h
===================================================================
@@ -60,12 +60,12 @@ void *kmap_fix_kpte(struct page *page, i
 /* This macro is used only in map_new_virtual() to map "page". */
 #define kmap_prot page_to_kpgprot(page)
 
-void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type);
-void *kmap_atomic_pfn(unsigned long pfn, enum km_type type);
-void *kmap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot);
+void kunmap_atomic_notypecheck(void *kvaddr);
+void *kmap_atomic_pfn(unsigned long pfn);
+void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot);
 struct page *kmap_atomic_to_page(void *ptr);
-void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot);
-void *kmap_atomic(struct page *page, enum km_type type);
+void *kmap_atomic_prot(struct page *page, pgprot_t prot);
+void *kmap_atomic(struct page *page);
 void kmap_atomic_fix_kpte(struct page *page, int finished);
 
 #define flush_cache_kmaps()	do { } while (0)
arch/tile/include/asm/pgtable.h +4 -4
Index: linux-2.6/arch/tile/include/asm/pgtable.h
===================================================================
@@ -346,11 +346,11 @@ static inline pte_t pte_modify(pte_t pte
 #if defined(CONFIG_HIGHPTE)
 extern pte_t *_pte_offset_map(pmd_t *, unsigned long address, enum km_type);
 #define pte_offset_map(dir, address) \
-	_pte_offset_map(dir, address, KM_PTE0)
+	_pte_offset_map(dir, address)
 #define pte_offset_map_nested(dir, address) \
-	_pte_offset_map(dir, address, KM_PTE1)
-#define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
-#define pte_unmap_nested(pte) kunmap_atomic(pte, KM_PTE1)
+	_pte_offset_map(dir, address)
+#define pte_unmap(pte) kunmap_atomic(pte)
+#define pte_unmap_nested(pte) kunmap_atomic(pte)
 #else
 #define pte_offset_map(dir, address) pte_offset_kernel(dir, address)
 #define pte_offset_map_nested(dir, address) pte_offset_map(dir, address)
arch/tile/kernel/machine_kexec.c +3 -3
Index: linux-2.6/arch/tile/kernel/machine_kexec.c
===================================================================
@@ -182,13 +182,13 @@ static void kexec_find_and_set_command_l
 
 		if ((entry & IND_SOURCE)) {
 			void *va =
-				kmap_atomic_pfn(entry >> PAGE_SHIFT, KM_USER0);
+				kmap_atomic_pfn(entry >> PAGE_SHIFT);
 			r = kexec_bn2cl(va);
 			if (r) {
 				command_line = r;
 				break;
 			}
-			kunmap_atomic(va, KM_USER0);
+			kunmap_atomic(va);
 		}
 	}
 
@@ -198,7 +198,7 @@ static void kexec_find_and_set_command_l
 
 		hverr = hv_set_command_line(
 			(HV_VirtAddr) command_line, strlen(command_line));
-		kunmap_atomic(command_line, KM_USER0);
+		kunmap_atomic(command_line);
 	} else {
 		pr_info("%s: no command line found; making empty\n",
 		       __func__);
arch/tile/mm/highmem.c +6 -6
Index: linux-2.6/arch/tile/mm/highmem.c
===================================================================
@@ -137,7 +137,7 @@ static DEFINE_PER_CPU(struct kmap_amps, 
  * If we examine it earlier we are exposed to a race where it looks
  * writable earlier, but becomes immutable before we write the PTE.
  */
-static void kmap_atomic_register(struct page *page, enum km_type type,
+static void kmap_atomic_register(struct page *page,
 				 unsigned long va, pte_t *ptep, pte_t pteval)
 {
 	unsigned long flags;
@@ -240,7 +240,7 @@ void kmap_atomic_fix_kpte(struct page *p
  * When holding an atomic kmap is is not legal to sleep, so atomic
  * kmaps are appropriate for short, tight code paths only.
  */
-void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot)
+void *kmap_atomic_prot(struct page *page, pgprot_t prot)
 {
 	enum fixed_addresses idx;
 	unsigned long vaddr;
@@ -269,14 +269,14 @@ void *kmap_atomic_prot(struct page *page
 }
 EXPORT_SYMBOL(kmap_atomic_prot);
 
-void *kmap_atomic(struct page *page, enum km_type type)
+void *kmap_atomic(struct page *page)
 {
 	/* PAGE_NONE is a magic value that tells us to check immutability. */
 	return kmap_atomic_prot(page, type, PAGE_NONE);
 }
 EXPORT_SYMBOL(kmap_atomic);
 
-void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
+void kunmap_atomic_notypecheck(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
 	enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
@@ -306,11 +306,11 @@ EXPORT_SYMBOL(kunmap_atomic_notypecheck)
  * This API is supposed to allow us to map memory without a "struct page".
  * Currently we don't support this, though this may change in the future.
  */
-void *kmap_atomic_pfn(unsigned long pfn, enum km_type type)
+void *kmap_atomic_pfn(unsigned long pfn)
 {
 	return kmap_atomic(pfn_to_page(pfn), type);
 }
-void *kmap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot)
+void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot)
 {
 	return kmap_atomic_prot(pfn_to_page(pfn), type, prot);
 }
arch/tile/mm/pgtable.c +1 -1
Index: linux-2.6/arch/tile/mm/pgtable.c
===================================================================
@@ -134,7 +134,7 @@ void __set_fixmap(enum fixed_addresses i
 }
 
 #if defined(CONFIG_HIGHPTE)
-pte_t *_pte_offset_map(pmd_t *dir, unsigned long address, enum km_type type)
+pte_t *_pte_offset_map(pmd_t *dir, unsigned long address)
 {
 	pte_t *pte = kmap_atomic(pmd_page(*dir), type) +
 		(pmd_ptfn(*dir) << HV_LOG2_PAGE_TABLE_ALIGN) & ~PAGE_MASK;
arch/um/kernel/skas/uaccess.c +2 -2
Index: linux-2.6/arch/um/kernel/skas/uaccess.c
===================================================================
@@ -68,7 +68,7 @@ static int do_op_one_page(unsigned long 
 		return -1;
 
 	page = pte_page(*pte);
-	addr = (unsigned long) kmap_atomic(page, KM_UML_USERCOPY) +
+	addr = (unsigned long) kmap_atomic(page) +
 		(addr & ~PAGE_MASK);
 
 	current->thread.fault_catcher = &buf;
@@ -81,7 +81,7 @@ static int do_op_one_page(unsigned long 
 
 	current->thread.fault_catcher = NULL;
 
-	kunmap_atomic((void *)addr, KM_UML_USERCOPY);
+	kunmap_atomic((void *)addr);
 
 	return n;
 }
arch/x86/include/asm/highmem.h +5 -5
Index: linux-2.6/arch/x86/include/asm/highmem.h
===================================================================
@@ -59,11 +59,11 @@ extern void kunmap_high(struct page *pag
 
 void *kmap(struct page *page);
 void kunmap(struct page *page);
-void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot);
-void *kmap_atomic(struct page *page, enum km_type type);
-void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type);
-void *kmap_atomic_pfn(unsigned long pfn, enum km_type type);
-void *kmap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot);
+void *kmap_atomic_prot(struct page *page, pgprot_t prot);
+void *kmap_atomic(struct page *page);
+void kunmap_atomic_notypecheck(void *kvaddr);
+void *kmap_atomic_pfn(unsigned long pfn);
+void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot);
 struct page *kmap_atomic_to_page(void *ptr);
 
 #define flush_cache_kmaps()	do { } while (0)
arch/x86/include/asm/iomap.h +2 -2
Index: linux-2.6/arch/x86/include/asm/iomap.h
===================================================================
@@ -27,10 +27,10 @@
 #include <asm/tlbflush.h>
 
 void *
-iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot);
+iomap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot);
 
 void
-iounmap_atomic(void *kvaddr, enum km_type type);
+iounmap_atomic(void *kvaddr);
 
 int
 iomap_create_wc(resource_size_t base, unsigned long size, pgprot_t *prot);
arch/x86/include/asm/pgtable_32.h +2 -2
Index: linux-2.6/arch/x86/include/asm/pgtable_32.h
===================================================================
@@ -57,10 +57,10 @@ extern void set_pmd_pfn(unsigned long, u
 	((pte_t *)kmap_atomic(pmd_page(*(dir)), __KM_PTE) +		\
 	 pte_index((address)))
 #define pte_offset_map_nested(dir, address)				\
-	((pte_t *)kmap_atomic(pmd_page(*(dir)), KM_PTE1) +		\
+	((pte_t *)kmap_atomic(pmd_page(*(dir))) +		\
 	 pte_index((address)))
 #define pte_unmap(pte) kunmap_atomic((pte), __KM_PTE)
-#define pte_unmap_nested(pte) kunmap_atomic((pte), KM_PTE1)
+#define pte_unmap_nested(pte) kunmap_atomic((pte))
 #else
 #define pte_offset_map(dir, address)					\
 	((pte_t *)page_address(pmd_page(*(dir))) + pte_index((address)))
arch/x86/kernel/crash_dump_32.c +4 -4
Index: linux-2.6/arch/x86/kernel/crash_dump_32.c
===================================================================
@@ -61,20 +61,20 @@ ssize_t copy_oldmem_page(unsigned long p
 	if (!is_crashed_pfn_valid(pfn))
 		return -EFAULT;
 
-	vaddr = kmap_atomic_pfn(pfn, KM_PTE0);
+	vaddr = kmap_atomic_pfn(pfn);
 
 	if (!userbuf) {
 		memcpy(buf, (vaddr + offset), csize);
-		kunmap_atomic(vaddr, KM_PTE0);
+		kunmap_atomic(vaddr);
 	} else {
 		if (!kdump_buf_page) {
 			printk(KERN_WARNING "Kdump: Kdump buffer page not"
 				" allocated\n");
-			kunmap_atomic(vaddr, KM_PTE0);
+			kunmap_atomic(vaddr);
 			return -EFAULT;
 		}
 		copy_page(kdump_buf_page, vaddr);
-		kunmap_atomic(vaddr, KM_PTE0);
+		kunmap_atomic(vaddr);
 		if (copy_to_user(buf, (kdump_buf_page + offset), csize))
 			return -EFAULT;
 	}
arch/x86/kvm/lapic.c +4 -4
Index: linux-2.6/arch/x86/kvm/lapic.c
===================================================================
@@ -1175,9 +1175,9 @@ void kvm_lapic_sync_from_vapic(struct kv
 	if (!irqchip_in_kernel(vcpu->kvm) || !vcpu->arch.apic->vapic_addr)
 		return;
 
-	vapic = kmap_atomic(vcpu->arch.apic->vapic_page, KM_USER0);
+	vapic = kmap_atomic(vcpu->arch.apic->vapic_page);
 	data = *(u32 *)(vapic + offset_in_page(vcpu->arch.apic->vapic_addr));
-	kunmap_atomic(vapic, KM_USER0);
+	kunmap_atomic(vapic);
 
 	apic_set_tpr(vcpu->arch.apic, data & 0xff);
 }
@@ -1202,9 +1202,9 @@ void kvm_lapic_sync_to_vapic(struct kvm_
 		max_isr = 0;
 	data = (tpr & 0xff) | ((max_isr & 0xf0) << 8) | (max_irr << 24);
 
-	vapic = kmap_atomic(vcpu->arch.apic->vapic_page, KM_USER0);
+	vapic = kmap_atomic(vcpu->arch.apic->vapic_page);
 	*(u32 *)(vapic + offset_in_page(vcpu->arch.apic->vapic_addr)) = data;
-	kunmap_atomic(vapic, KM_USER0);
+	kunmap_atomic(vapic);
 }
 
 void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr)
arch/x86/kvm/paging_tmpl.h +2 -2
Index: linux-2.6/arch/x86/kvm/paging_tmpl.h
===================================================================
@@ -89,9 +89,9 @@ static bool FNAME(cmpxchg_gpte)(struct k
 
 	page = gfn_to_page(kvm, table_gfn);
 
-	table = kmap_atomic(page, KM_USER0);
+	table = kmap_atomic(page);
 	ret = CMPXCHG(&table[index], orig_pte, new_pte);
-	kunmap_atomic(table, KM_USER0);
+	kunmap_atomic(table);
 
 	kvm_release_page_dirty(page);
 
arch/x86/kvm/x86.c +4 -4
Index: linux-2.6/arch/x86/kvm/x86.c
===================================================================
@@ -934,12 +934,12 @@ static void kvm_write_guest_time(struct 
 	 */
 	vcpu->hv_clock.version += 2;
 
-	shared_kaddr = kmap_atomic(vcpu->time_page, KM_USER0);
+	shared_kaddr = kmap_atomic(vcpu->time_page);
 
 	memcpy(shared_kaddr + vcpu->time_offset, &vcpu->hv_clock,
 	       sizeof(vcpu->hv_clock));
 
-	kunmap_atomic(shared_kaddr, KM_USER0);
+	kunmap_atomic(shared_kaddr);
 
 	mark_page_dirty(v->kvm, vcpu->time >> PAGE_SHIFT);
 }
@@ -3567,7 +3567,7 @@ static int emulator_cmpxchg_emulated(uns
 		goto emul_write;
 	}
 
-	kaddr = kmap_atomic(page, KM_USER0);
+	kaddr = kmap_atomic(page);
 	kaddr += offset_in_page(gpa);
 	switch (bytes) {
 	case 1:
@@ -3585,7 +3585,7 @@ static int emulator_cmpxchg_emulated(uns
 	default:
 		BUG();
 	}
-	kunmap_atomic(kaddr, KM_USER0);
+	kunmap_atomic(kaddr);
 	kvm_release_page_dirty(page);
 
 	if (!exchanged)
arch/x86/lib/usercopy_32.c +2 -2
Index: linux-2.6/arch/x86/lib/usercopy_32.c
===================================================================
@@ -760,9 +760,9 @@ survive:
 				break;
 			}
 
-			maddr = kmap_atomic(pg, KM_USER0);
+			maddr = kmap_atomic(pg);
 			memcpy(maddr + offset, from, len);
-			kunmap_atomic(maddr, KM_USER0);
+			kunmap_atomic(maddr);
 			set_page_dirty_lock(pg);
 			put_page(pg);
 			up_read(&current->mm->mmap_sem);
arch/x86/mm/highmem_32.c +4 -4
Index: linux-2.6/arch/x86/mm/highmem_32.c
===================================================================
@@ -27,7 +27,7 @@ void kunmap(struct page *page)
  * However when holding an atomic kmap it is not legal to sleep, so atomic
  * kmaps are appropriate for short, tight code paths only.
  */
-void *kmap_atomic_prot(struct page *page, enum km_type type, pgprot_t prot)
+void *kmap_atomic_prot(struct page *page, pgprot_t prot)
 {
 	enum fixed_addresses idx;
 	unsigned long vaddr;
@@ -47,12 +47,12 @@ void *kmap_atomic_prot(struct page *page
 	return (void *)vaddr;
 }
 
-void *kmap_atomic(struct page *page, enum km_type type)
+void *kmap_atomic(struct page *page)
 {
 	return kmap_atomic_prot(page, type, kmap_prot);
 }
 
-void kunmap_atomic_notypecheck(void *kvaddr, enum km_type type)
+void kunmap_atomic_notypecheck(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
 	enum fixed_addresses idx;
@@ -89,7 +89,7 @@ void kunmap_atomic_notypecheck(void *kva
  * This is the same as kmap_atomic() but can map memory that doesn't
  * have a struct page associated with it.
  */
-void *kmap_atomic_pfn(unsigned long pfn, enum km_type type)
+void *kmap_atomic_pfn(unsigned long pfn)
 {
 	return kmap_atomic_prot_pfn(pfn, type, kmap_prot);
 }
arch/x86/mm/iomap_32.c +3 -3
Index: linux-2.6/arch/x86/mm/iomap_32.c
===================================================================
@@ -55,7 +55,7 @@ iomap_free(resource_size_t base, unsigne
 }
 EXPORT_SYMBOL_GPL(iomap_free);
 
-void *kmap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot)
+void *kmap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot)
 {
 	enum fixed_addresses idx;
 	unsigned long vaddr;
@@ -75,7 +75,7 @@ void *kmap_atomic_prot_pfn(unsigned long
  * Map 'pfn' using fixed map 'type' and protections 'prot'
  */
 void *
-iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot)
+iomap_atomic_prot_pfn(unsigned long pfn, pgprot_t prot)
 {
 	/*
 	 * For non-PAT systems, promote PAGE_KERNEL_WC to PAGE_KERNEL_UC_MINUS.
@@ -91,7 +91,7 @@ iomap_atomic_prot_pfn(unsigned long pfn,
 EXPORT_SYMBOL_GPL(iomap_atomic_prot_pfn);
 
 void
-iounmap_atomic(void *kvaddr, enum km_type type)
+iounmap_atomic(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
 	enum fixed_addresses idx;
crypto/async_tx/async_memcpy.c +4 -4
Index: linux-2.6/crypto/async_tx/async_memcpy.c
===================================================================
@@ -78,13 +78,13 @@ async_memcpy(struct page *dest, struct p
 		/* wait for any prerequisite operations */
 		async_tx_quiesce(&submit->depend_tx);
 
-		dest_buf = kmap_atomic(dest, KM_USER0) + dest_offset;
-		src_buf = kmap_atomic(src, KM_USER1) + src_offset;
+		dest_buf = kmap_atomic(dest) + dest_offset;
+		src_buf = kmap_atomic(src) + src_offset;
 
 		memcpy(dest_buf, src_buf, len);
 
-		kunmap_atomic(src_buf, KM_USER1);
-		kunmap_atomic(dest_buf, KM_USER0);
+		kunmap_atomic(src_buf);
+		kunmap_atomic(dest_buf);
 
 		async_tx_sync_epilog(submit);
 	}
drivers/ata/libata-sff.c +4 -4
Index: linux-2.6/drivers/ata/libata-sff.c
===================================================================
@@ -716,13 +716,13 @@ static void ata_pio_sector(struct ata_qu
 
 		/* FIXME: use a bounce buffer */
 		local_irq_save(flags);
-		buf = kmap_atomic(page, KM_IRQ0);
+		buf = kmap_atomic(page);
 
 		/* do the actual data transfer */
 		ap->ops->sff_data_xfer(qc->dev, buf + offset, qc->sect_size,
 				       do_write);
 
-		kunmap_atomic(buf, KM_IRQ0);
+		kunmap_atomic(buf);
 		local_irq_restore(flags);
 	} else {
 		buf = page_address(page);
@@ -861,13 +861,13 @@ next_sg:
 
 		/* FIXME: use bounce buffer */
 		local_irq_save(flags);
-		buf = kmap_atomic(page, KM_IRQ0);
+		buf = kmap_atomic(page);
 
 		/* do the actual data transfer */
 		consumed = ap->ops->sff_data_xfer(dev,  buf + offset,
 								count, rw);
 
-		kunmap_atomic(buf, KM_IRQ0);
+		kunmap_atomic(buf);
 		local_irq_restore(flags);
 	} else {
 		buf = page_address(page);
drivers/block/brd.c +10 -10
Index: linux-2.6/drivers/block/brd.c
===================================================================
@@ -245,9 +245,9 @@ static void copy_to_brd(struct brd_devic
 	page = brd_lookup_page(brd, sector);
 	BUG_ON(!page);
 
-	dst = kmap_atomic(page, KM_USER1);
+	dst = kmap_atomic(page);
 	memcpy(dst + offset, src, copy);
-	kunmap_atomic(dst, KM_USER1);
+	kunmap_atomic(dst);
 
 	if (copy < n) {
 		src += copy;
@@ -256,9 +256,9 @@ static void copy_to_brd(struct brd_devic
 		page = brd_lookup_page(brd, sector);
 		BUG_ON(!page);
 
-		dst = kmap_atomic(page, KM_USER1);
+		dst = kmap_atomic(page);
 		memcpy(dst, src, copy);
-		kunmap_atomic(dst, KM_USER1);
+		kunmap_atomic(dst);
 	}
 }
 
@@ -276,9 +276,9 @@ static void copy_from_brd(void *dst, str
 	copy = min_t(size_t, n, PAGE_SIZE - offset);
 	page = brd_lookup_page(brd, sector);
 	if (page) {
-		src = kmap_atomic(page, KM_USER1);
+		src = kmap_atomic(page);
 		memcpy(dst, src + offset, copy);
-		kunmap_atomic(src, KM_USER1);
+		kunmap_atomic(src);
 	} else
 		memset(dst, 0, copy);
 
@@ -288,9 +288,9 @@ static void copy_from_brd(void *dst, str
 		copy = n - copy;
 		page = brd_lookup_page(brd, sector);
 		if (page) {
-			src = kmap_atomic(page, KM_USER1);
+			src = kmap_atomic(page);
 			memcpy(dst, src, copy);
-			kunmap_atomic(src, KM_USER1);
+			kunmap_atomic(src);
 		} else
 			memset(dst, 0, copy);
 	}
@@ -312,7 +312,7 @@ static int brd_do_bvec(struct brd_device
 			goto out;
 	}
 
-	mem = kmap_atomic(page, KM_USER0);
+	mem = kmap_atomic(page);
 	if (rw == READ) {
 		copy_from_brd(mem + off, brd, sector, len);
 		flush_dcache_page(page);
@@ -320,7 +320,7 @@ static int brd_do_bvec(struct brd_device
 		flush_dcache_page(page);
 		copy_to_brd(brd, mem + off, sector, len);
 	}
-	kunmap_atomic(mem, KM_USER0);
+	kunmap_atomic(mem);
 
 out:
 	return err;
drivers/block/drbd/drbd_bitmap.c +15 -15
Index: linux-2.6/drivers/block/drbd/drbd_bitmap.c
===================================================================
@@ -170,7 +170,7 @@ static unsigned long *__bm_map_paddr(str
 
 static unsigned long * bm_map_paddr(struct drbd_bitmap *b, unsigned long offset)
 {
-	return __bm_map_paddr(b, offset, KM_IRQ1);
+	return __bm_map_paddr(b, offset);
 }
 
 static void __bm_unmap(unsigned long *p_addr, const enum km_type km)
@@ -180,7 +180,7 @@ static void __bm_unmap(unsigned long *p_
 
 static void bm_unmap(unsigned long *p_addr)
 {
-	return __bm_unmap(p_addr, KM_IRQ1);
+	return __bm_unmap(p_addr);
 }
 
 /* long word offset of _bitmap_ sector */
@@ -379,7 +379,7 @@ static unsigned long __bm_count_bits(str
 
 	while (offset < b->bm_words) {
 		i = do_now = min_t(size_t, b->bm_words-offset, LWPP);
-		p_addr = __bm_map_paddr(b, offset, KM_USER0);
+		p_addr = __bm_map_paddr(b, offset);
 		bm = p_addr + MLPP(offset);
 		while (i--) {
 #ifndef __LITTLE_ENDIAN
@@ -388,7 +388,7 @@ static unsigned long __bm_count_bits(str
 #endif
 			bits += hweight_long(*bm++);
 		}
-		__bm_unmap(p_addr, KM_USER0);
+		__bm_unmap(p_addr);
 		offset += do_now;
 		cond_resched();
 	}
@@ -799,10 +799,10 @@ static void bm_cpu_to_lel(struct drbd_bi
 		i = 0;
 	}
 	for (; i < b->bm_number_of_pages; i++) {
-		p_addr = kmap_atomic(b->bm_pages[i], KM_USER0);
+		p_addr = kmap_atomic(b->bm_pages[i]);
 		for (bm = p_addr; bm < p_addr + PAGE_SIZE/sizeof(long); bm++)
 			*bm = cpu_to_lel(*bm);
-		kunmap_atomic(p_addr, KM_USER0);
+		kunmap_atomic(p_addr);
 	}
 }
 # endif
@@ -983,7 +983,7 @@ static unsigned long bm_find_next(struct
 	if (bm_is_locked(b))
 		bm_print_lock_info(mdev);
 
-	i = __bm_find_next(mdev, bm_fo, find_zero_bit, KM_IRQ1);
+	i = __bm_find_next(mdev, bm_fo, find_zero_bit);
 
 	spin_unlock_irq(&b->bm_lock);
 	return i;
@@ -1007,13 +1007,13 @@ unsigned long drbd_bm_find_next_zero(str
 unsigned long _drbd_bm_find_next(struct drbd_conf *mdev, unsigned long bm_fo)
 {
 	/* WARN_ON(!bm_is_locked(mdev)); */
-	return __bm_find_next(mdev, bm_fo, 0, KM_USER1);
+	return __bm_find_next(mdev, bm_fo, 0);
 }
 
 unsigned long _drbd_bm_find_next_zero(struct drbd_conf *mdev, unsigned long bm_fo)
 {
 	/* WARN_ON(!bm_is_locked(mdev)); */
-	return __bm_find_next(mdev, bm_fo, 1, KM_USER1);
+	return __bm_find_next(mdev, bm_fo, 1);
 }
 
 /* returns number of bits actually changed.
@@ -1074,7 +1074,7 @@ static int bm_change_bits_to(struct drbd
 	if (bm_is_locked(b))
 		bm_print_lock_info(mdev);
 
-	c = __bm_change_bits_to(mdev, s, e, val, KM_IRQ1);
+	c = __bm_change_bits_to(mdev, s, e, val);
 
 	spin_unlock_irqrestore(&b->bm_lock, flags);
 	return c;
@@ -1099,13 +1099,13 @@ static inline void bm_set_full_words_wit
 {
 	int i;
 	int bits;
-	unsigned long *paddr = kmap_atomic(b->bm_pages[page_nr], KM_USER0);
+	unsigned long *paddr = kmap_atomic(b->bm_pages[page_nr]);
 	for (i = first_word; i < last_word; i++) {
 		bits = hweight_long(paddr[i]);
 		paddr[i] = ~0UL;
 		b->bm_set += BITS_PER_LONG - bits;
 	}
-	kunmap_atomic(paddr, KM_USER0);
+	kunmap_atomic(paddr);
 }
 
 /* Same thing as drbd_bm_set_bits, but without taking the spin_lock_irqsave.
@@ -1132,7 +1132,7 @@ void _drbd_bm_set_bits(struct drbd_conf 
 
 	if (e - s <= 3*BITS_PER_LONG) {
 		/* don't bother; el and sl may even be wrong. */
-		__bm_change_bits_to(mdev, s, e, 1, KM_USER0);
+		__bm_change_bits_to(mdev, s, e, 1);
 		return;
 	}
 
@@ -1140,7 +1140,7 @@ void _drbd_bm_set_bits(struct drbd_conf 
 
 	/* bits filling the current long */
 	if (sl)
-		__bm_change_bits_to(mdev, s, sl-1, 1, KM_USER0);
+		__bm_change_bits_to(mdev, s, sl-1, 1);
 
 	first_page = sl >> (3 + PAGE_SHIFT);
 	last_page = el >> (3 + PAGE_SHIFT);
@@ -1167,7 +1167,7 @@ void _drbd_bm_set_bits(struct drbd_conf 
 	 * it would trigger an assert in __bm_change_bits_to()
 	 */
 	if (el <= e)
-		__bm_change_bits_to(mdev, el, e, 1, KM_USER0);
+		__bm_change_bits_to(mdev, el, e, 1);
 }
 
 /* returns bit state
drivers/block/drbd/drbd_nl.c +2 -2
Index: linux-2.6/drivers/block/drbd/drbd_nl.c
===================================================================
@@ -2256,10 +2256,10 @@ void drbd_bcast_ee(struct drbd_conf *mde
 	len = e->size;
 	page = e->pages;
 	page_chain_for_each(page) {
-		void *d = kmap_atomic(page, KM_USER0);
+		void *d = kmap_atomic(page);
 		unsigned l = min_t(unsigned, len, PAGE_SIZE);
 		memcpy(tl, d, l);
-		kunmap_atomic(d, KM_USER0);
+		kunmap_atomic(d);
 		tl = (unsigned short*)((char*)tl + l);
 		len -= l;
 	}
drivers/block/loop.c +8 -8
Index: linux-2.6/drivers/block/loop.c
===================================================================
@@ -91,16 +91,16 @@ static int transfer_none(struct loop_dev
 			 struct page *loop_page, unsigned loop_off,
 			 int size, sector_t real_block)
 {
-	char *raw_buf = kmap_atomic(raw_page, KM_USER0) + raw_off;
-	char *loop_buf = kmap_atomic(loop_page, KM_USER1) + loop_off;
+	char *raw_buf = kmap_atomic(raw_page) + raw_off;
+	char *loop_buf = kmap_atomic(loop_page) + loop_off;
 
 	if (cmd == READ)
 		memcpy(loop_buf, raw_buf, size);
 	else
 		memcpy(raw_buf, loop_buf, size);
 
-	kunmap_atomic(loop_buf, KM_USER1);
-	kunmap_atomic(raw_buf, KM_USER0);
+	kunmap_atomic(loop_buf);
+	kunmap_atomic(raw_buf);
 	cond_resched();
 	return 0;
 }
@@ -110,8 +110,8 @@ static int transfer_xor(struct loop_devi
 			struct page *loop_page, unsigned loop_off,
 			int size, sector_t real_block)
 {
-	char *raw_buf = kmap_atomic(raw_page, KM_USER0) + raw_off;
-	char *loop_buf = kmap_atomic(loop_page, KM_USER1) + loop_off;
+	char *raw_buf = kmap_atomic(raw_page) + raw_off;
+	char *loop_buf = kmap_atomic(loop_page) + loop_off;
 	char *in, *out, *key;
 	int i, keysize;
 
@@ -128,8 +128,8 @@ static int transfer_xor(struct loop_devi
 	for (i = 0; i < size; i++)
 		*out++ = *in++ ^ key[(i & 511) % keysize];
 
-	kunmap_atomic(loop_buf, KM_USER1);
-	kunmap_atomic(raw_buf, KM_USER0);
+	kunmap_atomic(loop_buf);
+	kunmap_atomic(raw_buf);
 	cond_resched();
 	return 0;
 }
drivers/block/pktcdvd.c +4 -4
Index: linux-2.6/drivers/block/pktcdvd.c
===================================================================
@@ -988,14 +988,14 @@ static void pkt_copy_bio_data(struct bio
 
 	while (copy_size > 0) {
 		struct bio_vec *src_bvl = bio_iovec_idx(src_bio, seg);
-		void *vfrom = kmap_atomic(src_bvl->bv_page, KM_USER0) +
+		void *vfrom = kmap_atomic(src_bvl->bv_page) +
 			src_bvl->bv_offset + offs;
 		void *vto = page_address(dst_page) + dst_offs;
 		int len = min_t(int, copy_size, src_bvl->bv_len - offs);
 
 		BUG_ON(len < 0);
 		memcpy(vto, vfrom, len);
-		kunmap_atomic(vfrom, KM_USER0);
+		kunmap_atomic(vfrom);
 
 		seg++;
 		offs = 0;
@@ -1020,10 +1020,10 @@ static void pkt_make_local_copy(struct p
 	offs = 0;
 	for (f = 0; f < pkt->frames; f++) {
 		if (bvec[f].bv_page != pkt->pages[p]) {
-			void *vfrom = kmap_atomic(bvec[f].bv_page, KM_USER0) + bvec[f].bv_offset;
+			void *vfrom = kmap_atomic(bvec[f].bv_page) + bvec[f].bv_offset;
 			void *vto = page_address(pkt->pages[p]) + offs;
 			memcpy(vto, vfrom, CD_FRAMESIZE);
-			kunmap_atomic(vfrom, KM_USER0);
+			kunmap_atomic(vfrom);
 			bvec[f].bv_page = pkt->pages[p];
 			bvec[f].bv_offset = offs;
 		} else {
drivers/crypto/hifn_795x.c +5 -5
Index: linux-2.6/drivers/crypto/hifn_795x.c
===================================================================
@@ -1731,9 +1731,9 @@ static int ablkcipher_get(void *saddr, u
 	while (size) {
 		copy = min(srest, min(dst->length, size));
 
-		daddr = kmap_atomic(sg_page(dst), KM_IRQ0);
+		daddr = kmap_atomic(sg_page(dst));
 		memcpy(daddr + dst->offset + offset, saddr, copy);
-		kunmap_atomic(daddr, KM_IRQ0);
+		kunmap_atomic(daddr);
 
 		nbytes -= copy;
 		size -= copy;
@@ -1793,17 +1793,17 @@ static void hifn_process_ready(struct ab
 				continue;
 			}
 
-			saddr = kmap_atomic(sg_page(t), KM_SOFTIRQ0);
+			saddr = kmap_atomic(sg_page(t));
 
 			err = ablkcipher_get(saddr, &t->length, t->offset,
 					dst, nbytes, &nbytes);
 			if (err < 0) {
-				kunmap_atomic(saddr, KM_SOFTIRQ0);
+				kunmap_atomic(saddr);
 				break;
 			}
 
 			idx += err;
-			kunmap_atomic(saddr, KM_SOFTIRQ0);
+			kunmap_atomic(saddr);
 		}
 
 		hifn_cipher_walk_exit(&rctx->walk);
drivers/edac/edac_mc.c +2 -2
Index: linux-2.6/drivers/edac/edac_mc.c
===================================================================
@@ -612,13 +612,13 @@ static void edac_mc_scrub_block(unsigned
 	if (PageHighMem(pg))
 		local_irq_save(flags);
 
-	virt_addr = kmap_atomic(pg, KM_BOUNCE_READ);
+	virt_addr = kmap_atomic(pg);
 
 	/* Perform architecture specific atomic scrub operation */
 	atomic_scrub(virt_addr + offset, size);
 
 	/* Unmap and complete */
-	kunmap_atomic(virt_addr, KM_BOUNCE_READ);
+	kunmap_atomic(virt_addr);
 
 	if (PageHighMem(pg))
 		local_irq_restore(flags);
drivers/gpu/drm/drm_cache.c +4 -4
Index: linux-2.6/drivers/gpu/drm/drm_cache.c
===================================================================
@@ -40,10 +40,10 @@ drm_clflush_page(struct page *page)
 	if (unlikely(page == NULL))
 		return;
 
-	page_virtual = kmap_atomic(page, KM_USER0);
+	page_virtual = kmap_atomic(page);
 	for (i = 0; i < PAGE_SIZE; i += boot_cpu_data.x86_clflush_size)
 		clflush(page_virtual + i);
-	kunmap_atomic(page_virtual, KM_USER0);
+	kunmap_atomic(page_virtual);
 }
 
 static void drm_cache_flush_clflush(struct page *pages[],
@@ -86,10 +86,10 @@ drm_clflush_pages(struct page *pages[], 
 		if (unlikely(page == NULL))
 			continue;
 
-		page_virtual = kmap_atomic(page, KM_USER0);
+		page_virtual = kmap_atomic(page);
 		flush_dcache_range((unsigned long)page_virtual,
 				   (unsigned long)page_virtual + PAGE_SIZE);
-		kunmap_atomic(page_virtual, KM_USER0);
+		kunmap_atomic(page_virtual);
 	}
 #else
 	printk(KERN_ERR "Architecture has no drm_cache.c support\n");
drivers/gpu/drm/i915/i915_debugfs.c +2 -2
Index: linux-2.6/drivers/gpu/drm/i915/i915_debugfs.c
===================================================================
@@ -270,10 +270,10 @@ static void i915_dump_pages(struct seq_f
 	uint32_t *mem;
 
 	for (page = 0; page < page_count; page++) {
-		mem = kmap_atomic(pages[page], KM_USER0);
+		mem = kmap_atomic(pages[page]);
 		for (i = 0; i < PAGE_SIZE; i += 4)
 			seq_printf(m, "%08x :  %08x\n", i, mem[i / 4]);
-		kunmap_atomic(mem, KM_USER0);
+		kunmap_atomic(mem);
 	}
 }
 
drivers/gpu/drm/i915/i915_gem.c +11 -11
Index: linux-2.6/drivers/gpu/drm/i915/i915_gem.c
===================================================================
@@ -146,11 +146,11 @@ fast_shmem_read(struct page **pages,
 	char __iomem *vaddr;
 	int unwritten;
 
-	vaddr = kmap_atomic(pages[page_base >> PAGE_SHIFT], KM_USER0);
+	vaddr = kmap_atomic(pages[page_base >> PAGE_SHIFT]);
 	if (vaddr == NULL)
 		return -ENOMEM;
 	unwritten = __copy_to_user_inatomic(data, vaddr + page_offset, length);
-	kunmap_atomic(vaddr, KM_USER0);
+	kunmap_atomic(vaddr);
 
 	if (unwritten)
 		return -EFAULT;
@@ -496,10 +496,10 @@ fast_user_write(struct io_mapping *mappi
 	char *vaddr_atomic;
 	unsigned long unwritten;
 
-	vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base, KM_USER0);
+	vaddr_atomic = io_mapping_map_atomic_wc(mapping, page_base);
 	unwritten = __copy_from_user_inatomic_nocache(vaddr_atomic + page_offset,
 						      user_data, length);
-	io_mapping_unmap_atomic(vaddr_atomic, KM_USER0);
+	io_mapping_unmap_atomic(vaddr_atomic);
 	if (unwritten)
 		return -EFAULT;
 	return 0;
@@ -538,11 +538,11 @@ fast_shmem_write(struct page **pages,
 	char __iomem *vaddr;
 	unsigned long unwritten;
 
-	vaddr = kmap_atomic(pages[page_base >> PAGE_SHIFT], KM_USER0);
+	vaddr = kmap_atomic(pages[page_base >> PAGE_SHIFT]);
 	if (vaddr == NULL)
 		return -ENOMEM;
 	unwritten = __copy_from_user_inatomic(vaddr + page_offset, data, length);
-	kunmap_atomic(vaddr, KM_USER0);
+	kunmap_atomic(vaddr);
 
 	if (unwritten)
 		return -EFAULT;
@@ -3499,7 +3499,7 @@ i915_gem_object_pin_and_relocate(struct 
 			  readl(reloc_entry), reloc_val);
 #endif
 		writel(reloc_val, reloc_entry);
-		io_mapping_unmap_atomic(reloc_page, KM_USER0);
+		io_mapping_unmap_atomic(reloc_page);
 
 		/* The updated presumed offset for this entry will be
 		 * copied back out to the user.
@@ -4921,11 +4921,11 @@ void i915_gem_detach_phys_object(struct 
 	page_count = obj->size / PAGE_SIZE;
 
 	for (i = 0; i < page_count; i++) {
-		char *dst = kmap_atomic(obj_priv->pages[i], KM_USER0);
+		char *dst = kmap_atomic(obj_priv->pages[i]);
 		char *src = obj_priv->phys_obj->handle->vaddr + (i * PAGE_SIZE);
 
 		memcpy(dst, src, PAGE_SIZE);
-		kunmap_atomic(dst, KM_USER0);
+		kunmap_atomic(dst);
 	}
 	drm_clflush_pages(obj_priv->pages, page_count);
 	drm_agp_chipset_flush(dev);
@@ -4981,11 +4981,11 @@ i915_gem_attach_phys_object(struct drm_d
 	page_count = obj->size / PAGE_SIZE;
 
 	for (i = 0; i < page_count; i++) {
-		char *src = kmap_atomic(obj_priv->pages[i], KM_USER0);
+		char *src = kmap_atomic(obj_priv->pages[i]);
 		char *dst = obj_priv->phys_obj->handle->vaddr + (i * PAGE_SIZE);
 
 		memcpy(dst, src, PAGE_SIZE);
-		kunmap_atomic(src, KM_USER0);
+		kunmap_atomic(src);
 	}
 
 	i915_gem_object_put_pages(obj);
drivers/gpu/drm/i915/i915_gem_debug.c +5 -5
Index: linux-2.6/drivers/gpu/drm/i915/i915_gem_debug.c
===================================================================
@@ -57,13 +57,13 @@ static void
 i915_gem_dump_page(struct page *page, uint32_t start, uint32_t end,
 		   uint32_t bias, uint32_t mark)
 {
-	uint32_t *mem = kmap_atomic(page, KM_USER0);
+	uint32_t *mem = kmap_atomic(page);
 	int i;
 	for (i = start; i < end; i += 4)
 		DRM_INFO("%08x: %08x%s\n",
 			  (int) (bias + i), mem[i / 4],
 			  (bias + i == mark) ? " ********" : "");
-	kunmap_atomic(mem, KM_USER0);
+	kunmap_atomic(mem);
 	/* give syslog time to catch up */
 	msleep(1);
 }
@@ -157,7 +157,7 @@ i915_gem_object_check_coherency(struct d
 	for (page = 0; page < obj->size / PAGE_SIZE; page++) {
 		int i;
 
-		backing_map = kmap_atomic(obj_priv->pages[page], KM_USER0);
+		backing_map = kmap_atomic(obj_priv->pages[page]);
 
 		if (backing_map == NULL) {
 			DRM_ERROR("failed to map backing page\n");
@@ -181,13 +181,13 @@ i915_gem_object_check_coherency(struct d
 				}
 			}
 		}
-		kunmap_atomic(backing_map, KM_USER0);
+		kunmap_atomic(backing_map);
 		backing_map = NULL;
 	}
 
  out:
 	if (backing_map != NULL)
-		kunmap_atomic(backing_map, KM_USER0);
+		kunmap_atomic(backing_map);
 	iounmap(gtt_mapping);
 
 	/* give syslog time to catch up */
drivers/gpu/drm/i915/i915_irq.c +2 -2
Index: linux-2.6/drivers/gpu/drm/i915/i915_irq.c
===================================================================
@@ -449,9 +449,9 @@ i915_error_object_create(struct drm_devi
 		if (d == NULL)
 			goto unwind;
 		local_irq_save(flags);
-		s = kmap_atomic(src_priv->pages[page], KM_IRQ0);
+		s = kmap_atomic(src_priv->pages[page]);
 		memcpy(d, s, PAGE_SIZE);
-		kunmap_atomic(s, KM_IRQ0);
+		kunmap_atomic(s);
 		local_irq_restore(flags);
 		dst->pages[page] = d;
 	}
drivers/gpu/drm/i915/intel_overlay.c +1 -1
Index: linux-2.6/drivers/gpu/drm/i915/intel_overlay.c
===================================================================
@@ -201,7 +201,7 @@ static struct overlay_registers *intel_o
 static void intel_overlay_unmap_regs_atomic(struct intel_overlay *overlay)
 {
 	if (OVERLAY_NONPHYSICAL(overlay->dev))
-		io_mapping_unmap_atomic(overlay->virt_addr, KM_USER0);
+		io_mapping_unmap_atomic(overlay->virt_addr);
 
 	overlay->virt_addr = NULL;
 
drivers/gpu/drm/nouveau/nouveau_bios.c +4 -4
Index: linux-2.6/drivers/gpu/drm/nouveau/nouveau_bios.c
===================================================================
@@ -2167,11 +2167,11 @@ peek_fb(struct drm_device *dev, struct i
 
 	if (off < pci_resource_len(dev->pdev, 1)) {
 		uint32_t __iomem *p =
-			io_mapping_map_atomic_wc(fb, off & PAGE_MASK, KM_USER0);
+			io_mapping_map_atomic_wc(fb, off & PAGE_MASK);
 
 		val = ioread32(p + (off & ~PAGE_MASK));
 
-		io_mapping_unmap_atomic(p, KM_USER0);
+		io_mapping_unmap_atomic(p);
 	}
 
 	return val;
@@ -2183,12 +2183,12 @@ poke_fb(struct drm_device *dev, struct i
 {
 	if (off < pci_resource_len(dev->pdev, 1)) {
 		uint32_t __iomem *p =
-			io_mapping_map_atomic_wc(fb, off & PAGE_MASK, KM_USER0);
+			io_mapping_map_atomic_wc(fb, off & PAGE_MASK);
 
 		iowrite32(val, p + (off & ~PAGE_MASK));
 		wmb();
 
-		io_mapping_unmap_atomic(p, KM_USER0);
+		io_mapping_unmap_atomic(p);
 	}
 }
 
drivers/gpu/drm/ttm/ttm_bo_util.c +4 -4
Index: linux-2.6/drivers/gpu/drm/ttm/ttm_bo_util.c
===================================================================
@@ -170,7 +170,7 @@ static int ttm_copy_io_ttm_page(struct t
 	src = (void *)((unsigned long)src + (page << PAGE_SHIFT));
 
 #ifdef CONFIG_X86
-	dst = kmap_atomic_prot(d, KM_USER0, prot);
+	dst = kmap_atomic_prot(d, prot);
 #else
 	if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
 		dst = vmap(&d, 1, 0, prot);
@@ -183,7 +183,7 @@ static int ttm_copy_io_ttm_page(struct t
 	memcpy_fromio(dst, src, PAGE_SIZE);
 
 #ifdef CONFIG_X86
-	kunmap_atomic(dst, KM_USER0);
+	kunmap_atomic(dst);
 #else
 	if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
 		vunmap(dst);
@@ -206,7 +206,7 @@ static int ttm_copy_ttm_io_page(struct t
 
 	dst = (void *)((unsigned long)dst + (page << PAGE_SHIFT));
 #ifdef CONFIG_X86
-	src = kmap_atomic_prot(s, KM_USER0, prot);
+	src = kmap_atomic_prot(s, prot);
 #else
 	if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
 		src = vmap(&s, 1, 0, prot);
@@ -219,7 +219,7 @@ static int ttm_copy_ttm_io_page(struct t
 	memcpy_toio(dst, src, PAGE_SIZE);
 
 #ifdef CONFIG_X86
-	kunmap_atomic(src, KM_USER0);
+	kunmap_atomic(src);
 #else
 	if (pgprot_val(prot) != pgprot_val(PAGE_KERNEL))
 		vunmap(src);
drivers/gpu/drm/ttm/ttm_tt.c +8 -8
Index: linux-2.6/drivers/gpu/drm/ttm/ttm_tt.c
===================================================================
@@ -490,11 +490,11 @@ static int ttm_tt_swapin(struct ttm_tt *
 			goto out_err;
 
 		preempt_disable();
-		from_virtual = kmap_atomic(from_page, KM_USER0);
-		to_virtual = kmap_atomic(to_page, KM_USER1);
+		from_virtual = kmap_atomic(from_page);
+		to_virtual = kmap_atomic(to_page);
 		memcpy(to_virtual, from_virtual, PAGE_SIZE);
-		kunmap_atomic(to_virtual, KM_USER1);
-		kunmap_atomic(from_virtual, KM_USER0);
+		kunmap_atomic(to_virtual);
+		kunmap_atomic(from_virtual);
 		preempt_enable();
 		page_cache_release(from_page);
 	}
@@ -559,11 +559,11 @@ int ttm_tt_swapout(struct ttm_tt *ttm, s
 			goto out_err;
 		}
 		preempt_disable();
-		from_virtual = kmap_atomic(from_page, KM_USER0);
-		to_virtual = kmap_atomic(to_page, KM_USER1);
+		from_virtual = kmap_atomic(from_page);
+		to_virtual = kmap_atomic(to_page);
 		memcpy(to_virtual, from_virtual, PAGE_SIZE);
-		kunmap_atomic(to_virtual, KM_USER1);
-		kunmap_atomic(from_virtual, KM_USER0);
+		kunmap_atomic(to_virtual);
+		kunmap_atomic(from_virtual);
 		preempt_enable();
 		set_page_dirty(to_page);
 		mark_page_accessed(to_page);
drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c +3 -3
Index: linux-2.6/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c
===================================================================
@@ -65,10 +65,10 @@ static int vmw_gmr_build_descriptors(str
 
 		if (likely(page_virtual != NULL)) {
 			desc_virtual->ppn = page_to_pfn(page);
-			kunmap_atomic(page_virtual, KM_USER0);
+			kunmap_atomic(page_virtual);
 		}
 
-		page_virtual = kmap_atomic(page, KM_USER0);
+		page_virtual = kmap_atomic(page);
 		desc_virtual = page_virtual - 1;
 		prev_pfn = ~(0UL);
 
@@ -98,7 +98,7 @@ static int vmw_gmr_build_descriptors(str
 	}
 
 	if (likely(page_virtual != NULL))
-		kunmap_atomic(page_virtual, KM_USER0);
+		kunmap_atomic(page_virtual);
 
 	return 0;
 out_err:
drivers/ide/ide-taskfile.c +2 -2
Index: linux-2.6/drivers/ide/ide-taskfile.c
===================================================================
@@ -252,7 +252,7 @@ void ide_pio_bytes(ide_drive_t *drive, s
 		if (page_is_high)
 			local_irq_save(flags);
 
-		buf = kmap_atomic(page, KM_BIO_SRC_IRQ) + offset;
+		buf = kmap_atomic(page) + offset;
 
 		cmd->nleft -= nr_bytes;
 		cmd->cursg_ofs += nr_bytes;
@@ -268,7 +268,7 @@ void ide_pio_bytes(ide_drive_t *drive, s
 		else
 			hwif->tp_ops->input_data(drive, cmd, buf, nr_bytes);
 
-		kunmap_atomic(buf, KM_BIO_SRC_IRQ);
+		kunmap_atomic(buf);
 
 		if (page_is_high)
 			local_irq_restore(flags);
drivers/infiniband/ulp/iser/iser_memory.c +4 -4
Index: linux-2.6/drivers/infiniband/ulp/iser/iser_memory.c
===================================================================
@@ -73,11 +73,11 @@ static int iser_start_rdma_unaligned_sg(
 
 		p = mem;
 		for_each_sg(sgl, sg, data->size, i) {
-			from = kmap_atomic(sg_page(sg), KM_USER0);
+			from = kmap_atomic(sg_page(sg));
 			memcpy(p,
 			       from + sg->offset,
 			       sg->length);
-			kunmap_atomic(from, KM_USER0);
+			kunmap_atomic(from);
 			p += sg->length;
 		}
 	}
@@ -133,11 +133,11 @@ void iser_finalize_rdma_unaligned_sg(str
 
 		p = mem;
 		for_each_sg(sgl, sg, sg_size, i) {
-			to = kmap_atomic(sg_page(sg), KM_SOFTIRQ0);
+			to = kmap_atomic(sg_page(sg));
 			memcpy(to + sg->offset,
 			       p,
 			       sg->length);
-			kunmap_atomic(to, KM_SOFTIRQ0);
+			kunmap_atomic(to);
 			p += sg->length;
 		}
 	}
drivers/md/bitmap.c +18 -18
Index: linux-2.6/drivers/md/bitmap.c
===================================================================
@@ -487,7 +487,7 @@ void bitmap_update_sb(struct bitmap *bit
 		return;
 	}
 	spin_unlock_irqrestore(&bitmap->lock, flags);
-	sb = kmap_atomic(bitmap->sb_page, KM_USER0);
+	sb = kmap_atomic(bitmap->sb_page);
 	sb->events = cpu_to_le64(bitmap->mddev->events);
 	if (bitmap->mddev->events < bitmap->events_cleared) {
 		/* rocking back to read-only */
@@ -497,7 +497,7 @@ void bitmap_update_sb(struct bitmap *bit
 	/* Just in case these have been changed via sysfs: */
 	sb->daemon_sleep = cpu_to_le32(bitmap->mddev->bitmap_info.daemon_sleep/HZ);
 	sb->write_behind = cpu_to_le32(bitmap->mddev->bitmap_info.max_write_behind);
-	kunmap_atomic(sb, KM_USER0);
+	kunmap_atomic(sb);
 	write_page(bitmap, bitmap->sb_page, 1);
 }
 
@@ -508,7 +508,7 @@ void bitmap_print_sb(struct bitmap *bitm
 
 	if (!bitmap || !bitmap->sb_page)
 		return;
-	sb = kmap_atomic(bitmap->sb_page, KM_USER0);
+	sb = kmap_atomic(bitmap->sb_page);
 	printk(KERN_DEBUG "%s: bitmap file superblock:\n", bmname(bitmap));
 	printk(KERN_DEBUG "         magic: %08x\n", le32_to_cpu(sb->magic));
 	printk(KERN_DEBUG "       version: %d\n", le32_to_cpu(sb->version));
@@ -527,7 +527,7 @@ void bitmap_print_sb(struct bitmap *bitm
 	printk(KERN_DEBUG "     sync size: %llu KB\n",
 			(unsigned long long)le64_to_cpu(sb->sync_size)/2);
 	printk(KERN_DEBUG "max write behind: %d\n", le32_to_cpu(sb->write_behind));
-	kunmap_atomic(sb, KM_USER0);
+	kunmap_atomic(sb);
 }
 
 /* read the superblock from the bitmap file and initialize some bitmap fields */
@@ -557,7 +557,7 @@ static int bitmap_read_sb(struct bitmap 
 		return err;
 	}
 
-	sb = kmap_atomic(bitmap->sb_page, KM_USER0);
+	sb = kmap_atomic(bitmap->sb_page);
 
 	chunksize = le32_to_cpu(sb->chunksize);
 	daemon_sleep = le32_to_cpu(sb->daemon_sleep) * HZ;
@@ -618,7 +618,7 @@ success:
 		bitmap->events_cleared = bitmap->mddev->events;
 	err = 0;
 out:
-	kunmap_atomic(sb, KM_USER0);
+	kunmap_atomic(sb);
 	if (err)
 		bitmap_print_sb(bitmap);
 	return err;
@@ -643,7 +643,7 @@ static int bitmap_mask_state(struct bitm
 		return 0;
 	}
 	spin_unlock_irqrestore(&bitmap->lock, flags);
-	sb = kmap_atomic(bitmap->sb_page, KM_USER0);
+	sb = kmap_atomic(bitmap->sb_page);
 	old = le32_to_cpu(sb->state) & bits;
 	switch (op) {
 	case MASK_SET:
@@ -655,7 +655,7 @@ static int bitmap_mask_state(struct bitm
 	default:
 		BUG();
 	}
-	kunmap_atomic(sb, KM_USER0);
+	kunmap_atomic(sb);
 	return old;
 }
 
@@ -846,12 +846,12 @@ static void bitmap_file_set_bit(struct b
 		bit = file_page_offset(bitmap, chunk);
 
 		/* set the bit */
-		kaddr = kmap_atomic(page, KM_USER0);
+		kaddr = kmap_atomic(page);
 		if (bitmap->flags & BITMAP_HOSTENDIAN)
 			set_bit(bit, kaddr);
 		else
 			ext2_set_bit(bit, kaddr);
-		kunmap_atomic(kaddr, KM_USER0);
+		kunmap_atomic(kaddr);
 		PRINTK("set file bit %lu page %lu\n", bit, page->index);
 	}
 	/* record page number so it gets flushed to disk when unplug occurs */
@@ -1030,10 +1030,10 @@ static int bitmap_init_from_disk(struct 
 				 * if bitmap is out of date, dirty the
 				 * whole page and write it out
 				 */
-				paddr = kmap_atomic(page, KM_USER0);
+				paddr = kmap_atomic(page);
 				memset(paddr + offset, 0xff,
 				       PAGE_SIZE - offset);
-				kunmap_atomic(paddr, KM_USER0);
+				kunmap_atomic(paddr);
 				write_page(bitmap, page, 1);
 
 				ret = -EIO;
@@ -1041,12 +1041,12 @@ static int bitmap_init_from_disk(struct 
 					goto err;
 			}
 		}
-		paddr = kmap_atomic(page, KM_USER0);
+		paddr = kmap_atomic(page);
 		if (bitmap->flags & BITMAP_HOSTENDIAN)
 			b = test_bit(bit, paddr);
 		else
 			b = ext2_test_bit(bit, paddr);
-		kunmap_atomic(paddr, KM_USER0);
+		kunmap_atomic(paddr);
 		if (b) {
 			/* if the disk bit is set, set the memory bit */
 			int needed = ((sector_t)(i+1) << (CHUNK_BLOCK_SHIFT(bitmap))
@@ -1187,10 +1187,10 @@ void bitmap_daemon_work(mddev_t *mddev)
 			    bitmap->mddev->bitmap_info.external == 0) {
 				bitmap_super_t *sb;
 				bitmap->need_sync = 0;
-				sb = kmap_atomic(bitmap->sb_page, KM_USER0);
+				sb = kmap_atomic(bitmap->sb_page);
 				sb->events_cleared =
 					cpu_to_le64(bitmap->events_cleared);
-				kunmap_atomic(sb, KM_USER0);
+				kunmap_atomic(sb);
 				write_page(bitmap, bitmap->sb_page, 1);
 			}
 			spin_lock_irqsave(&bitmap->lock, flags);
@@ -1216,14 +1216,14 @@ void bitmap_daemon_work(mddev_t *mddev)
 
 				/* clear the bit */
 				if (page) {
-					paddr = kmap_atomic(page, KM_USER0);
+					paddr = kmap_atomic(page);
 					if (bitmap->flags & BITMAP_HOSTENDIAN)
 						clear_bit(file_page_offset(bitmap, j),
 							  paddr);
 					else
 						ext2_clear_bit(file_page_offset(bitmap, j),
 							       paddr);
-					kunmap_atomic(paddr, KM_USER0);
+					kunmap_atomic(paddr);
 				} else
 					log->type->clear_region(log, j);
 			}
drivers/media/video/ivtv/ivtv-udma.c +2 -2
Index: linux-2.6/drivers/media/video/ivtv/ivtv-udma.c
===================================================================
@@ -57,9 +57,9 @@ int ivtv_udma_fill_sg_list (struct ivtv_
 			if (dma->bouncemap[map_offset] == NULL)
 				return -1;
 			local_irq_save(flags);
-			src = kmap_atomic(dma->map[map_offset], KM_BOUNCE_READ) + offset;
+			src = kmap_atomic(dma->map[map_offset]) + offset;
 			memcpy(page_address(dma->bouncemap[map_offset]) + offset, src, len);
-			kunmap_atomic(src, KM_BOUNCE_READ);
+			kunmap_atomic(src);
 			local_irq_restore(flags);
 			sg_set_page(&dma->SGlist[map_offset], dma->bouncemap[map_offset], len, offset);
 		}
drivers/memstick/host/jmb38x_ms.c +2 -2
Index: linux-2.6/drivers/memstick/host/jmb38x_ms.c
===================================================================
@@ -324,7 +324,7 @@ static int jmb38x_ms_transfer_data(struc
 			p_cnt = min(p_cnt, length);
 
 			local_irq_save(flags);
-			buf = kmap_atomic(pg, KM_BIO_SRC_IRQ) + p_off;
+			buf = kmap_atomic(pg) + p_off;
 		} else {
 			buf = host->req->data + host->block_pos;
 			p_cnt = host->req->data_len - host->block_pos;
@@ -340,7 +340,7 @@ static int jmb38x_ms_transfer_data(struc
 				 : jmb38x_ms_read_reg_data(host, buf, p_cnt);
 
 		if (host->req->long_data) {
-			kunmap_atomic(buf - p_off, KM_BIO_SRC_IRQ);
+			kunmap_atomic(buf - p_off);
 			local_irq_restore(flags);
 		}
 
drivers/memstick/host/tifm_ms.c +2 -2
Index: linux-2.6/drivers/memstick/host/tifm_ms.c
===================================================================
@@ -209,7 +209,7 @@ static unsigned int tifm_ms_transfer_dat
 			p_cnt = min(p_cnt, length);
 
 			local_irq_save(flags);
-			buf = kmap_atomic(pg, KM_BIO_SRC_IRQ) + p_off;
+			buf = kmap_atomic(pg) + p_off;
 		} else {
 			buf = host->req->data + host->block_pos;
 			p_cnt = host->req->data_len - host->block_pos;
@@ -220,7 +220,7 @@ static unsigned int tifm_ms_transfer_dat
 			 : tifm_ms_read_data(host, buf, p_cnt);
 
 		if (host->req->long_data) {
-			kunmap_atomic(buf - p_off, KM_BIO_SRC_IRQ);
+			kunmap_atomic(buf - p_off);
 			local_irq_restore(flags);
 		}
 
drivers/mmc/host/at91_mci.c +4 -4
Index: linux-2.6/drivers/mmc/host/at91_mci.c
===================================================================
@@ -233,7 +233,7 @@ static inline void at91_mci_sg_to_dma(st
 
 		sg = &data->sg[i];
 
-		sgbuffer = kmap_atomic(sg_page(sg), KM_BIO_SRC_IRQ) + sg->offset;
+		sgbuffer = kmap_atomic(sg_page(sg)) + sg->offset;
 		amount = min(size, sg->length);
 		size -= amount;
 
@@ -249,7 +249,7 @@ static inline void at91_mci_sg_to_dma(st
 			dmabuf = (unsigned *)tmpv;
 		}
 
-		kunmap_atomic(sgbuffer, KM_BIO_SRC_IRQ);
+		kunmap_atomic(sgbuffer);
 
 		if (size == 0)
 			break;
@@ -299,7 +299,7 @@ static void at91_mci_post_dma_read(struc
 
 		sg = &data->sg[i];
 
-		sgbuffer = kmap_atomic(sg_page(sg), KM_BIO_SRC_IRQ) + sg->offset;
+		sgbuffer = kmap_atomic(sg_page(sg)) + sg->offset;
 		amount = min(size, sg->length);
 		size -= amount;
 
@@ -315,7 +315,7 @@ static void at91_mci_post_dma_read(struc
 		}
 
 		flush_kernel_dcache_page(sg_page(sg));
-		kunmap_atomic(sgbuffer, KM_BIO_SRC_IRQ);
+		kunmap_atomic(sgbuffer);
 		data->bytes_xfered += amount;
 		if (size == 0)
 			break;
drivers/mmc/host/msm_sdcc.c +1 -1
Index: linux-2.6/drivers/mmc/host/msm_sdcc.c
===================================================================
@@ -644,7 +644,7 @@ msmsdcc_pio_irq(int irq, void *dev_id)
 			len = msmsdcc_pio_write(host, buffer, remain, status);
 
 		/* Unmap the buffer */
-		kunmap_atomic(buffer, KM_BIO_SRC_IRQ);
+		kunmap_atomic(buffer);
 		local_irq_restore(flags);
 
 		host->pio.sg_off += len;
drivers/mmc/host/sdhci.c +2 -2
Index: linux-2.6/drivers/mmc/host/sdhci.c
===================================================================
@@ -380,12 +380,12 @@ static void sdhci_transfer_pio(struct sd
 static char *sdhci_kmap_atomic(struct scatterlist *sg, unsigned long *flags)
 {
 	local_irq_save(*flags);
-	return kmap_atomic(sg_page(sg), KM_BIO_SRC_IRQ) + sg->offset;
+	return kmap_atomic(sg_page(sg)) + sg->offset;
 }
 
 static void sdhci_kunmap_atomic(void *buffer, unsigned long *flags)
 {
-	kunmap_atomic(buffer, KM_BIO_SRC_IRQ);
+	kunmap_atomic(buffer);
 	local_irq_restore(*flags);
 }
 
drivers/mmc/host/tifm_sd.c +8 -8
Index: linux-2.6/drivers/mmc/host/tifm_sd.c
===================================================================
@@ -117,7 +117,7 @@ static void tifm_sd_read_fifo(struct tif
 	unsigned char *buf;
 	unsigned int pos = 0, val;
 
-	buf = kmap_atomic(pg, KM_BIO_DST_IRQ) + off;
+	buf = kmap_atomic(pg) + off;
 	if (host->cmd_flags & DATA_CARRY) {
 		buf[pos++] = host->bounce_buf_data[0];
 		host->cmd_flags &= ~DATA_CARRY;
@@ -133,7 +133,7 @@ static void tifm_sd_read_fifo(struct tif
 		}
 		buf[pos++] = (val >> 8) & 0xff;
 	}
-	kunmap_atomic(buf - off, KM_BIO_DST_IRQ);
+	kunmap_atomic(buf - off);
 }
 
 static void tifm_sd_write_fifo(struct tifm_sd *host, struct page *pg,
@@ -143,7 +143,7 @@ static void tifm_sd_write_fifo(struct ti
 	unsigned char *buf;
 	unsigned int pos = 0, val;
 
-	buf = kmap_atomic(pg, KM_BIO_SRC_IRQ) + off;
+	buf = kmap_atomic(pg) + off;
 	if (host->cmd_flags & DATA_CARRY) {
 		val = host->bounce_buf_data[0] | ((buf[pos++] << 8) & 0xff00);
 		writel(val, sock->addr + SOCK_MMCSD_DATA);
@@ -160,7 +160,7 @@ static void tifm_sd_write_fifo(struct ti
 		val |= (buf[pos++] << 8) & 0xff00;
 		writel(val, sock->addr + SOCK_MMCSD_DATA);
 	}
-	kunmap_atomic(buf - off, KM_BIO_SRC_IRQ);
+	kunmap_atomic(buf - off);
 }
 
 static void tifm_sd_transfer_data(struct tifm_sd *host)
@@ -211,13 +211,13 @@ static void tifm_sd_copy_page(struct pag
 			      struct page *src, unsigned int src_off,
 			      unsigned int count)
 {
-	unsigned char *src_buf = kmap_atomic(src, KM_BIO_SRC_IRQ) + src_off;
-	unsigned char *dst_buf = kmap_atomic(dst, KM_BIO_DST_IRQ) + dst_off;
+	unsigned char *src_buf = kmap_atomic(src) + src_off;
+	unsigned char *dst_buf = kmap_atomic(dst) + dst_off;
 
 	memcpy(dst_buf, src_buf, count);
 
-	kunmap_atomic(dst_buf - dst_off, KM_BIO_DST_IRQ);
-	kunmap_atomic(src_buf - src_off, KM_BIO_SRC_IRQ);
+	kunmap_atomic(dst_buf - dst_off);
+	kunmap_atomic(src_buf - src_off);
 }
 
 static void tifm_sd_bounce_block(struct tifm_sd *host, struct mmc_data *r_data)
drivers/mmc/host/tmio_mmc.h +2 -2
Index: linux-2.6/drivers/mmc/host/tmio_mmc.h
===================================================================
@@ -183,13 +183,13 @@ static inline char *tmio_mmc_kmap_atomic
 	struct scatterlist *sg = host->sg_ptr;
 
 	local_irq_save(*flags);
-	return kmap_atomic(sg_page(sg), KM_BIO_SRC_IRQ) + sg->offset;
+	return kmap_atomic(sg_page(sg)) + sg->offset;
 }
 
 static inline void tmio_mmc_kunmap_atomic(struct tmio_mmc_host *host,
 	unsigned long *flags)
 {
-	kunmap_atomic(sg_page(host->sg_ptr), KM_BIO_SRC_IRQ);
+	kunmap_atomic(sg_page(host->sg_ptr));
 	local_irq_restore(*flags);
 }
 
drivers/net/cassini.c +2 -2
Index: linux-2.6/drivers/net/cassini.c
===================================================================
@@ -103,8 +103,8 @@
 #include <asm/byteorder.h>
 #include <asm/uaccess.h>
 
-#define cas_page_map(x)      kmap_atomic((x), KM_SKB_DATA_SOFTIRQ)
-#define cas_page_unmap(x)    kunmap_atomic((x), KM_SKB_DATA_SOFTIRQ)
+#define cas_page_map(x)      kmap_atomic((x))
+#define cas_page_unmap(x)    kunmap_atomic((x))
 #define CAS_NCPUS            num_online_cpus()
 
 #define cas_skb_release(x)  netif_rx(x)
drivers/net/e1000e/netdev.c +2 -2
Index: linux-2.6/drivers/net/e1000e/netdev.c
===================================================================
@@ -1164,9 +1164,9 @@ static bool e1000_clean_rx_irq_ps(struct
 			 */
 			dma_sync_single_for_cpu(&pdev->dev, ps_page->dma,
 						PAGE_SIZE, DMA_FROM_DEVICE);
-			vaddr = kmap_atomic(ps_page->page, KM_SKB_DATA_SOFTIRQ);
+			vaddr = kmap_atomic(ps_page->page);
 			memcpy(skb_tail_pointer(skb), vaddr, l1);
-			kunmap_atomic(vaddr, KM_SKB_DATA_SOFTIRQ);
+			kunmap_atomic(vaddr);
 			dma_sync_single_for_device(&pdev->dev, ps_page->dma,
 						   PAGE_SIZE, DMA_FROM_DEVICE);
 
drivers/scsi/arcmsr/arcmsr_hba.c +4 -4
Index: linux-2.6/drivers/scsi/arcmsr/arcmsr_hba.c
===================================================================
@@ -1761,7 +1761,7 @@ static int arcmsr_iop_message_xfer(struc
 						(uint32_t ) cmd->cmnd[8];
 						/* 4 bytes: Areca io control code */
 	sg = scsi_sglist(cmd);
-	buffer = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
+	buffer = kmap_atomic(sg_page(sg)) + sg->offset;
 	if (scsi_sg_count(cmd) > 1) {
 		retvalue = ARCMSR_MESSAGE_FAIL;
 		goto message_out;
@@ -2010,7 +2010,7 @@ static int arcmsr_iop_message_xfer(struc
 	}
 	message_out:
 	sg = scsi_sglist(cmd);
-	kunmap_atomic(buffer - sg->offset, KM_IRQ0);
+	kunmap_atomic(buffer - sg->offset);
 	return retvalue;
 }
 
@@ -2060,11 +2060,11 @@ static void arcmsr_handle_virtual_comman
 		strncpy(&inqdata[32], "R001", 4); /* Product Revision */
 
 		sg = scsi_sglist(cmd);
-		buffer = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
+		buffer = kmap_atomic(sg_page(sg)) + sg->offset;
 
 		memcpy(buffer, inqdata, sizeof(inqdata));
 		sg = scsi_sglist(cmd);
-		kunmap_atomic(buffer - sg->offset, KM_IRQ0);
+		kunmap_atomic(buffer - sg->offset);
 
 		cmd->scsi_done(cmd);
 	}
drivers/scsi/cxgb3i/cxgb3i_pdu.c +1 -1
Index: linux-2.6/drivers/scsi/cxgb3i/cxgb3i_pdu.c
===================================================================
@@ -325,7 +325,7 @@ int cxgb3i_conn_init_pdu(struct iscsi_ta
 
 				memcpy(dst, src+frag->page_offset, frag->size);
 				dst += frag->size;
-				kunmap_atomic(src, KM_SOFTIRQ0);
+				kunmap_atomic(src);
 			}
 			if (padlen) {
 				memset(dst, 0, padlen);
drivers/scsi/fcoe/fcoe.c +3 -3
Index: linux-2.6/drivers/scsi/fcoe/fcoe.c
===================================================================
@@ -1459,7 +1459,7 @@ u32 fcoe_fc_crc(struct fc_frame *fp)
 			data = kmap_atomic(frag->page + (off >> PAGE_SHIFT),
 					   KM_SKB_DATA_SOFTIRQ);
 			crc = crc32(crc, data + (off & ~PAGE_MASK), clen);
-			kunmap_atomic(data, KM_SKB_DATA_SOFTIRQ);
+			kunmap_atomic(data);
 			off += clen;
 			len -= clen;
 		}
@@ -1533,7 +1533,7 @@ int fcoe_xmit(struct fc_lport *lport, st
 			return -ENOMEM;
 		}
 		frag = &skb_shinfo(skb)->frags[skb_shinfo(skb)->nr_frags - 1];
-		cp = kmap_atomic(frag->page, KM_SKB_DATA_SOFTIRQ)
+		cp = kmap_atomic(frag->page)
 			+ frag->page_offset;
 	} else {
 		cp = (struct fcoe_crc_eof *)skb_put(skb, tlen);
@@ -1544,7 +1544,7 @@ int fcoe_xmit(struct fc_lport *lport, st
 	cp->fcoe_crc32 = cpu_to_le32(~crc);
 
 	if (skb_is_nonlinear(skb)) {
-		kunmap_atomic(cp, KM_SKB_DATA_SOFTIRQ);
+		kunmap_atomic(cp);
 		cp = NULL;
 	}
 
drivers/scsi/gdth.c +2 -2
Index: linux-2.6/drivers/scsi/gdth.c
===================================================================
@@ -2308,10 +2308,10 @@ static void gdth_copy_internal_data(gdth
                 return;
             }
             local_irq_save(flags);
-            address = kmap_atomic(sg_page(sl), KM_BIO_SRC_IRQ) + sl->offset;
+            address = kmap_atomic(sg_page(sl)) + sl->offset;
             memcpy(address, buffer, cpnow);
             flush_dcache_page(sg_page(sl));
-            kunmap_atomic(address, KM_BIO_SRC_IRQ);
+            kunmap_atomic(address);
             local_irq_restore(flags);
             if (cpsum == cpcount)
                 break;
drivers/scsi/ips.c +3 -3
Index: linux-2.6/drivers/scsi/ips.c
===================================================================
@@ -1509,14 +1509,14 @@ static int ips_is_passthru(struct scsi_c
                 /* kmap_atomic() ensures addressability of the user buffer.*/
                 /* local_irq_save() protects the KM_IRQ0 address slot.     */
                 local_irq_save(flags);
-                buffer = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
+                buffer = kmap_atomic(sg_page(sg)) + sg->offset;
                 if (buffer && buffer[0] == 'C' && buffer[1] == 'O' &&
                     buffer[2] == 'P' && buffer[3] == 'P') {
-                        kunmap_atomic(buffer - sg->offset, KM_IRQ0);
+                        kunmap_atomic(buffer - sg->offset);
                         local_irq_restore(flags);
                         return 1;
                 }
-                kunmap_atomic(buffer - sg->offset, KM_IRQ0);
+                kunmap_atomic(buffer - sg->offset);
                 local_irq_restore(flags);
 	}
 	return 0;
drivers/scsi/libfc/fc_fcp.c +4 -4
Index: linux-2.6/drivers/scsi/libfc/fc_fcp.c
===================================================================
@@ -473,11 +473,11 @@ static void fc_fcp_recv_data(struct fc_f
 
 	if (!(fr_flags(fp) & FCPHF_CRC_UNCHECKED)) {
 		copy_len = fc_copy_buffer_to_sglist(buf, len, sg, &nents,
-						    &offset, KM_SOFTIRQ0, NULL);
+						    &offset, NULL);
 	} else {
 		crc = crc32(~0, (u8 *) fh, sizeof(*fh));
 		copy_len = fc_copy_buffer_to_sglist(buf, len, sg, &nents,
-						    &offset, KM_SOFTIRQ0, &crc);
+						    &offset, &crc);
 		buf = fc_frame_payload_get(fp, 0);
 		if (len % 4)
 			crc = crc32(crc, buf + len, 4 - (len % 4));
@@ -636,10 +636,10 @@ static int fc_fcp_send_data(struct fc_fc
 			 * The scatterlist item may be bigger than PAGE_SIZE,
 			 * but we must not cross pages inside the kmap.
 			 */
-			page_addr = kmap_atomic(page, KM_SOFTIRQ0);
+			page_addr = kmap_atomic(page);
 			memcpy(data, (char *)page_addr + (off & ~PAGE_MASK),
 			       sg_bytes);
-			kunmap_atomic(page_addr, KM_SOFTIRQ0);
+			kunmap_atomic(page_addr);
 			data += sg_bytes;
 		}
 		offset += sg_bytes;
drivers/scsi/libfc/fc_lport.c +1 -1
Index: linux-2.6/drivers/scsi/libfc/fc_lport.c
===================================================================
@@ -1636,7 +1636,7 @@ static void fc_lport_bsg_resp(struct fc_
 
 	job->reply->reply_payload_rcv_len +=
 		fc_copy_buffer_to_sglist(buf, len, info->sg, &info->nents,
-					 &info->offset, KM_BIO_SRC_IRQ, NULL);
+					 &info->offset, NULL);
 
 	if (fr_eof(fp) == FC_EOF_T &&
 	    (ntoh24(fh->fh_f_ctl) & (FC_FC_LAST_SEQ | FC_FC_END_SEQ)) ==
drivers/scsi/libiscsi_tcp.c +2 -2
Index: linux-2.6/drivers/scsi/libiscsi_tcp.c
===================================================================
@@ -132,14 +132,14 @@ static void iscsi_tcp_segment_map(struct
 	if (page_count(sg_page(sg)) >= 1 && !recv)
 		return;
 
-	segment->sg_mapped = kmap_atomic(sg_page(sg), KM_SOFTIRQ0);
+	segment->sg_mapped = kmap_atomic(sg_page(sg));
 	segment->data = segment->sg_mapped + sg->offset + segment->sg_offset;
 }
 
 void iscsi_tcp_segment_unmap(struct iscsi_segment *segment)
 {
 	if (segment->sg_mapped) {
-		kunmap_atomic(segment->sg_mapped, KM_SOFTIRQ0);
+		kunmap_atomic(segment->sg_mapped);
 		segment->sg_mapped = NULL;
 		segment->data = NULL;
 	}
drivers/scsi/libsas/sas_host_smp.c +4 -4
Index: linux-2.6/drivers/scsi/libsas/sas_host_smp.c
===================================================================
@@ -160,9 +160,9 @@ int sas_smp_host_handler(struct Scsi_Hos
 	}
 
 	local_irq_disable();
-	buf = kmap_atomic(bio_page(req->bio), KM_USER0) + bio_offset(req->bio);
+	buf = kmap_atomic(bio_page(req->bio)) + bio_offset(req->bio);
 	memcpy(req_data, buf, blk_rq_bytes(req));
-	kunmap_atomic(buf - bio_offset(req->bio), KM_USER0);
+	kunmap_atomic(buf - bio_offset(req->bio));
 	local_irq_enable();
 
 	if (req_data[0] != SMP_REQUEST)
@@ -261,10 +261,10 @@ int sas_smp_host_handler(struct Scsi_Hos
 	}
 
 	local_irq_disable();
-	buf = kmap_atomic(bio_page(rsp->bio), KM_USER0) + bio_offset(rsp->bio);
+	buf = kmap_atomic(bio_page(rsp->bio)) + bio_offset(rsp->bio);
 	memcpy(buf, resp_data, blk_rq_bytes(rsp));
 	flush_kernel_dcache_page(bio_page(rsp->bio));
-	kunmap_atomic(buf - bio_offset(rsp->bio), KM_USER0);
+	kunmap_atomic(buf - bio_offset(rsp->bio));
 	local_irq_enable();
 
  out:
drivers/scsi/megaraid.c +2 -2
Index: linux-2.6/drivers/scsi/megaraid.c
===================================================================
@@ -663,10 +663,10 @@ mega_build_cmd(adapter_t *adapter, Scsi_
 			struct scatterlist *sg;
 
 			sg = scsi_sglist(cmd);
-			buf = kmap_atomic(sg_page(sg), KM_IRQ0) + sg->offset;
+			buf = kmap_atomic(sg_page(sg)) + sg->offset;
 
 			memset(buf, 0, cmd->cmnd[4]);
-			kunmap_atomic(buf - sg->offset, KM_IRQ0);
+			kunmap_atomic(buf - sg->offset);
 
 			cmd->result = (DID_OK << 16);
 			cmd->scsi_done(cmd);
drivers/scsi/mvsas/mv_sas.c +4 -4
Index: linux-2.6/drivers/scsi/mvsas/mv_sas.c
===================================================================
@@ -554,9 +554,9 @@ static int mvs_task_prep_smp(struct mvs_
 
 #if _MV_DUMP
 	/* copy cmd table */
-	from = kmap_atomic(sg_page(sg_req), KM_IRQ0);
+	from = kmap_atomic(sg_page(sg_req));
 	memcpy(buf_cmd, from + sg_req->offset, req_len);
-	kunmap_atomic(from, KM_IRQ0);
+	kunmap_atomic(from);
 #endif
 	return 0;
 
@@ -1896,11 +1896,11 @@ int mvs_slot_complete(struct mvs_info *m
 	case SAS_PROTOCOL_SMP: {
 			struct scatterlist *sg_resp = &task->smp_task.smp_resp;
 			tstat->stat = SAM_STAT_GOOD;
-			to = kmap_atomic(sg_page(sg_resp), KM_IRQ0);
+			to = kmap_atomic(sg_page(sg_resp));
 			memcpy(to + sg_resp->offset,
 				slot->response + sizeof(struct mvs_err_info),
 				sg_dma_len(sg_resp));
-			kunmap_atomic(to, KM_IRQ0);
+			kunmap_atomic(to);
 			break;
 		}
 
drivers/scsi/scsi_debug.c +12 -12
Index: linux-2.6/drivers/scsi/scsi_debug.c
===================================================================
@@ -1746,7 +1746,7 @@ static int prot_verify_read(struct scsi_
 	scsi_for_each_prot_sg(SCpnt, psgl, scsi_prot_sg_count(SCpnt), i) {
 		int len = min(psgl->length, resid);
 
-		paddr = kmap_atomic(sg_page(psgl), KM_IRQ0) + psgl->offset;
+		paddr = kmap_atomic(sg_page(psgl)) + psgl->offset;
 		memcpy(paddr, dif_storep + dif_offset(sector), len);
 
 		sector += len >> 3;
@@ -1756,7 +1756,7 @@ static int prot_verify_read(struct scsi_
 			sector = do_div(tmp_sec, sdebug_store_sectors);
 		}
 		resid -= len;
-		kunmap_atomic(paddr, KM_IRQ0);
+		kunmap_atomic(paddr);
 	}
 
 	dix_reads++;
@@ -1848,12 +1848,12 @@ static int prot_verify_write(struct scsi
 	BUG_ON(scsi_sg_count(SCpnt) == 0);
 	BUG_ON(scsi_prot_sg_count(SCpnt) == 0);
 
-	paddr = kmap_atomic(sg_page(psgl), KM_IRQ1) + psgl->offset;
+	paddr = kmap_atomic(sg_page(psgl)) + psgl->offset;
 	ppage_offset = 0;
 
 	/* For each data page */
 	scsi_for_each_sg(SCpnt, dsgl, scsi_sg_count(SCpnt), i) {
-		daddr = kmap_atomic(sg_page(dsgl), KM_IRQ0) + dsgl->offset;
+		daddr = kmap_atomic(sg_page(dsgl)) + dsgl->offset;
 
 		/* For each sector-sized chunk in data page */
 		for (j = 0 ; j < dsgl->length ; j += scsi_debug_sector_size) {
@@ -1862,10 +1862,10 @@ static int prot_verify_write(struct scsi
 			 * protection page advance to the next one
 			 */
 			if (ppage_offset >= psgl->length) {
-				kunmap_atomic(paddr, KM_IRQ1);
+				kunmap_atomic(paddr);
 				psgl = sg_next(psgl);
 				BUG_ON(psgl == NULL);
-				paddr = kmap_atomic(sg_page(psgl), KM_IRQ1)
+				paddr = kmap_atomic(sg_page(psgl))
 					+ psgl->offset;
 				ppage_offset = 0;
 			}
@@ -1938,10 +1938,10 @@ static int prot_verify_write(struct scsi
 			ppage_offset += sizeof(struct sd_dif_tuple);
 		}
 
-		kunmap_atomic(daddr, KM_IRQ0);
+		kunmap_atomic(daddr);
 	}
 
-	kunmap_atomic(paddr, KM_IRQ1);
+	kunmap_atomic(paddr);
 
 	dix_writes++;
 
@@ -1949,8 +1949,8 @@ static int prot_verify_write(struct scsi
 
 out:
 	dif_errors++;
-	kunmap_atomic(daddr, KM_IRQ0);
-	kunmap_atomic(paddr, KM_IRQ1);
+	kunmap_atomic(daddr);
+	kunmap_atomic(paddr);
 	return ret;
 }
 
@@ -2264,7 +2264,7 @@ static int resp_xdwriteread(struct scsi_
 
 	offset = 0;
 	for_each_sg(sdb->table.sgl, sg, sdb->table.nents, i) {
-		kaddr = (unsigned char *)kmap_atomic(sg_page(sg), KM_USER0);
+		kaddr = (unsigned char *)kmap_atomic(sg_page(sg));
 		if (!kaddr)
 			goto out;
 
@@ -2272,7 +2272,7 @@ static int resp_xdwriteread(struct scsi_
 			*(kaddr + sg->offset + j) ^= *(buf + offset + j);
 
 		offset += sg->length;
-		kunmap_atomic(kaddr, KM_USER0);
+		kunmap_atomic(kaddr);
 	}
 	ret = 0;
 out:
drivers/scsi/scsi_lib.c +2 -2
Index: linux-2.6/drivers/scsi/scsi_lib.c
===================================================================
@@ -2537,7 +2537,7 @@ void *scsi_kmap_atomic_sg(struct scatter
 	if (*len > sg_len)
 		*len = sg_len;
 
-	return kmap_atomic(page, KM_BIO_SRC_IRQ);
+	return kmap_atomic(page);
 }
 EXPORT_SYMBOL(scsi_kmap_atomic_sg);
 
@@ -2547,6 +2547,6 @@ EXPORT_SYMBOL(scsi_kmap_atomic_sg);
  */
 void scsi_kunmap_atomic_sg(void *virt)
 {
-	kunmap_atomic(virt, KM_BIO_SRC_IRQ);
+	kunmap_atomic(virt);
 }
 EXPORT_SYMBOL(scsi_kunmap_atomic_sg);
drivers/scsi/sd_dif.c +6 -6
Index: linux-2.6/drivers/scsi/sd_dif.c
===================================================================
@@ -393,7 +393,7 @@ int sd_dif_prepare(struct request *rq, s
 		virt = bio->bi_integrity->bip_sector & 0xffffffff;
 
 		bip_for_each_vec(iv, bio->bi_integrity, i) {
-			sdt = kmap_atomic(iv->bv_page, KM_USER0)
+			sdt = kmap_atomic(iv->bv_page)
 				+ iv->bv_offset;
 
 			for (j = 0 ; j < iv->bv_len ; j += tuple_sz, sdt++) {
@@ -406,14 +406,14 @@ int sd_dif_prepare(struct request *rq, s
 				phys++;
 			}
 
-			kunmap_atomic(sdt, KM_USER0);
+			kunmap_atomic(sdt);
 		}
 	}
 
 	return 0;
 
 error:
-	kunmap_atomic(sdt, KM_USER0);
+	kunmap_atomic(sdt);
 	sd_printk(KERN_ERR, sdkp, "%s: virt %u, phys %u, ref %u, app %4x\n",
 		  __func__, virt, phys, be32_to_cpu(sdt->ref_tag),
 		  be16_to_cpu(sdt->app_tag));
@@ -452,13 +452,13 @@ void sd_dif_complete(struct scsi_cmnd *s
 		virt = bio->bi_integrity->bip_sector & 0xffffffff;
 
 		bip_for_each_vec(iv, bio->bi_integrity, i) {
-			sdt = kmap_atomic(iv->bv_page, KM_USER0)
+			sdt = kmap_atomic(iv->bv_page)
 				+ iv->bv_offset;
 
 			for (j = 0 ; j < iv->bv_len ; j += tuple_sz, sdt++) {
 
 				if (sectors == 0) {
-					kunmap_atomic(sdt, KM_USER0);
+					kunmap_atomic(sdt);
 					return;
 				}
 
@@ -473,7 +473,7 @@ void sd_dif_complete(struct scsi_cmnd *s
 				sectors--;
 			}
 
-			kunmap_atomic(sdt, KM_USER0);
+			kunmap_atomic(sdt);
 		}
 	}
 }
drivers/staging/hv/netvsc_drv.c +1 -1
Index: linux-2.6/drivers/staging/hv/netvsc_drv.c
===================================================================
@@ -283,7 +283,7 @@ static int netvsc_recv_callback(struct h
 		       packet->PageBuffers[i].Length);
 
 		kunmap_atomic((void *)((unsigned long)data -
-				       packet->PageBuffers[i].Offset), KM_IRQ1);
+				       packet->PageBuffers[i].Offset));
 	}
 
 	local_irq_restore(flags);
drivers/staging/hv/rndis_filter.c +2 -2
Index: linux-2.6/drivers/staging/hv/rndis_filter.c
===================================================================
@@ -396,7 +396,7 @@ static int RndisFilterOnReceive(struct h
 	}
 
 	rndisHeader = (struct rndis_message *)kmap_atomic(
-			pfn_to_page(Packet->PageBuffers[0].Pfn), KM_IRQ0);
+			pfn_to_page(Packet->PageBuffers[0].Pfn));
 
 	rndisHeader = (void *)((unsigned long)rndisHeader +
 			Packet->PageBuffers[0].Offset);
@@ -433,7 +433,7 @@ static int RndisFilterOnReceive(struct h
 			sizeof(struct rndis_message) :
 			rndisHeader->MessageLength);
 
-	kunmap_atomic(rndisHeader - Packet->PageBuffers[0].Offset, KM_IRQ0);
+	kunmap_atomic(rndisHeader - Packet->PageBuffers[0].Offset);
 
 	DumpRndisMessage(&rndisMessage);
 
drivers/staging/hv/storvsc_drv.c +9 -9
Index: linux-2.6/drivers/staging/hv/storvsc_drv.c
===================================================================
@@ -496,7 +496,7 @@ static unsigned int copy_to_bounce_buffe
 		/* ASSERT(orig_sgl[i].offset + orig_sgl[i].length <= PAGE_SIZE); */
 
 		if (j == 0)
-			bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])), KM_IRQ0);
+			bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])));
 
 		while (srclen) {
 			/* assume bounce offset always == 0 */
@@ -513,19 +513,19 @@ static unsigned int copy_to_bounce_buffe
 
 			if (bounce_sgl[j].length == PAGE_SIZE) {
 				/* full..move to next entry */
-				kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+				kunmap_atomic((void *)bounce_addr);
 				j++;
 
 				/* if we need to use another bounce buffer */
 				if (srclen || i != orig_sgl_count - 1)
-					bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])), KM_IRQ0);
+					bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])));
 			} else if (srclen == 0 && i == orig_sgl_count - 1) {
 				/* unmap the last bounce that is < PAGE_SIZE */
-				kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+				kunmap_atomic((void *)bounce_addr);
 			}
 		}
 
-		kunmap_atomic((void *)(src_addr - orig_sgl[i].offset), KM_IRQ0);
+		kunmap_atomic((void *)(src_addr - orig_sgl[i].offset));
 	}
 
 	local_irq_restore(flags);
@@ -557,7 +557,7 @@ static unsigned int copy_from_bounce_buf
 		/* ASSERT(orig_sgl[i].offset + orig_sgl[i].length <= PAGE_SIZE); */
 
 		if (j == 0)
-			bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])), KM_IRQ0);
+			bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])));
 
 		while (destlen) {
 			src = bounce_addr + bounce_sgl[j].offset;
@@ -573,15 +573,15 @@ static unsigned int copy_from_bounce_buf
 
 			if (bounce_sgl[j].offset == bounce_sgl[j].length) {
 				/* full */
-				kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+				kunmap_atomic((void *)bounce_addr);
 				j++;
 
 				/* if we need to use another bounce buffer */
 				if (destlen || i != orig_sgl_count - 1)
-					bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])), KM_IRQ0);
+					bounce_addr = (unsigned long)kmap_atomic(sg_page((&bounce_sgl[j])));
 			} else if (destlen == 0 && i == orig_sgl_count - 1) {
 				/* unmap the last bounce that is < PAGE_SIZE */
-				kunmap_atomic((void *)bounce_addr, KM_IRQ0);
+				kunmap_atomic((void *)bounce_addr);
 			}
 		}
 
drivers/staging/pohmelfs/inode.c +4 -4
Index: linux-2.6/drivers/staging/pohmelfs/inode.c
===================================================================
@@ -605,11 +605,11 @@ static int pohmelfs_write_begin(struct f
 		}
 
 		if (len != PAGE_CACHE_SIZE) {
-			void *kaddr = kmap_atomic(page, KM_USER0);
+			void *kaddr = kmap_atomic(page);
 
 			memset(kaddr + start, 0, PAGE_CACHE_SIZE - start);
 			flush_dcache_page(page);
-			kunmap_atomic(kaddr, KM_USER0);
+			kunmap_atomic(kaddr);
 		}
 		SetPageUptodate(page);
 	}
@@ -635,11 +635,11 @@ static int pohmelfs_write_end(struct fil
 
 	if (copied != len) {
 		unsigned from = pos & (PAGE_CACHE_SIZE - 1);
-		void *kaddr = kmap_atomic(page, KM_USER0);
+		void *kaddr = kmap_atomic(page);
 
 		memset(kaddr + from + copied, 0, len - copied);
 		flush_dcache_page(page);
-		kunmap_atomic(kaddr, KM_USER0);
+		kunmap_atomic(kaddr);
 	}
 
 	SetPageUptodate(page);
drivers/staging/zram/xvmalloc.c +17 -17
Index: linux-2.6/drivers/staging/zram/xvmalloc.c
===================================================================
@@ -50,7 +50,7 @@ static void clear_flag(struct block_head
  * This is called from xv_malloc/xv_free path, so it
  * needs to be fast.
  */
-static void *get_ptr_atomic(struct page *page, u16 offset, enum km_type type)
+static void *get_ptr_atomic(struct page *page, u16 offset)
 {
 	unsigned char *base;
 
@@ -58,7 +58,7 @@ static void *get_ptr_atomic(struct page 
 	return base + offset;
 }
 
-static void put_ptr_atomic(void *ptr, enum km_type type)
+static void put_ptr_atomic(void *ptr)
 {
 	kunmap_atomic(ptr, type);
 }
@@ -196,10 +196,10 @@ static void insert_block(struct xv_pool 
 
 	if (block->link.next_page) {
 		nextblock = get_ptr_atomic(block->link.next_page,
-					block->link.next_offset, KM_USER1);
+					block->link.next_offset);
 		nextblock->link.prev_page = page;
 		nextblock->link.prev_offset = offset;
-		put_ptr_atomic(nextblock, KM_USER1);
+		put_ptr_atomic(nextblock);
 	}
 
 	__set_bit(slindex % BITS_PER_LONG, &pool->slbitmap[flindex]);
@@ -231,10 +231,10 @@ static void remove_block_head(struct xv_
 		 * sanity, lets do it.
 		 */
 		tmpblock = get_ptr_atomic(pool->freelist[slindex].page,
-				pool->freelist[slindex].offset, KM_USER1);
+				pool->freelist[slindex].offset);
 		tmpblock->link.prev_page = 0;
 		tmpblock->link.prev_offset = 0;
-		put_ptr_atomic(tmpblock, KM_USER1);
+		put_ptr_atomic(tmpblock);
 	}
 }
 
@@ -257,18 +257,18 @@ static void remove_block(struct xv_pool 
 
 	if (block->link.prev_page) {
 		tmpblock = get_ptr_atomic(block->link.prev_page,
-				block->link.prev_offset, KM_USER1);
+				block->link.prev_offset);
 		tmpblock->link.next_page = block->link.next_page;
 		tmpblock->link.next_offset = block->link.next_offset;
-		put_ptr_atomic(tmpblock, KM_USER1);
+		put_ptr_atomic(tmpblock);
 	}
 
 	if (block->link.next_page) {
 		tmpblock = get_ptr_atomic(block->link.next_page,
-				block->link.next_offset, KM_USER1);
+				block->link.next_offset);
 		tmpblock->link.prev_page = block->link.prev_page;
 		tmpblock->link.prev_offset = block->link.prev_offset;
-		put_ptr_atomic(tmpblock, KM_USER1);
+		put_ptr_atomic(tmpblock);
 	}
 }
 
@@ -287,7 +287,7 @@ static int grow_pool(struct xv_pool *poo
 	stat_inc(&pool->total_pages);
 
 	spin_lock(&pool->lock);
-	block = get_ptr_atomic(page, 0, KM_USER0);
+	block = get_ptr_atomic(page, 0);
 
 	block->size = PAGE_SIZE - XV_ALIGN;
 	set_flag(block, BLOCK_FREE);
@@ -296,7 +296,7 @@ static int grow_pool(struct xv_pool *poo
 
 	insert_block(pool, page, 0, block);
 
-	put_ptr_atomic(block, KM_USER0);
+	put_ptr_atomic(block);
 	spin_unlock(&pool->lock);
 
 	return 0;
@@ -376,7 +376,7 @@ int xv_malloc(struct xv_pool *pool, u32 
 		return -ENOMEM;
 	}
 
-	block = get_ptr_atomic(*page, *offset, KM_USER0);
+	block = get_ptr_atomic(*page, *offset);
 
 	remove_block_head(pool, block, index);
 
@@ -406,7 +406,7 @@ int xv_malloc(struct xv_pool *pool, u32 
 	block->size = origsize;
 	clear_flag(block, BLOCK_FREE);
 
-	put_ptr_atomic(block, KM_USER0);
+	put_ptr_atomic(block);
 	spin_unlock(&pool->lock);
 
 	*offset += XV_ALIGN;
@@ -426,7 +426,7 @@ void xv_free(struct xv_pool *pool, struc
 
 	spin_lock(&pool->lock);
 
-	page_start = get_ptr_atomic(page, 0, KM_USER0);
+	page_start = get_ptr_atomic(page, 0);
 	block = (struct block_header *)((char *)page_start + offset);
 
 	/* Catch double free bugs */
@@ -468,7 +468,7 @@ void xv_free(struct xv_pool *pool, struc
 
 	/* No used objects in this page. Free it. */
 	if (block->size == PAGE_SIZE - XV_ALIGN) {
-		put_ptr_atomic(page_start, KM_USER0);
+		put_ptr_atomic(page_start);
 		spin_unlock(&pool->lock);
 
 		__free_page(page);
@@ -486,7 +486,7 @@ void xv_free(struct xv_pool *pool, struc
 		set_blockprev(tmpblock, offset);
 	}
 
-	put_ptr_atomic(page_start, KM_USER0);
+	put_ptr_atomic(page_start);
 	spin_unlock(&pool->lock);
 }
 
drivers/staging/zram/zram_drv.c +19 -19
Index: linux-2.6/drivers/staging/zram/zram_drv.c
===================================================================
@@ -171,9 +171,9 @@ static void zram_free_page(struct zram *
 		goto out;
 	}
 
-	obj = kmap_atomic(page, KM_USER0) + offset;
+	obj = kmap_atomic(page) + offset;
 	clen = xv_get_object_size(obj) - sizeof(struct zobj_header);
-	kunmap_atomic(obj, KM_USER0);
+	kunmap_atomic(obj);
 
 	xv_free(zram->mem_pool, page, offset);
 	if (clen <= PAGE_SIZE / 2)
@@ -191,9 +191,9 @@ static void handle_zero_page(struct page
 {
 	void *user_mem;
 
-	user_mem = kmap_atomic(page, KM_USER0);
+	user_mem = kmap_atomic(page);
 	memset(user_mem, 0, PAGE_SIZE);
-	kunmap_atomic(user_mem, KM_USER0);
+	kunmap_atomic(user_mem);
 
 	flush_dcache_page(page);
 }
@@ -203,13 +203,13 @@ static void handle_uncompressed_page(str
 {
 	unsigned char *user_mem, *cmem;
 
-	user_mem = kmap_atomic(page, KM_USER0);
-	cmem = kmap_atomic(zram->table[index].page, KM_USER1) +
+	user_mem = kmap_atomic(page);
+	cmem = kmap_atomic(zram->table[index].page) +
 			zram->table[index].offset;
 
 	memcpy(user_mem, cmem, PAGE_SIZE);
-	kunmap_atomic(user_mem, KM_USER0);
-	kunmap_atomic(cmem, KM_USER1);
+	kunmap_atomic(user_mem);
+	kunmap_atomic(cmem);
 
 	flush_dcache_page(page);
 }
@@ -252,10 +252,10 @@ static int zram_read(struct zram *zram, 
 			continue;
 		}
 
-		user_mem = kmap_atomic(page, KM_USER0);
+		user_mem = kmap_atomic(page);
 		clen = PAGE_SIZE;
 
-		cmem = kmap_atomic(zram->table[index].page, KM_USER1) +
+		cmem = kmap_atomic(zram->table[index].page) +
 				zram->table[index].offset;
 
 		ret = lzo1x_decompress_safe(
@@ -263,8 +263,8 @@ static int zram_read(struct zram *zram, 
 			xv_get_object_size(cmem) - sizeof(*zheader),
 			user_mem, &clen);
 
-		kunmap_atomic(user_mem, KM_USER0);
-		kunmap_atomic(cmem, KM_USER1);
+		kunmap_atomic(user_mem);
+		kunmap_atomic(cmem);
 
 		/* Should NEVER happen. Return bio error if it does. */
 		if (unlikely(ret != LZO_E_OK)) {
@@ -318,9 +318,9 @@ static int zram_write(struct zram *zram,
 
 		mutex_lock(&zram->lock);
 
-		user_mem = kmap_atomic(page, KM_USER0);
+		user_mem = kmap_atomic(page);
 		if (page_zero_filled(user_mem)) {
-			kunmap_atomic(user_mem, KM_USER0);
+			kunmap_atomic(user_mem);
 			mutex_unlock(&zram->lock);
 			zram_stat_inc(&zram->stats.pages_zero);
 			zram_set_flag(zram, index, ZRAM_ZERO);
@@ -330,7 +330,7 @@ static int zram_write(struct zram *zram,
 		ret = lzo1x_1_compress(user_mem, PAGE_SIZE, src, &clen,
 					zram->compress_workmem);
 
-		kunmap_atomic(user_mem, KM_USER0);
+		kunmap_atomic(user_mem);
 
 		if (unlikely(ret != LZO_E_OK)) {
 			mutex_unlock(&zram->lock);
@@ -360,7 +360,7 @@ static int zram_write(struct zram *zram,
 			zram_set_flag(zram, index, ZRAM_UNCOMPRESSED);
 			zram_stat_inc(&zram->stats.pages_expand);
 			zram->table[index].page = page_store;
-			src = kmap_atomic(page, KM_USER0);
+			src = kmap_atomic(page);
 			goto memstore;
 		}
 
@@ -377,7 +377,7 @@ static int zram_write(struct zram *zram,
 memstore:
 		zram->table[index].offset = offset;
 
-		cmem = kmap_atomic(zram->table[index].page, KM_USER1) +
+		cmem = kmap_atomic(zram->table[index].page) +
 				zram->table[index].offset;
 
 #if 0
@@ -391,9 +391,9 @@ memstore:
 
 		memcpy(cmem, src, clen);
 
-		kunmap_atomic(cmem, KM_USER1);
+		kunmap_atomic(cmem);
 		if (unlikely(zram_test_flag(zram, index, ZRAM_UNCOMPRESSED)))
-			kunmap_atomic(src, KM_USER0);
+			kunmap_atomic(src);
 
 		/* Update stats */
 		zram->stats.compr_size += clen;
drivers/vhost/vhost.c +2 -2
Index: linux-2.6/drivers/vhost/vhost.c
===================================================================
@@ -774,9 +774,9 @@ static int set_bit_to_user(int nr, void 
 	if (r < 0)
 		return r;
 	BUG_ON(r != 1);
-	base = kmap_atomic(page, KM_USER0);
+	base = kmap_atomic(page);
 	set_bit(bit, base);
-	kunmap_atomic(base, KM_USER0);
+	kunmap_atomic(base);
 	set_page_dirty_lock(page);
 	put_page(page);
 	return 0;
fs/afs/fsclient.c +4 -4
Index: linux-2.6/fs/afs/fsclient.c
===================================================================
@@ -364,10 +364,10 @@ static int afs_deliver_fs_fetch_data(str
 		_debug("extract data");
 		if (call->count > 0) {
 			page = call->reply3;
-			buffer = kmap_atomic(page, KM_USER0);
+			buffer = kmap_atomic(page);
 			ret = afs_extract_data(call, skb, last, buffer,
 					       call->count);
-			kunmap_atomic(buffer, KM_USER0);
+			kunmap_atomic(buffer);
 			switch (ret) {
 			case 0:		break;
 			case -EAGAIN:	return 0;
@@ -410,9 +410,9 @@ static int afs_deliver_fs_fetch_data(str
 	if (call->count < PAGE_SIZE) {
 		_debug("clear");
 		page = call->reply3;
-		buffer = kmap_atomic(page, KM_USER0);
+		buffer = kmap_atomic(page);
 		memset(buffer + call->count, 0, PAGE_SIZE - call->count);
-		kunmap_atomic(buffer, KM_USER0);
+		kunmap_atomic(buffer);
 	}
 
 	_leave(" = 0 [done]");
fs/afs/mntpt.c +2 -2
Index: linux-2.6/fs/afs/mntpt.c
===================================================================
@@ -201,9 +201,9 @@ static struct vfsmount *afs_mntpt_do_aut
 		if (PageError(page))
 			goto error;
 
-		buf = kmap_atomic(page, KM_USER0);
+		buf = kmap_atomic(page);
 		memcpy(devname, buf, size);
-		kunmap_atomic(buf, KM_USER0);
+		kunmap_atomic(buf);
 		page_cache_release(page);
 		page = NULL;
 	}
fs/aio.c +12 -12
Index: linux-2.6/fs/aio.c
===================================================================
@@ -171,7 +171,7 @@ static int aio_setup_ring(struct kioctx 
 
 	info->nr = nr_events;		/* trusted copy */
 
-	ring = kmap_atomic(info->ring_pages[0], KM_USER0);
+	ring = kmap_atomic(info->ring_pages[0]);
 	ring->nr = nr_events;	/* user copy */
 	ring->id = ctx->user_id;
 	ring->head = ring->tail = 0;
@@ -179,7 +179,7 @@ static int aio_setup_ring(struct kioctx 
 	ring->compat_features = AIO_RING_COMPAT_FEATURES;
 	ring->incompat_features = AIO_RING_INCOMPAT_FEATURES;
 	ring->header_length = sizeof(struct aio_ring);
-	kunmap_atomic(ring, KM_USER0);
+	kunmap_atomic(ring);
 
 	return 0;
 }
@@ -466,13 +466,13 @@ static struct kiocb *__aio_get_req(struc
 	 * accept an event from this io.
 	 */
 	spin_lock_irq(&ctx->ctx_lock);
-	ring = kmap_atomic(ctx->ring_info.ring_pages[0], KM_USER0);
+	ring = kmap_atomic(ctx->ring_info.ring_pages[0]);
 	if (ctx->reqs_active < aio_ring_avail(&ctx->ring_info, ring)) {
 		list_add(&req->ki_list, &ctx->active_reqs);
 		ctx->reqs_active++;
 		okay = 1;
 	}
-	kunmap_atomic(ring, KM_USER0);
+	kunmap_atomic(ring);
 	spin_unlock_irq(&ctx->ctx_lock);
 
 	if (!okay) {
@@ -946,10 +946,10 @@ int aio_complete(struct kiocb *iocb, lon
 	if (kiocbIsCancelled(iocb))
 		goto put_rq;
 
-	ring = kmap_atomic(info->ring_pages[0], KM_IRQ1);
+	ring = kmap_atomic(info->ring_pages[0]);
 
 	tail = info->tail;
-	event = aio_ring_event(info, tail, KM_IRQ0);
+	event = aio_ring_event(info, tail);
 	if (++tail >= info->nr)
 		tail = 0;
 
@@ -970,8 +970,8 @@ int aio_complete(struct kiocb *iocb, lon
 	info->tail = tail;
 	ring->tail = tail;
 
-	put_aio_ring_event(event, KM_IRQ0);
-	kunmap_atomic(ring, KM_IRQ1);
+	put_aio_ring_event(event);
+	kunmap_atomic(ring);
 
 	pr_debug("added to ring %p at [%lu]\n", iocb, tail);
 
@@ -1016,7 +1016,7 @@ static int aio_read_evt(struct kioctx *i
 	unsigned long head;
 	int ret = 0;
 
-	ring = kmap_atomic(info->ring_pages[0], KM_USER0);
+	ring = kmap_atomic(info->ring_pages[0]);
 	dprintk("in aio_read_evt h%lu t%lu m%lu\n",
 		 (unsigned long)ring->head, (unsigned long)ring->tail,
 		 (unsigned long)ring->nr);
@@ -1028,18 +1028,18 @@ static int aio_read_evt(struct kioctx *i
 
 	head = ring->head % info->nr;
 	if (head != ring->tail) {
-		struct io_event *evp = aio_ring_event(info, head, KM_USER1);
+		struct io_event *evp = aio_ring_event(info, head);
 		*ent = *evp;
 		head = (head + 1) % info->nr;
 		smp_mb(); /* finish reading the event before updatng the head */
 		ring->head = head;
 		ret = 1;
-		put_aio_ring_event(evp, KM_USER1);
+		put_aio_ring_event(evp);
 	}
 	spin_unlock(&info->ring_lock);
 
 out:
-	kunmap_atomic(ring, KM_USER0);
+	kunmap_atomic(ring);
 	dprintk("leaving aio_read_evt: %d  h%lu t%lu\n", ret,
 		 (unsigned long)ring->head, (unsigned long)ring->tail);
 	return ret;
fs/bio-integrity.c +5 -5
Index: linux-2.6/fs/bio-integrity.c
===================================================================
@@ -356,7 +356,7 @@ static void bio_integrity_generate(struc
 	bix.sector_size = bi->sector_size;
 
 	bio_for_each_segment(bv, bio, i) {
-		void *kaddr = kmap_atomic(bv->bv_page, KM_USER0);
+		void *kaddr = kmap_atomic(bv->bv_page);
 		bix.data_buf = kaddr + bv->bv_offset;
 		bix.data_size = bv->bv_len;
 		bix.prot_buf = prot_buf;
@@ -370,7 +370,7 @@ static void bio_integrity_generate(struc
 		total += sectors * bi->tuple_size;
 		BUG_ON(total > bio->bi_integrity->bip_size);
 
-		kunmap_atomic(kaddr, KM_USER0);
+		kunmap_atomic(kaddr);
 	}
 }
 
@@ -497,7 +497,7 @@ static int bio_integrity_verify(struct b
 	bix.sector_size = bi->sector_size;
 
 	bio_for_each_segment(bv, bio, i) {
-		void *kaddr = kmap_atomic(bv->bv_page, KM_USER0);
+		void *kaddr = kmap_atomic(bv->bv_page);
 		bix.data_buf = kaddr + bv->bv_offset;
 		bix.data_size = bv->bv_len;
 		bix.prot_buf = prot_buf;
@@ -506,7 +506,7 @@ static int bio_integrity_verify(struct b
 		ret = bi->verify_fn(&bix);
 
 		if (ret) {
-			kunmap_atomic(kaddr, KM_USER0);
+			kunmap_atomic(kaddr);
 			return ret;
 		}
 
@@ -516,7 +516,7 @@ static int bio_integrity_verify(struct b
 		total += sectors * bi->tuple_size;
 		BUG_ON(total > bio->bi_integrity->bip_size);
 
-		kunmap_atomic(kaddr, KM_USER0);
+		kunmap_atomic(kaddr);
 	}
 
 	return ret;
fs/btrfs/compression.c +4 -4
Index: linux-2.6/fs/btrfs/compression.c
===================================================================
@@ -129,10 +129,10 @@ static int check_compressed_csum(struct 
 		page = cb->compressed_pages[i];
 		csum = ~(u32)0;
 
-		kaddr = kmap_atomic(page, KM_USER0);
+		kaddr = kmap_atomic(page);
 		csum = btrfs_csum_data(root, kaddr, csum, PAGE_CACHE_SIZE);
 		btrfs_csum_final(csum, (char *)&csum);
-		kunmap_atomic(kaddr, KM_USER0);
+		kunmap_atomic(kaddr);
 
 		if (csum != *cb_sum) {
 			printk(KERN_INFO "btrfs csum failed ino %lu "
@@ -518,10 +518,10 @@ static noinline int add_ra_bio_pages(str
 			if (zero_offset) {
 				int zeros;
 				zeros = PAGE_CACHE_SIZE - zero_offset;
-				userpage = kmap_atomic(page, KM_USER0);
+				userpage = kmap_atomic(page);
 				memset(userpage + zero_offset, 0, zeros);
 				flush_dcache_page(page);
-				kunmap_atomic(userpage, KM_USER0);
+				kunmap_atomic(userpage);
 			}
 		}
 
fs/btrfs/ctree.c +15 -15
Index: linux-2.6/fs/btrfs/ctree.c
===================================================================
@@ -885,14 +885,14 @@ static noinline int generic_bin_search(s
 		    (offset + sizeof(struct btrfs_disk_key)) >
 		    map_start + map_len) {
 			if (map_token) {
-				unmap_extent_buffer(eb, map_token, KM_USER0);
+				unmap_extent_buffer(eb, map_token);
 				map_token = NULL;
 			}
 
 			err = map_private_extent_buffer(eb, offset,
 						sizeof(struct btrfs_disk_key),
 						&map_token, &kaddr,
-						&map_start, &map_len, KM_USER0);
+						&map_start, &map_len);
 
 			if (!err) {
 				tmp = (struct btrfs_disk_key *)(kaddr + offset -
@@ -916,13 +916,13 @@ static noinline int generic_bin_search(s
 		else {
 			*slot = mid;
 			if (map_token)
-				unmap_extent_buffer(eb, map_token, KM_USER0);
+				unmap_extent_buffer(eb, map_token);
 			return 0;
 		}
 	}
 	*slot = low;
 	if (map_token)
-		unmap_extent_buffer(eb, map_token, KM_USER0);
+		unmap_extent_buffer(eb, map_token);
 	return 1;
 }
 
@@ -2374,7 +2374,7 @@ static noinline int __push_leaf_right(st
 		i--;
 	}
 	if (left->map_token) {
-		unmap_extent_buffer(left, left->map_token, KM_USER1);
+		unmap_extent_buffer(left, left->map_token);
 		left->map_token = NULL;
 	}
 
@@ -2430,7 +2430,7 @@ static noinline int __push_leaf_right(st
 	}
 
 	if (right->map_token) {
-		unmap_extent_buffer(right, right->map_token, KM_USER1);
+		unmap_extent_buffer(right, right->map_token);
 		right->map_token = NULL;
 	}
 	left_nritems -= push_items;
@@ -2599,7 +2599,7 @@ static noinline int __push_leaf_left(str
 	}
 
 	if (right->map_token) {
-		unmap_extent_buffer(right, right->map_token, KM_USER1);
+		unmap_extent_buffer(right, right->map_token);
 		right->map_token = NULL;
 	}
 
@@ -2646,7 +2646,7 @@ static noinline int __push_leaf_left(str
 	}
 	btrfs_set_header_nritems(left, old_left_nritems + push_items);
 	if (left->map_token) {
-		unmap_extent_buffer(left, left->map_token, KM_USER1);
+		unmap_extent_buffer(left, left->map_token);
 		left->map_token = NULL;
 	}
 
@@ -2688,7 +2688,7 @@ static noinline int __push_leaf_left(str
 		btrfs_set_item_offset(right, item, push_space);
 	}
 	if (right->map_token) {
-		unmap_extent_buffer(right, right->map_token, KM_USER1);
+		unmap_extent_buffer(right, right->map_token);
 		right->map_token = NULL;
 	}
 
@@ -2841,7 +2841,7 @@ static noinline int copy_for_split(struc
 	}
 
 	if (right->map_token) {
-		unmap_extent_buffer(right, right->map_token, KM_USER1);
+		unmap_extent_buffer(right, right->map_token);
 		right->map_token = NULL;
 	}
 
@@ -3379,7 +3379,7 @@ int btrfs_truncate_item(struct btrfs_tra
 	}
 
 	if (leaf->map_token) {
-		unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
+		unmap_extent_buffer(leaf, leaf->map_token);
 		leaf->map_token = NULL;
 	}
 
@@ -3495,7 +3495,7 @@ int btrfs_extend_item(struct btrfs_trans
 	}
 
 	if (leaf->map_token) {
-		unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
+		unmap_extent_buffer(leaf, leaf->map_token);
 		leaf->map_token = NULL;
 	}
 
@@ -3618,7 +3618,7 @@ int btrfs_insert_some_items(struct btrfs
 			btrfs_set_item_offset(leaf, item, ioff - total_data);
 		}
 		if (leaf->map_token) {
-			unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
+			unmap_extent_buffer(leaf, leaf->map_token);
 			leaf->map_token = NULL;
 		}
 
@@ -3733,7 +3733,7 @@ setup_items_for_insert(struct btrfs_tran
 			btrfs_set_item_offset(leaf, item, ioff - total_data);
 		}
 		if (leaf->map_token) {
-			unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
+			unmap_extent_buffer(leaf, leaf->map_token);
 			leaf->map_token = NULL;
 		}
 
@@ -3962,7 +3962,7 @@ int btrfs_del_items(struct btrfs_trans_h
 		}
 
 		if (leaf->map_token) {
-			unmap_extent_buffer(leaf, leaf->map_token, KM_USER1);
+			unmap_extent_buffer(leaf, leaf->map_token);
 			leaf->map_token = NULL;
 		}
 
fs/btrfs/ctree.h +4 -4
Index: linux-2.6/fs/btrfs/ctree.h
===================================================================
@@ -1241,17 +1241,17 @@ void btrfs_set_##name(struct extent_buff
 #define BTRFS_SETGET_HEADER_FUNCS(name, type, member, bits)		\
 static inline u##bits btrfs_##name(struct extent_buffer *eb)		\
 {									\
-	type *p = kmap_atomic(eb->first_page, KM_USER0);		\
+	type *p = kmap_atomic(eb->first_page);		\
 	u##bits res = le##bits##_to_cpu(p->member);			\
-	kunmap_atomic(p, KM_USER0);					\
+	kunmap_atomic(p);					\
 	return res;							\
 }									\
 static inline void btrfs_set_##name(struct extent_buffer *eb,		\
 				    u##bits val)			\
 {									\
-	type *p = kmap_atomic(eb->first_page, KM_USER0);		\
+	type *p = kmap_atomic(eb->first_page);		\
 	p->member = cpu_to_le##bits(val);				\
-	kunmap_atomic(p, KM_USER0);					\
+	kunmap_atomic(p);					\
 }
 
 #define BTRFS_SETGET_STACK_FUNCS(name, type, member, bits)		\
fs/btrfs/disk-io.c +2 -2
Index: linux-2.6/fs/btrfs/disk-io.c
===================================================================
@@ -211,7 +211,7 @@ static int csum_tree_block(struct btrfs_
 	while (len > 0) {
 		err = map_private_extent_buffer(buf, offset, 32,
 					&map_token, &kaddr,
-					&map_start, &map_len, KM_USER0);
+					&map_start, &map_len);
 		if (err)
 			return 1;
 		cur_len = min(len, map_len - (offset - map_start));
@@ -219,7 +219,7 @@ static int csum_tree_block(struct btrfs_
 				      crc, cur_len);
 		len -= cur_len;
 		offset += cur_len;
-		unmap_extent_buffer(buf, map_token, KM_USER0);
+		unmap_extent_buffer(buf, map_token);
 	}
 	if (csum_size > sizeof(inline_result)) {
 		result = kzalloc(csum_size * sizeof(char), GFP_NOFS);
fs/btrfs/extent_io.c +28 -28

8 lines not on this page · raw message

fs/btrfs/file-item.c +5 -5
Index: linux-2.6/fs/btrfs/file-item.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/btrfs/inode.c +13 -13
Index: linux-2.6/fs/btrfs/inode.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/btrfs/struct-funcs.c +5 -5
Index: linux-2.6/fs/btrfs/struct-funcs.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/btrfs/zlib.c +4 -4
Index: linux-2.6/fs/btrfs/zlib.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/cifs/file.c +2 -2
Index: linux-2.6/fs/cifs/file.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/ecryptfs/mmap.c +2 -2
Index: linux-2.6/fs/ecryptfs/mmap.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/ecryptfs/read_write.c +4 -4
Index: linux-2.6/fs/ecryptfs/read_write.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/exec.c +2 -2
Index: linux-2.6/fs/exec.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/exofs/dir.c +2 -2
Index: linux-2.6/fs/exofs/dir.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/ext2/dir.c +2 -2
Index: linux-2.6/fs/ext2/dir.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/fuse/dev.c +4 -4
Index: linux-2.6/fs/fuse/dev.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/fuse/file.c +2 -2
Index: linux-2.6/fs/fuse/file.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/gfs2/aops.c +6 -6
Index: linux-2.6/fs/gfs2/aops.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/gfs2/lops.c +4 -4
Index: linux-2.6/fs/gfs2/lops.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/gfs2/quota.c +2 -2
Index: linux-2.6/fs/gfs2/quota.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/jbd/journal.c +6 -6
Index: linux-2.6/fs/jbd/journal.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/jbd/transaction.c +2 -2
Index: linux-2.6/fs/jbd/transaction.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/jbd2/commit.c +2 -2
Index: linux-2.6/fs/jbd2/commit.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/jbd2/journal.c +6 -6
Index: linux-2.6/fs/jbd2/journal.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/jbd2/transaction.c +2 -2
Index: linux-2.6/fs/jbd2/transaction.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/logfs/dir.c +9 -9
Index: linux-2.6/fs/logfs/dir.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/logfs/readwrite.c +19 -19
Index: linux-2.6/fs/logfs/readwrite.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/logfs/segment.c +2 -2
Index: linux-2.6/fs/logfs/segment.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/minix/dir.c +2 -2
Index: linux-2.6/fs/minix/dir.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/namei.c +2 -2
Index: linux-2.6/fs/namei.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nfs/dir.c +2 -2
Index: linux-2.6/fs/nfs/dir.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nfs/nfs2xdr.c +4 -4
Index: linux-2.6/fs/nfs/nfs2xdr.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nfs/nfs3xdr.c +4 -4
Index: linux-2.6/fs/nfs/nfs3xdr.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nfs/nfs4proc.c +2 -2
Index: linux-2.6/fs/nfs/nfs4proc.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nfs/nfs4xdr.c +5 -5
Index: linux-2.6/fs/nfs/nfs4xdr.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nilfs2/cpfile.c +47 -47

94 lines not on this page · raw message

fs/nilfs2/dat.c +19 -19
Index: linux-2.6/fs/nilfs2/dat.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nilfs2/dir.c +2 -2
Index: linux-2.6/fs/nilfs2/dir.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nilfs2/ifile.c +2 -2
Index: linux-2.6/fs/nilfs2/ifile.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nilfs2/mdt.c +2 -2
Index: linux-2.6/fs/nilfs2/mdt.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nilfs2/page.c +4 -4
Index: linux-2.6/fs/nilfs2/page.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nilfs2/recovery.c +2 -2
Index: linux-2.6/fs/nilfs2/recovery.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nilfs2/segbuf.c +2 -2
Index: linux-2.6/fs/nilfs2/segbuf.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nilfs2/segment.c +2 -2
Index: linux-2.6/fs/nilfs2/segment.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/nilfs2/sufile.c +29 -29

58 lines not on this page · raw message

fs/ntfs/aops.c +10 -10
Index: linux-2.6/fs/ntfs/aops.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/ntfs/attrib.c +10 -10
Index: linux-2.6/fs/ntfs/attrib.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/ntfs/file.c +8 -8
Index: linux-2.6/fs/ntfs/file.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/ntfs/super.c +4 -4
Index: linux-2.6/fs/ntfs/super.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/ocfs2/aops.c +8 -8
Index: linux-2.6/fs/ocfs2/aops.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/pipe.c +4 -4
Index: linux-2.6/fs/pipe.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/reiserfs/stree.c +2 -2
Index: linux-2.6/fs/reiserfs/stree.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/reiserfs/tail_conversion.c +2 -2
Index: linux-2.6/fs/reiserfs/tail_conversion.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/splice.c +2 -2
Index: linux-2.6/fs/splice.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/squashfs/file.c +4 -4
Index: linux-2.6/fs/squashfs/file.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/squashfs/symlink.c +2 -2
Index: linux-2.6/fs/squashfs/symlink.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/ubifs/file.c +2 -2
Index: linux-2.6/fs/ubifs/file.c
===================================================================

Lines of this file are not shown. View the raw message.

fs/udf/file.c +2 -2
Index: linux-2.6/fs/udf/file.c
===================================================================

Lines of this file are not shown. View the raw message.

include/linux/bio.h +2 -2
Index: linux-2.6/include/linux/bio.h
===================================================================

Lines of this file are not shown. View the raw message.

include/linux/highmem.h +14 -14
Index: linux-2.6/include/linux/highmem.h
===================================================================

Lines of this file are not shown. View the raw message.

kernel/debug/kdb/kdb_support.c +2 -2
Index: linux-2.6/kernel/debug/kdb/kdb_support.c
===================================================================

Lines of this file are not shown. View the raw message.

kernel/power/snapshot.c +14 -14
Index: linux-2.6/kernel/power/snapshot.c
===================================================================

Lines of this file are not shown. View the raw message.

lib/scatterlist.c +2 -2
Index: linux-2.6/lib/scatterlist.c
===================================================================

Lines of this file are not shown. View the raw message.

lib/swiotlb.c +1 -1
Index: linux-2.6/lib/swiotlb.c
===================================================================

Lines of this file are not shown. View the raw message.

mm/bounce.c +2 -2
Index: linux-2.6/mm/bounce.c
===================================================================

Lines of this file are not shown. View the raw message.

mm/filemap.c +4 -4
Index: linux-2.6/mm/filemap.c
===================================================================

Lines of this file are not shown. View the raw message.

mm/ksm.c +6 -6
Index: linux-2.6/mm/ksm.c
===================================================================

Lines of this file are not shown. View the raw message.

mm/memory.c +2 -2
Index: linux-2.6/mm/memory.c
===================================================================

Lines of this file are not shown. View the raw message.

mm/shmem.c +7 -7
Index: linux-2.6/mm/shmem.c
===================================================================

Lines of this file are not shown. View the raw message.

mm/swapfile.c +15 -15
Index: linux-2.6/mm/swapfile.c
===================================================================

Lines of this file are not shown. View the raw message.

mm/vmalloc.c +4 -4
Index: linux-2.6/mm/vmalloc.c
===================================================================

Lines of this file are not shown. View the raw message.

net/core/kmap_skb.h +2 -2
Index: linux-2.6/net/core/kmap_skb.h
===================================================================

Lines of this file are not shown. View the raw message.

net/rds/ib_recv.c +6 -6
Index: linux-2.6/net/rds/ib_recv.c
===================================================================

Lines of this file are not shown. View the raw message.

net/rds/info.c +3 -3
Index: linux-2.6/net/rds/info.c
===================================================================

Lines of this file are not shown. View the raw message.

net/rds/iw_recv.c +2 -2
Index: linux-2.6/net/rds/iw_recv.c
===================================================================

Lines of this file are not shown. View the raw message.

net/rds/loop.c +1 -1
Index: linux-2.6/net/rds/loop.c
===================================================================

Lines of this file are not shown. View the raw message.

net/rds/page.c +2 -2
Index: linux-2.6/net/rds/page.c
===================================================================

Lines of this file are not shown. View the raw message.

net/rds/tcp_recv.c +2 -2
Index: linux-2.6/net/rds/tcp_recv.c
===================================================================

Lines of this file are not shown. View the raw message.

net/sunrpc/auth_gss/gss_krb5_wrap.c +2 -2
Index: linux-2.6/net/sunrpc/auth_gss/gss_krb5_wrap.c
===================================================================

Lines of this file are not shown. View the raw message.

net/sunrpc/socklib.c +2 -2
Index: linux-2.6/net/sunrpc/socklib.c
===================================================================

Lines of this file are not shown. View the raw message.

net/sunrpc/xdr.c +8 -8
Index: linux-2.6/net/sunrpc/xdr.c
===================================================================

Lines of this file are not shown. View the raw message.

net/sunrpc/xprtrdma/rpc_rdma.c +2 -2
Index: linux-2.6/net/sunrpc/xprtrdma/rpc_rdma.c
===================================================================

Lines of this file are not shown. View the raw message.

The rest of this diff is not shown. View the raw message.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

Part of the diff is not shown here. View the raw message.

Acked-by on v1 4/6
#12 lore raw

Re: [RFC][PATCH 4/6] mm: Remove all KM_type arguments

Quoted 11 lines · Peter Zijlstra

Do the bulk of the km_type and KM_type removement by script.

git grep -l -e km_type -e KM_ | grep -v xfs | while read file; do

	quilt add $file;
         sed -i -e 's/,[[:space:]]*enum km_type type[[:space:]]*//g'         \
                -e 's/,[[:space:]]*KM_[[:digit:][:upper:]_]*[[:space:]]*//g' \
             $file;

done

Signature · 7 lines
All rights reversed

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to [email protected].  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
#13 lore raw

RFC PATCH 5/6 mm: Fix up KM_type argument removal fallout

In reply to Peter Zijlstra

Manual fixups of the previous patch

(i386 all{mod,yes}config driven}

---
 arch/arm/include/asm/pgtable.h       |    8 +++---
 arch/arm/lib/uaccess_with_memcpy.c   |    1 
 arch/arm/mm/highmem.c                |    8 ++----
 arch/frv/mm/highmem.c                |    7 +++--
 arch/mips/mm/highmem.c               |   22 ++++++++++--------
 arch/mn10300/include/asm/highmem.h   |    4 ++-
 arch/powerpc/include/asm/highmem.h   |    2 -
 arch/powerpc/mm/highmem.c            |    3 +-
 arch/sparc/mm/highmem.c              |    3 +-
 arch/x86/include/asm/pgtable_32.h    |   12 +++-------
 arch/x86/kernel/cpu/perf_event.c     |    5 +---
 arch/x86/mm/highmem_32.c             |    7 +++--
 arch/x86/mm/iomap_32.c               |    5 ++--
 drivers/block/drbd/drbd_bitmap.c     |   24 ++++++++++----------
 drivers/gpu/drm/i915/i915_gem.c      |    3 --
 drivers/gpu/drm/i915/intel_overlay.c |    3 --
 drivers/net/e1000/e1000_main.c       |    6 +----
 drivers/net/e1000e/netdev.c          |    6 +----
 drivers/scsi/cxgb3i/cxgb3i_pdu.c     |    3 --
 drivers/scsi/fcoe/fcoe.c             |    3 --
 drivers/scsi/libfc/fc_libfc.c        |    8 ++----
 drivers/scsi/libfc/fc_libfc.h        |    3 --
 drivers/staging/hv/netvsc_drv.c      |    3 --
 drivers/staging/hv/storvsc_drv.c     |   11 ++++-----
 fs/aio.c                             |    8 +++---
 fs/btrfs/ctree.c                     |   42 +++++++++++------------------------
 fs/btrfs/extent_io.c                 |   14 +++++------
 fs/btrfs/extent_io.h                 |    6 ++---
 include/crypto/scatterwalk.h         |   16 +------------
 include/linux/highmem.h              |   12 +++++-----
 include/linux/io-mapping.h           |   11 ++++-----
 lib/swiotlb.c                        |    3 --
 net/rds/ib_recv.c                    |    3 --
 net/rds/iw_recv.c                    |    3 --
 net/rds/rds.h                        |    2 -
 net/rds/recv.c                       |    2 -
 net/rds/tcp_recv.c                   |    6 +----
 net/sunrpc/xprtrdma/rpc_rdma.c       |    6 +----
 38 files changed, 126 insertions(+), 168 deletions(-)
arch/arm/mm/highmem.c +3 -5
Index: linux-2.6/arch/arm/mm/highmem.c
===================================================================
@@ -38,7 +38,7 @@ EXPORT_SYMBOL(kunmap);
 
 void *kmap_atomic(struct page *page)
 {
-	unsigned int idx;
+	unsigned int idx, type;
 	unsigned long vaddr;
 	void *kmap;
 
@@ -46,8 +46,6 @@ void *kmap_atomic(struct page *page)
 	if (!PageHighMem(page))
 		return page_address(page);
 
-	debug_kmap_atomic(type);
-
 #ifdef CONFIG_DEBUG_HIGHMEM
 	/*
 	 * There is no cache coherency issue when non VIVT, so force the
@@ -87,7 +85,7 @@ EXPORT_SYMBOL(kmap_atomic);
 void kunmap_atomic_notypecheck(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-	unsigned int idx;
+	unsigned int idx, type;
 
 	if (kvaddr >= (void *)FIXADDR_START) {
 		type = kmap_atomic_idx_pop();
@@ -112,7 +110,7 @@ EXPORT_SYMBOL(kunmap_atomic_notypecheck)
 
 void *kmap_atomic_pfn(unsigned long pfn)
 {
-	unsigned int idx;
+	unsigned int idx, type;
 	unsigned long vaddr;
 
 	pagefault_disable();
arch/mips/mm/highmem.c +13 -9
Index: linux-2.6/arch/mips/mm/highmem.c
===================================================================
@@ -45,6 +45,7 @@ void *__kmap_atomic(struct page *page)
 {
 	enum fixed_addresses idx;
 	unsigned long vaddr;
+	int type;
 
 	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
 	pagefault_disable();
@@ -67,7 +68,7 @@ EXPORT_SYMBOL(__kmap_atomic);
 void __kunmap_atomic_notypecheck(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-	unsigned int idx;
+	unsigned int type;
 
 	if (vaddr < FIXADDR_START) { // FIXME
 		pagefault_enable();
@@ -76,16 +77,18 @@ void __kunmap_atomic_notypecheck(void *k
 
 	type = kmap_atomic_idx_pop();
 #ifdef CONFIG_DEBUG_HIGHMEM
-	idx = type + KM_TYPE_NR * smp_processor_id();
+	{
+		unsigned int idx = type + KM_TYPE_NR * smp_processor_id();
 
-	BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
+		BUG_ON(vaddr != __fix_to_virt(FIX_KMAP_BEGIN + idx));
 
-	/*
-	 * force other mappings to Oops if they'll try to access
-	 * this pte without first remap it
-	 */
-	pte_clear(&init_mm, vaddr, kmap_pte-idx);
-	local_flush_tlb_one(vaddr);
+		/*
+		 * force other mappings to Oops if they'll try to access
+		 * this pte without first remap it
+		 */
+		pte_clear(&init_mm, vaddr, kmap_pte-idx);
+		local_flush_tlb_one(vaddr);
+	}
 #endif
 	pagefault_enable();
 }
@@ -99,6 +102,7 @@ void *kmap_atomic_pfn(unsigned long pfn)
 {
 	enum fixed_addresses idx;
 	unsigned long vaddr;
+	int type;
 
 	pagefault_disable();
 
arch/x86/include/asm/pgtable_32.h +4 -8
Index: linux-2.6/arch/x86/include/asm/pgtable_32.h
===================================================================
@@ -49,17 +49,13 @@ extern void set_pmd_pfn(unsigned long, u
 #endif
 
 #if defined(CONFIG_HIGHPTE)
-#define __KM_PTE			\
-	(in_nmi() ? KM_NMI_PTE : 	\
-	 in_irq() ? KM_IRQ_PTE :	\
-	 KM_PTE0)
-#define pte_offset_map(dir, address)					\
-	((pte_t *)kmap_atomic(pmd_page(*(dir)), __KM_PTE) +		\
+#define pte_offset_map(dir, address)				\
+	((pte_t *)kmap_atomic(pmd_page(*(dir))) +		\
 	 pte_index((address)))
-#define pte_offset_map_nested(dir, address)				\
+#define pte_offset_map_nested(dir, address)			\
 	((pte_t *)kmap_atomic(pmd_page(*(dir))) +		\
 	 pte_index((address)))
-#define pte_unmap(pte) kunmap_atomic((pte), __KM_PTE)
+#define pte_unmap(pte) kunmap_atomic((pte))
 #define pte_unmap_nested(pte) kunmap_atomic((pte))
 #else
 #define pte_offset_map(dir, address)					\
arch/x86/mm/iomap_32.c +3 -2
Index: linux-2.6/arch/x86/mm/iomap_32.c
===================================================================
@@ -59,6 +59,7 @@ void *kmap_atomic_prot_pfn(unsigned long
 {
 	enum fixed_addresses idx;
 	unsigned long vaddr;
+	int type;
 
 	pagefault_disable();
 
@@ -86,7 +87,7 @@ iomap_atomic_prot_pfn(unsigned long pfn,
 	if (!pat_enabled && pgprot_val(prot) == pgprot_val(PAGE_KERNEL_WC))
 		prot = PAGE_KERNEL_UC_MINUS;
 
-	return kmap_atomic_prot_pfn(pfn, type, prot);
+	return kmap_atomic_prot_pfn(pfn, prot);
 }
 EXPORT_SYMBOL_GPL(iomap_atomic_prot_pfn);
 
@@ -94,10 +95,10 @@ void
 iounmap_atomic(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-	enum fixed_addresses idx;
 
 	if (vaddr >= __fix_to_virt(FIX_KMAP_END) &&
 	    vaddr <= __fix_to_virt(FIX_KMAP_BEGIN)) {
+		unsigned int idx, type;
 
 		type = kmap_atomic_idx_pop();
 		idx = type + KM_TYPE_NR * smp_processor_id();
arch/mn10300/include/asm/highmem.h +3 -1
Index: linux-2.6/arch/mn10300/include/asm/highmem.h
===================================================================
@@ -72,8 +72,8 @@ static inline void kunmap(struct page *p
  */
 static inline unsigned long kmap_atomic(struct page *page)
 {
-	enum fixed_addresses idx;
 	unsigned long vaddr;
+	unsigned int idx, type;
 
 	pagefault_disable();
 	if (page < highmem_start_page)
@@ -94,6 +94,8 @@ static inline unsigned long kmap_atomic(
 
 static inline void kunmap_atomic_notypecheck(unsigned long vaddr)
 {
+	unsigned int type;
+
 	if (vaddr < FIXADDR_START) { /* FIXME */
 		pagefault_enable();
 		return;
drivers/staging/hv/netvsc_drv.c +1 -2
Index: linux-2.6/drivers/staging/hv/netvsc_drv.c
===================================================================
@@ -274,8 +274,7 @@ static int netvsc_recv_callback(struct h
 	 * hv_netvsc_packet cannot be deallocated
 	 */
 	for (i = 0; i < packet->PageBufferCount; i++) {
-		data = kmap_atomic(pfn_to_page(packet->PageBuffers[i].Pfn),
-					       KM_IRQ1);
+		data = kmap_atomic(pfn_to_page(packet->PageBuffers[i].Pfn));
 		data = (void *)(unsigned long)data +
 				packet->PageBuffers[i].Offset;
 
drivers/staging/hv/storvsc_drv.c +5 -6
Index: linux-2.6/drivers/staging/hv/storvsc_drv.c
===================================================================
@@ -488,8 +488,8 @@ static unsigned int copy_to_bounce_buffe
 	local_irq_save(flags);
 
 	for (i = 0; i < orig_sgl_count; i++) {
-		src_addr = (unsigned long)kmap_atomic(sg_page((&orig_sgl[i])),
-				KM_IRQ0) + orig_sgl[i].offset;
+		src_addr = (unsigned long)kmap_atomic(sg_page((&orig_sgl[i])))
+			+ orig_sgl[i].offset;
 		src = src_addr;
 		srclen = orig_sgl[i].length;
 
@@ -550,8 +550,8 @@ static unsigned int copy_from_bounce_buf
 	local_irq_save(flags);
 
 	for (i = 0; i < orig_sgl_count; i++) {
-		dest_addr = (unsigned long)kmap_atomic(sg_page((&orig_sgl[i])),
-					KM_IRQ0) + orig_sgl[i].offset;
+		dest_addr = (unsigned long)kmap_atomic(sg_page((&orig_sgl[i])))
+			+ orig_sgl[i].offset;
 		dest = dest_addr;
 		destlen = orig_sgl[i].length;
 		/* ASSERT(orig_sgl[i].offset + orig_sgl[i].length <= PAGE_SIZE); */
@@ -585,8 +585,7 @@ static unsigned int copy_from_bounce_buf
 			}
 		}
 
-		kunmap_atomic((void *)(dest_addr - orig_sgl[i].offset),
-			      KM_IRQ0);
+		kunmap_atomic((void *)(dest_addr - orig_sgl[i].offset));
 	}
 
 	local_irq_restore(flags);
net/sunrpc/xprtrdma/rpc_rdma.c +2 -4
Index: linux-2.6/net/sunrpc/xprtrdma/rpc_rdma.c
===================================================================
@@ -336,8 +336,7 @@ rpcrdma_inline_pullup(struct rpc_rqst *r
 			curlen = copy_len;
 		dprintk("RPC:       %s: page %d destp 0x%p len %d curlen %d\n",
 			__func__, i, destp, copy_len, curlen);
-		srcp = kmap_atomic(rqst->rq_snd_buf.pages[i],
-					KM_SKB_SUNRPC_DATA);
+		srcp = kmap_atomic(rqst->rq_snd_buf.pages[i]);
 		if (i == 0)
 			memcpy(destp, srcp+rqst->rq_snd_buf.page_base, curlen);
 		else
@@ -637,8 +636,7 @@ rpcrdma_inline_fixup(struct rpc_rqst *rq
 			dprintk("RPC:       %s: page %d"
 				" srcp 0x%p len %d curlen %d\n",
 				__func__, i, srcp, copy_len, curlen);
-			destp = kmap_atomic(rqst->rq_rcv_buf.pages[i],
-						KM_SKB_SUNRPC_DATA);
+			destp = kmap_atomic(rqst->rq_rcv_buf.pages[i]);
 			if (i == 0)
 				memcpy(destp + rqst->rq_rcv_buf.page_base,
 						srcp, curlen);
arch/x86/kernel/cpu/perf_event.c +2 -3
Index: linux-2.6/arch/x86/kernel/cpu/perf_event.c
===================================================================
@@ -49,7 +49,6 @@ static unsigned long
 copy_from_user_nmi(void *to, const void __user *from, unsigned long n)
 {
 	unsigned long offset, addr = (unsigned long)from;
-	int type = in_nmi() ? KM_NMI : KM_IRQ0;
 	unsigned long size, len = 0;
 	struct page *page;
 	void *map;
@@ -63,9 +62,9 @@ copy_from_user_nmi(void *to, const void 
 		offset = addr & (PAGE_SIZE - 1);
 		size = min(PAGE_SIZE - offset, n - len);
 
-		map = kmap_atomic(page, type);
+		map = kmap_atomic(page);
 		memcpy(to, map+offset, size);
-		kunmap_atomic(map, type);
+		kunmap_atomic(map);
 		put_page(page);
 
 		len  += size;
drivers/net/e1000/e1000_main.c +2 -4
Index: linux-2.6/drivers/net/e1000/e1000_main.c
===================================================================
@@ -3725,11 +3725,9 @@ static bool e1000_clean_jumbo_rx_irq(str
 				if (length <= copybreak &&
 				    skb_tailroom(skb) >= length) {
 					u8 *vaddr;
-					vaddr = kmap_atomic(buffer_info->page,
-					                    KM_SKB_DATA_SOFTIRQ);
+					vaddr = kmap_atomic(buffer_info->page);
 					memcpy(skb_tail_pointer(skb), vaddr, length);
-					kunmap_atomic(vaddr,
-					              KM_SKB_DATA_SOFTIRQ);
+					kunmap_atomic(vaddr);
 					/* re-use the page, so don't erase
 					 * buffer_info->page */
 					skb_put(skb, length);
include/crypto/scatterwalk.h +2 -14
Index: linux-2.6/include/crypto/scatterwalk.h
===================================================================
@@ -25,26 +25,14 @@
 #include <linux/scatterlist.h>
 #include <linux/sched.h>
 
-static inline enum km_type crypto_kmap_type(int out)
-{
-	enum km_type type;
-
-	if (in_softirq())
-		type = out * (KM_SOFTIRQ1 - KM_SOFTIRQ0) + KM_SOFTIRQ0;
-	else
-		type = out * (KM_USER1 - KM_USER0) + KM_USER0;
-
-	return type;
-}
-
 static inline void *crypto_kmap(struct page *page, int out)
 {
-	return kmap_atomic(page, crypto_kmap_type(out));
+	return kmap_atomic(page);
 }
 
 static inline void crypto_kunmap(void *vaddr, int out)
 {
-	kunmap_atomic(vaddr, crypto_kmap_type(out));
+	kunmap_atomic(vaddr);
 }
 
 static inline void crypto_yield(u32 flags)
include/linux/highmem.h +6 -6
Index: linux-2.6/include/linux/highmem.h
===================================================================
@@ -74,19 +74,19 @@ static inline void kunmap(struct page *p
 {
 }
 
-static inline void *kmap_atomic(struct page *page, enum km_type idx)
+static inline void *kmap_atomic(struct page *page)
 {
 	pagefault_disable();
 	return page_address(page);
 }
-#define kmap_atomic_prot(page, idx, prot)	kmap_atomic(page, idx)
+#define kmap_atomic_prot(page, prot)	kmap_atomic(page)
 
-static inline void kunmap_atomic_notypecheck(void *addr, enum km_type idx)
+static inline void kunmap_atomic_notypecheck(void *addr)
 {
 	pagefault_enable();
 }
 
-#define kmap_atomic_pfn(pfn, idx)	kmap_atomic(pfn_to_page(pfn), (idx))
+#define kmap_atomic_pfn(pfn)		kmap_atomic(pfn_to_page(pfn))
 #define kmap_atomic_to_page(ptr)	virt_to_page(ptr)
 
 #define kmap_flush_unused()	do {} while(0)
@@ -96,9 +96,9 @@ static inline void kunmap_atomic_notypec
 
 /* Prevent people trying to call kunmap_atomic() as if it were kunmap() */
 /* kunmap_atomic() should get the return value of kmap_atomic, not the page. */
-#define kunmap_atomic(addr, idx) do { \
+#define kunmap_atomic(addr) do { \
 		BUILD_BUG_ON(__same_type((addr), struct page *)); \
-		kunmap_atomic_notypecheck((addr), (idx)); \
+		kunmap_atomic_notypecheck(addr); \
 	} while (0)
 
 /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */
arch/frv/mm/highmem.c +4 -3
Index: linux-2.6/arch/frv/mm/highmem.c
===================================================================
@@ -40,6 +40,7 @@ struct page *kmap_atomic_to_page(void *p
 void *kmap_atomic(struct page *page)
 {
 	unsigned long paddr;
+	int type;
 
 	pagefault_disable();
 	type = kmap_atomic_idx_push();
@@ -65,9 +66,9 @@ void *kmap_atomic(struct page *page)
 }
 EXPORT_SYMBOL(kmap_atomic);
 
-void kunmap_atomic(void *kvaddr)
+void kunmap_atomic_notypecheck(void *kvaddr)
 {
-	type = kmap_atomic_idx_pop();
+	int type = kmap_atomic_idx_pop();
 	switch (type) {
         case 0:		__kunmap_atomic_primary(4, 6);	break;
         case 1:		__kunmap_atomic_primary(5, 7);	break;
@@ -84,5 +85,5 @@ void kunmap_atomic(void *kvaddr)
 	}
 	pagefault_enable();
 }
-EXPORT_SYMBOL(kunmap_atomic);
+EXPORT_SYMBOL(kunmap_atomic_notypecheck);
 
fs/btrfs/extent_io.c +7 -7
Index: linux-2.6/fs/btrfs/extent_io.c
===================================================================
@@ -3504,7 +3504,7 @@ void read_extent_buffer(struct extent_bu
 int map_private_extent_buffer(struct extent_buffer *eb, unsigned long start,
 			       unsigned long min_len, char **token, char **map,
 			       unsigned long *map_start,
-			       unsigned long *map_len, int km)
+			       unsigned long *map_len)
 {
 	size_t offset = start & (PAGE_CACHE_SIZE - 1);
 	char *kaddr;
@@ -3533,7 +3533,7 @@ int map_private_extent_buffer(struct ext
 	}
 
 	p = extent_buffer_page(eb, i);
-	kaddr = kmap_atomic(p, km);
+	kaddr = kmap_atomic(p);
 	*token = kaddr;
 	*map = kaddr + offset;
 	*map_len = PAGE_CACHE_SIZE - offset;
@@ -3544,17 +3544,17 @@ int map_extent_buffer(struct extent_buff
 		      unsigned long min_len,
 		      char **token, char **map,
 		      unsigned long *map_start,
-		      unsigned long *map_len, int km)
+		      unsigned long *map_len)
 {
 	int err;
 	int save = 0;
 	if (eb->map_token) {
-		unmap_extent_buffer(eb, eb->map_token, km);
+		unmap_extent_buffer(eb, eb->map_token);
 		eb->map_token = NULL;
 		save = 1;
 	}
 	err = map_private_extent_buffer(eb, start, min_len, token, map,
-				       map_start, map_len, km);
+				       map_start, map_len);
 	if (!err && save) {
 		eb->map_token = *token;
 		eb->kaddr = *map;
@@ -3564,9 +3564,9 @@ int map_extent_buffer(struct extent_buff
 	return err;
 }
 
-void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km)
+void unmap_extent_buffer(struct extent_buffer *eb, char *token)
 {
-	kunmap_atomic(token, km);
+	kunmap_atomic(token);
 }
 
 int memcmp_extent_buffer(struct extent_buffer *eb, const void *ptrv,
fs/btrfs/extent_io.h +3 -3
Index: linux-2.6/fs/btrfs/extent_io.h
===================================================================
@@ -297,12 +297,12 @@ int extent_buffer_uptodate(struct extent
 int map_extent_buffer(struct extent_buffer *eb, unsigned long offset,
 		      unsigned long min_len, char **token, char **map,
 		      unsigned long *map_start,
-		      unsigned long *map_len, int km);
+		      unsigned long *map_len);
 int map_private_extent_buffer(struct extent_buffer *eb, unsigned long offset,
 		      unsigned long min_len, char **token, char **map,
 		      unsigned long *map_start,
-		      unsigned long *map_len, int km);
-void unmap_extent_buffer(struct extent_buffer *eb, char *token, int km);
+		      unsigned long *map_len);
+void unmap_extent_buffer(struct extent_buffer *eb, char *token);
 int release_extent_buffer_tail_pages(struct extent_buffer *eb);
 int extent_range_uptodate(struct extent_io_tree *tree,
 			  u64 start, u64 end);
fs/btrfs/ctree.c +14 -28

126 lines not on this page · raw message

drivers/net/e1000e/netdev.c +2 -4
Index: linux-2.6/drivers/net/e1000e/netdev.c
===================================================================
@@ -1360,12 +1360,10 @@ static bool e1000_clean_jumbo_rx_irq(str
 				if (length <= copybreak &&
 				    skb_tailroom(skb) >= length) {
 					u8 *vaddr;
-					vaddr = kmap_atomic(buffer_info->page,
-					                   KM_SKB_DATA_SOFTIRQ);
+					vaddr = kmap_atomic(buffer_info->page);
 					memcpy(skb_tail_pointer(skb), vaddr,
 					       length);
-					kunmap_atomic(vaddr,
-					              KM_SKB_DATA_SOFTIRQ);
+					kunmap_atomic(vaddr);
 					/* re-use the page, so don't erase
 					 * buffer_info->page */
 					skb_put(skb, length);
drivers/scsi/cxgb3i/cxgb3i_pdu.c +1 -2
Index: linux-2.6/drivers/scsi/cxgb3i/cxgb3i_pdu.c
===================================================================
@@ -320,8 +320,7 @@ int cxgb3i_conn_init_pdu(struct iscsi_ta
 
 			/* data fits in the skb's headroom */
 			for (i = 0; i < tdata->nr_frags; i++, frag++) {
-				char *src = kmap_atomic(frag->page,
-							KM_SOFTIRQ0);
+				char *src = kmap_atomic(frag->page);
 
 				memcpy(dst, src+frag->page_offset, frag->size);
 				dst += frag->size;
fs/aio.c +4 -4
Index: linux-2.6/fs/aio.c
===================================================================
@@ -192,19 +192,19 @@ static int aio_setup_ring(struct kioctx 
 #define AIO_EVENTS_FIRST_PAGE	((PAGE_SIZE - sizeof(struct aio_ring)) / sizeof(struct io_event))
 #define AIO_EVENTS_OFFSET	(AIO_EVENTS_PER_PAGE - AIO_EVENTS_FIRST_PAGE)
 
-#define aio_ring_event(info, nr, km) ({					\
+#define aio_ring_event(info, nr) ({					\
 	unsigned pos = (nr) + AIO_EVENTS_OFFSET;			\
 	struct io_event *__event;					\
 	__event = kmap_atomic(						\
-			(info)->ring_pages[pos / AIO_EVENTS_PER_PAGE], km); \
+			(info)->ring_pages[pos / AIO_EVENTS_PER_PAGE]); \
 	__event += pos % AIO_EVENTS_PER_PAGE;				\
 	__event;							\
 })
 
-#define put_aio_ring_event(event, km) do {	\
+#define put_aio_ring_event(event) do {	\
 	struct io_event *__event = (event);	\
 	(void)__event;				\
-	kunmap_atomic((void *)((unsigned long)__event & PAGE_MASK), km); \
+	kunmap_atomic((void *)((unsigned long)__event & PAGE_MASK)); \
 } while(0)
 
 static void ctx_rcu_free(struct rcu_head *head)
lib/swiotlb.c +1 -2
Index: linux-2.6/lib/swiotlb.c
===================================================================
@@ -343,8 +343,7 @@ void swiotlb_bounce(phys_addr_t phys, ch
 			sz = min_t(size_t, PAGE_SIZE - offset, size);
 
 			local_irq_save(flags);
-			buffer = kmap_atomic(pfn_to_page(pfn),
-					     KM_BOUNCE_READ);
+			buffer = kmap_atomic(pfn_to_page(pfn));
 			if (dir == DMA_TO_DEVICE)
 				memcpy(dma_addr, buffer + offset, sz);
 			else
net/rds/rds.h +1 -1
Index: linux-2.6/net/rds/rds.h
===================================================================
@@ -617,7 +617,7 @@ void rds_inc_init(struct rds_incoming *i
 void rds_inc_addref(struct rds_incoming *inc);
 void rds_inc_put(struct rds_incoming *inc);
 void rds_recv_incoming(struct rds_connection *conn, __be32 saddr, __be32 daddr,
-		       struct rds_incoming *inc, gfp_t gfp, enum km_type km);
+		       struct rds_incoming *inc, gfp_t gfp);
 int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
 		size_t size, int msg_flags);
 void rds_clear_recv_queue(struct rds_sock *rs);
net/rds/recv.c +1 -1
Index: linux-2.6/net/rds/recv.c
===================================================================
@@ -156,7 +156,7 @@ static void rds_recv_incoming_exthdrs(st
  * tell us which roles the addrs in the conn are playing for this message.
  */
 void rds_recv_incoming(struct rds_connection *conn, __be32 saddr, __be32 daddr,
-		       struct rds_incoming *inc, gfp_t gfp, enum km_type km)
+		       struct rds_incoming *inc, gfp_t gfp)
 {
 	struct rds_sock *rs = NULL;
 	struct sock *sk;
drivers/scsi/fcoe/fcoe.c +1 -2
Index: linux-2.6/drivers/scsi/fcoe/fcoe.c
===================================================================
@@ -1456,8 +1456,7 @@ u32 fcoe_fc_crc(struct fc_frame *fp)
 		len = frag->size;
 		while (len > 0) {
 			clen = min(len, PAGE_SIZE - (off & ~PAGE_MASK));
-			data = kmap_atomic(frag->page + (off >> PAGE_SHIFT),
-					   KM_SKB_DATA_SOFTIRQ);
+			data = kmap_atomic(frag->page + (off >> PAGE_SHIFT));
 			crc = crc32(crc, data + (off & ~PAGE_MASK), clen);
 			kunmap_atomic(data);
 			off += clen;
drivers/scsi/libfc/fc_libfc.c +3 -5
Index: linux-2.6/drivers/scsi/libfc/fc_libfc.c
===================================================================
@@ -89,8 +89,7 @@ module_exit(libfc_exit);
  */
 u32 fc_copy_buffer_to_sglist(void *buf, size_t len,
 			     struct scatterlist *sg,
-			     u32 *nents, size_t *offset,
-			     enum km_type km_type, u32 *crc)
+			     u32 *nents, size_t *offset, u32 *crc)
 {
 	size_t remaining = len;
 	u32 copy_len = 0;
@@ -120,12 +119,11 @@ u32 fc_copy_buffer_to_sglist(void *buf, 
 		off = *offset + sg->offset;
 		sg_bytes = min(sg_bytes,
 			       (size_t)(PAGE_SIZE - (off & ~PAGE_MASK)));
-		page_addr = kmap_atomic(sg_page(sg) + (off >> PAGE_SHIFT),
-					km_type);
+		page_addr = kmap_atomic(sg_page(sg) + (off >> PAGE_SHIFT));
 		if (crc)
 			*crc = crc32(*crc, buf, sg_bytes);
 		memcpy((char *)page_addr + (off & ~PAGE_MASK), buf, sg_bytes);
-		kunmap_atomic(page_addr, km_type);
+		kunmap_atomic(page_addr);
 		buf += sg_bytes;
 		*offset += sg_bytes;
 		remaining -= sg_bytes;
drivers/scsi/libfc/fc_libfc.h +1 -2
Index: linux-2.6/drivers/scsi/libfc/fc_libfc.h
===================================================================
@@ -106,7 +106,6 @@ const char *fc_els_resp_type(struct fc_f
  */
 u32 fc_copy_buffer_to_sglist(void *buf, size_t len,
 			     struct scatterlist *sg,
-			     u32 *nents, size_t *offset,
-			     enum km_type km_type, u32 *crc);
+			     u32 *nents, size_t *offset, u32 *crc);
 
 #endif /* _FC_LIBFC_H_ */
net/rds/ib_recv.c +1 -2
Index: linux-2.6/net/rds/ib_recv.c
===================================================================
@@ -795,8 +795,7 @@ static void rds_ib_process_recv(struct r
 			rds_ib_cong_recv(conn, ibinc);
 		else {
 			rds_recv_incoming(conn, conn->c_faddr, conn->c_laddr,
-					  &ibinc->ii_inc, GFP_ATOMIC,
-					  KM_SOFTIRQ0);
+					  &ibinc->ii_inc, GFP_ATOMIC);
 			state->ack_next = be64_to_cpu(hdr->h_sequence);
 			state->ack_next_valid = 1;
 		}
net/rds/iw_recv.c +1 -2
Index: linux-2.6/net/rds/iw_recv.c
===================================================================
@@ -754,8 +754,7 @@ static void rds_iw_process_recv(struct r
 			rds_iw_cong_recv(conn, iwinc);
 		else {
 			rds_recv_incoming(conn, conn->c_faddr, conn->c_laddr,
-					  &iwinc->ii_inc, GFP_ATOMIC,
-					  KM_SOFTIRQ0);
+					  &iwinc->ii_inc, GFP_ATOMIC);
 			state->ack_next = be64_to_cpu(hdr->h_sequence);
 			state->ack_next_valid = 1;
 		}
net/rds/tcp_recv.c +2 -4
Index: linux-2.6/net/rds/tcp_recv.c
===================================================================
@@ -169,7 +169,6 @@ static void rds_tcp_cong_recv(struct rds
 struct rds_tcp_desc_arg {
 	struct rds_connection *conn;
 	gfp_t gfp;
-	enum km_type km;
 };
 
 static int rds_tcp_data_recv(read_descriptor_t *desc, struct sk_buff *skb,
@@ -255,7 +254,7 @@ static int rds_tcp_data_recv(read_descri
 			else
 				rds_recv_incoming(conn, conn->c_faddr,
 						  conn->c_laddr, &tinc->ti_inc,
-						  arg->gfp, arg->km);
+						  arg->gfp);
 
 			tc->t_tinc_hdr_rem = sizeof(struct rds_header);
 			tc->t_tinc_data_rem = 0;
@@ -272,7 +271,7 @@ out:
 }
 
 /* the caller has to hold the sock lock */
-int rds_tcp_read_sock(struct rds_connection *conn, gfp_t gfp, enum km_type km)
+int rds_tcp_read_sock(struct rds_connection *conn, gfp_t gfp)
 {
 	struct rds_tcp_connection *tc = conn->c_transport_data;
 	struct socket *sock = tc->t_sock;
@@ -282,7 +281,6 @@ int rds_tcp_read_sock(struct rds_connect
 	/* It's like glib in the kernel! */
 	arg.conn = conn;
 	arg.gfp = gfp;
-	arg.km = km;
 	desc.arg.data = &arg;
 	desc.error = 0;
 	desc.count = 1; /* give more than one skb per call */
arch/x86/mm/highmem_32.c +4 -3
Index: linux-2.6/arch/x86/mm/highmem_32.c
===================================================================
@@ -31,6 +31,7 @@ void *kmap_atomic_prot(struct page *page
 {
 	enum fixed_addresses idx;
 	unsigned long vaddr;
+	int type;
 
 	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
 	pagefault_disable();
@@ -49,16 +50,16 @@ void *kmap_atomic_prot(struct page *page
 
 void *kmap_atomic(struct page *page)
 {
-	return kmap_atomic_prot(page, type, kmap_prot);
+	return kmap_atomic_prot(page, kmap_prot);
 }
 
 void kunmap_atomic_notypecheck(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-	enum fixed_addresses idx;
 
 	if (vaddr >= __fix_to_virt(FIX_KMAP_END) &&
 	    vaddr <= __fix_to_virt(FIX_KMAP_BEGIN)) {
+		unsigned int idx, type;
 
 		type = kmap_atomic_idx_pop();
 		idx = type + KM_TYPE_NR * smp_processor_id();
@@ -91,7 +92,7 @@ void kunmap_atomic_notypecheck(void *kva
  */
 void *kmap_atomic_pfn(unsigned long pfn)
 {
-	return kmap_atomic_prot_pfn(pfn, type, kmap_prot);
+	return kmap_atomic_prot_pfn(pfn, kmap_prot);
 }
 EXPORT_SYMBOL_GPL(kmap_atomic_pfn); /* temporarily in use by i915 GEM until vmap */
 
drivers/block/drbd/drbd_bitmap.c +12 -12
Index: linux-2.6/drivers/block/drbd/drbd_bitmap.c
===================================================================
@@ -85,7 +85,7 @@ struct drbd_bitmap {
 #define BM_P_VMALLOCED  2
 
 static int __bm_change_bits_to(struct drbd_conf *mdev, const unsigned long s,
-			       unsigned long e, int val, const enum km_type km);
+			       unsigned long e, int val);
 
 static int bm_is_locked(struct drbd_bitmap *b)
 {
@@ -155,7 +155,7 @@ void drbd_bm_unlock(struct drbd_conf *md
 }
 
 /* word offset to long pointer */
-static unsigned long *__bm_map_paddr(struct drbd_bitmap *b, unsigned long offset, const enum km_type km)
+static unsigned long *__bm_map_paddr(struct drbd_bitmap *b, unsigned long offset)
 {
 	struct page *page;
 	unsigned long page_nr;
@@ -165,7 +165,7 @@ static unsigned long *__bm_map_paddr(str
 	BUG_ON(page_nr >= b->bm_number_of_pages);
 	page = b->bm_pages[page_nr];
 
-	return (unsigned long *) kmap_atomic(page, km);
+	return (unsigned long *) kmap_atomic(page);
 }
 
 static unsigned long * bm_map_paddr(struct drbd_bitmap *b, unsigned long offset)
@@ -173,9 +173,9 @@ static unsigned long * bm_map_paddr(stru
 	return __bm_map_paddr(b, offset);
 }
 
-static void __bm_unmap(unsigned long *p_addr, const enum km_type km)
+static void __bm_unmap(unsigned long *p_addr)
 {
-	kunmap_atomic(p_addr, km);
+	kunmap_atomic(p_addr);
 };
 
 static void bm_unmap(unsigned long *p_addr)
@@ -934,7 +934,7 @@ int drbd_bm_write_sect(struct drbd_conf 
  */
 #define BPP_MASK ((1UL << (PAGE_SHIFT+3)) - 1)
 static unsigned long __bm_find_next(struct drbd_conf *mdev, unsigned long bm_fo,
-	const int find_zero_bit, const enum km_type km)
+	const int find_zero_bit)
 {
 	struct drbd_bitmap *b = mdev->bitmap;
 	unsigned long i = -1UL;
@@ -948,14 +948,14 @@ static unsigned long __bm_find_next(stru
 			unsigned long offset;
 			bit_offset = bm_fo & ~BPP_MASK; /* bit offset of the page */
 			offset = bit_offset >> LN2_BPL;    /* word offset of the page */
-			p_addr = __bm_map_paddr(b, offset, km);
+			p_addr = __bm_map_paddr(b, offset);
 
 			if (find_zero_bit)
 				i = find_next_zero_bit(p_addr, PAGE_SIZE*8, bm_fo & BPP_MASK);
 			else
 				i = find_next_bit(p_addr, PAGE_SIZE*8, bm_fo & BPP_MASK);
 
-			__bm_unmap(p_addr, km);
+			__bm_unmap(p_addr);
 			if (i < PAGE_SIZE*8) {
 				i = bit_offset + i;
 				if (i >= b->bm_bits)
@@ -1023,7 +1023,7 @@ unsigned long _drbd_bm_find_next_zero(st
  * expected to be called for only a few bits (e - s about BITS_PER_LONG).
  * Must hold bitmap lock already. */
 static int __bm_change_bits_to(struct drbd_conf *mdev, const unsigned long s,
-	unsigned long e, int val, const enum km_type km)
+	unsigned long e, int val)
 {
 	struct drbd_bitmap *b = mdev->bitmap;
 	unsigned long *p_addr = NULL;
@@ -1041,8 +1041,8 @@ static int __bm_change_bits_to(struct dr
 		unsigned long page_nr = offset >> (PAGE_SHIFT - LN2_BPL + 3);
 		if (page_nr != last_page_nr) {
 			if (p_addr)
-				__bm_unmap(p_addr, km);
-			p_addr = __bm_map_paddr(b, offset, km);
+				__bm_unmap(p_addr);
+			p_addr = __bm_map_paddr(b, offset);
 			last_page_nr = page_nr;
 		}
 		if (val)
@@ -1051,7 +1051,7 @@ static int __bm_change_bits_to(struct dr
 			c -= (0 != __test_and_clear_bit(bitnr & BPP_MASK, p_addr));
 	}
 	if (p_addr)
-		__bm_unmap(p_addr, km);
+		__bm_unmap(p_addr);
 	b->bm_set += c;
 	return c;
 }
include/linux/io-mapping.h +5 -6
Index: linux-2.6/include/linux/io-mapping.h
===================================================================
@@ -81,8 +81,7 @@ io_mapping_free(struct io_mapping *mappi
 /* Atomic map/unmap */
 static inline void *
 io_mapping_map_atomic_wc(struct io_mapping *mapping,
-			 unsigned long offset,
-			 int slot)
+			 unsigned long offset)
 {
 	resource_size_t phys_addr;
 	unsigned long pfn;
@@ -90,13 +89,13 @@ io_mapping_map_atomic_wc(struct io_mappi
 	BUG_ON(offset >= mapping->size);
 	phys_addr = mapping->base + offset;
 	pfn = (unsigned long) (phys_addr >> PAGE_SHIFT);
-	return iomap_atomic_prot_pfn(pfn, slot, mapping->prot);
+	return iomap_atomic_prot_pfn(pfn, mapping->prot);
 }
 
 static inline void
-io_mapping_unmap_atomic(void *vaddr, int slot)
+io_mapping_unmap_atomic(void *vaddr)
 {
-	iounmap_atomic(vaddr, slot);
+	iounmap_atomic(vaddr);
 }
 
 static inline void *
@@ -144,7 +143,7 @@ io_mapping_map_atomic_wc(struct io_mappi
 }
 
 static inline void
-io_mapping_unmap_atomic(void *vaddr, int slot)
+io_mapping_unmap_atomic(void *vaddr)
 {
 }
 
drivers/gpu/drm/i915/i915_gem.c +1 -2
Index: linux-2.6/drivers/gpu/drm/i915/i915_gem.c
===================================================================
@@ -3487,8 +3487,7 @@ i915_gem_object_pin_and_relocate(struct 
 		reloc_offset = obj_priv->gtt_offset + reloc->offset;
 		reloc_page = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping,
 						      (reloc_offset &
-						       ~(PAGE_SIZE - 1)),
-						      KM_USER0);
+						       ~(PAGE_SIZE - 1)));
 		reloc_entry = (uint32_t __iomem *)(reloc_page +
 						   (reloc_offset & (PAGE_SIZE - 1)));
 		reloc_val = target_obj_priv->gtt_offset + reloc->delta;
arch/arm/lib/uaccess_with_memcpy.c +1 -0
Index: linux-2.6/arch/arm/lib/uaccess_with_memcpy.c
===================================================================
@@ -17,6 +17,7 @@
 #include <linux/sched.h>
 #include <linux/hardirq.h> /* for in_atomic() */
 #include <linux/gfp.h>
+#include <linux/highmem.h>
 #include <asm/current.h>
 #include <asm/page.h>
 
drivers/gpu/drm/i915/intel_overlay.c +1 -2
Index: linux-2.6/drivers/gpu/drm/i915/intel_overlay.c
===================================================================
@@ -185,8 +185,7 @@ static struct overlay_registers *intel_o
 
 	if (OVERLAY_NONPHYSICAL(overlay->dev)) {
 		regs = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping,
-						overlay->reg_bo->gtt_offset,
-						KM_USER0);
+						overlay->reg_bo->gtt_offset);
 
 		if (!regs) {
 			DRM_ERROR("failed to map overlay regs in GTT\n");
arch/arm/include/asm/pgtable.h +4 -4
Index: linux-2.6/arch/arm/include/asm/pgtable.h
===================================================================
@@ -269,11 +269,11 @@ extern struct page *empty_zero_page;
 #define pte_unmap_nested(pte)		__pte_unmap(pte)
 
 #ifndef CONFIG_HIGHPTE
-#define __pte_map(dir,km)	pmd_page_vaddr(*(dir))
-#define __pte_unmap(pte,km)	do { } while (0)
+#define __pte_map(dir)		pmd_page_vaddr(*(dir))
+#define __pte_unmap(pte)	do { } while (0)
 #else
-#define __pte_map(dir,km)	((pte_t *)kmap_atomic(pmd_page(*(dir)), km) + PTRS_PER_PTE)
-#define __pte_unmap(pte,km)	kunmap_atomic((pte - PTRS_PER_PTE), km)
+#define __pte_map(dir)		((pte_t *)kmap_atomic(pmd_page(*(dir))) + PTRS_PER_PTE)
+#define __pte_unmap(pte)	kunmap_atomic((pte - PTRS_PER_PTE))
 #endif
 
 #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext)
arch/powerpc/include/asm/highmem.h +1 -1
Index: linux-2.6/arch/powerpc/include/asm/highmem.h
===================================================================
@@ -82,7 +82,7 @@ static inline void kunmap(struct page *p
 
 static inline void *kmap_atomic(struct page *page)
 {
-	return kmap_atomic_prot(page, type, kmap_prot);
+	return kmap_atomic_prot(page, kmap_prot);
 }
 
 static inline struct page *kmap_atomic_to_page(void *ptr)
arch/powerpc/mm/highmem.c +2 -1
Index: linux-2.6/arch/powerpc/mm/highmem.c
===================================================================
@@ -31,7 +31,7 @@
  */
 void *kmap_atomic_prot(struct page *page, pgprot_t prot)
 {
-	unsigned int idx;
+	unsigned int idx, type;
 	unsigned long vaddr;
 
 	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
@@ -55,6 +55,7 @@ EXPORT_SYMBOL(kmap_atomic_prot);
 void kunmap_atomic_notypecheck(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
+	unsigned int type;
 
 	if (vaddr < __fix_to_virt(FIX_KMAP_END)) {
 		pagefault_enable();
arch/sparc/mm/highmem.c +2 -1
Index: linux-2.6/arch/sparc/mm/highmem.c
===================================================================
@@ -31,7 +31,7 @@
 
 void *kmap_atomic(struct page *page)
 {
-	unsigned long idx;
+	unsigned long idx, type;
 	unsigned long vaddr;
 
 	/* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
@@ -68,6 +68,7 @@ EXPORT_SYMBOL(kmap_atomic);
 void kunmap_atomic_notypecheck(void *kvaddr)
 {
 	unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
+	unsigned long type;
 
 	if (vaddr < FIXADDR_START) { // FIXME
 		pagefault_enable();

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

Acked-by on v1 5/6
#14 lore raw

Re: [RFC][PATCH 5/6] mm: Fix up KM_type argument removal fallout

Quoted 5 lines · Peter Zijlstra

Manual fixups of the previous patch

(i386 all{mod,yes}config driven}

Signature · 7 lines
All rights reversed

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to [email protected].  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
#15 lore raw

RFC PATCH 6/6 mm: Remove pte_*map_nested()

In reply to Peter Zijlstra

Since we no longer need to provide KM_type, the whole pte_*map_nested() API is now redundant, remove it.

---
 arch/alpha/include/asm/pgtable.h         |    2 --
 arch/arm/include/asm/pgtable.h           |    2 --
 arch/arm/mm/fault-armv.c                 |    4 ++--
 arch/arm/mm/pgd.c                        |    4 ++--
 arch/avr32/include/asm/pgtable.h         |    2 --
 arch/cris/include/asm/pgtable.h          |    2 --
 arch/frv/include/asm/pgtable.h           |    5 -----
 arch/ia64/include/asm/pgtable.h          |    2 --
 arch/m32r/include/asm/pgtable.h          |    2 --
 arch/m68k/include/asm/motorola_pgtable.h |    2 --
 arch/m68k/include/asm/sun3_pgtable.h     |    2 --
 arch/microblaze/include/asm/pgtable.h    |    3 ---
 arch/mips/include/asm/pgtable-32.h       |    3 ---
 arch/mips/include/asm/pgtable-64.h       |    3 ---
 arch/mn10300/include/asm/pgtable.h       |    2 --
 arch/parisc/include/asm/pgtable.h        |    2 --
 arch/powerpc/include/asm/pgtable-ppc32.h |    4 ----
 arch/powerpc/include/asm/pgtable-ppc64.h |    2 --
 arch/s390/include/asm/pgtable.h          |    2 --
 arch/score/include/asm/pgtable.h         |    3 ---
 arch/sh/include/asm/pgtable_32.h         |    3 ---
 arch/sh/include/asm/pgtable_64.h         |    2 --
 arch/sparc/include/asm/pgtable_32.h      |    3 ---
 arch/sparc/include/asm/pgtable_64.h      |    2 --
 arch/um/include/asm/pgtable.h            |    2 --
 arch/x86/include/asm/pgtable_32.h        |    6 ------
 arch/x86/include/asm/pgtable_64.h        |    2 --
 arch/xtensa/include/asm/pgtable.h        |    3 ---
 mm/memory.c                              |    4 ++--
 mm/mremap.c                              |    4 ++--
 30 files changed, 8 insertions(+), 76 deletions(-)
arch/alpha/include/asm/pgtable.h +0 -2
Index: linux-2.6/arch/alpha/include/asm/pgtable.h
===================================================================
@@ -318,9 +318,7 @@ extern inline pte_t * pte_offset_kernel(
 }
 
 #define pte_offset_map(dir,addr)	pte_offset_kernel((dir),(addr))
-#define pte_offset_map_nested(dir,addr)	pte_offset_kernel((dir),(addr))
 #define pte_unmap(pte)			do { } while (0)
-#define pte_unmap_nested(pte)		do { } while (0)
 
 extern pgd_t swapper_pg_dir[1024];
 
arch/arm/include/asm/pgtable.h +0 -2
Index: linux-2.6/arch/arm/include/asm/pgtable.h
===================================================================
@@ -264,9 +264,7 @@ extern struct page *empty_zero_page;
 #define pte_offset_kernel(dir,addr)	(pmd_page_vaddr(*(dir)) + __pte_index(addr))
 
 #define pte_offset_map(dir,addr)	(__pte_map(dir) + __pte_index(addr))
-#define pte_offset_map_nested(dir,addr)	(__pte_map(dir) + __pte_index(addr))
 #define pte_unmap(pte)			__pte_unmap(pte)
-#define pte_unmap_nested(pte)		__pte_unmap(pte)
 
 #ifndef CONFIG_HIGHPTE
 #define __pte_map(dir)		pmd_page_vaddr(*(dir))
arch/arm/mm/fault-armv.c +2 -2
Index: linux-2.6/arch/arm/mm/fault-armv.c
===================================================================
@@ -88,13 +88,13 @@ static int adjust_pte(struct vm_area_str
 	 * open-code the spin-locking.
 	 */
 	ptl = pte_lockptr(vma->vm_mm, pmd);
-	pte = pte_offset_map_nested(pmd, address);
+	pte = pte_offset_map(pmd, address);
 	spin_lock(ptl);
 
 	ret = do_adjust_pte(vma, address, pfn, pte);
 
 	spin_unlock(ptl);
-	pte_unmap_nested(pte);
+	pte_unmap(pte);
 
 	return ret;
 }
arch/arm/mm/pgd.c +2 -2
Index: linux-2.6/arch/arm/mm/pgd.c
===================================================================
@@ -57,9 +57,9 @@ pgd_t *get_pgd_slow(struct mm_struct *mm
 			goto no_pte;
 
 		init_pmd = pmd_offset(init_pgd, 0);
-		init_pte = pte_offset_map_nested(init_pmd, 0);
+		init_pte = pte_offset_map(init_pmd, 0);
 		set_pte_ext(new_pte, *init_pte, 0);
-		pte_unmap_nested(init_pte);
+		pte_unmap(init_pte);
 		pte_unmap(new_pte);
 	}
 
arch/avr32/include/asm/pgtable.h +0 -2
Index: linux-2.6/arch/avr32/include/asm/pgtable.h
===================================================================
@@ -319,9 +319,7 @@ static inline pte_t pte_modify(pte_t pte
 #define pte_offset_kernel(dir, address)					\
 	((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(address))
 #define pte_offset_map(dir, address) pte_offset_kernel(dir, address)
-#define pte_offset_map_nested(dir, address) pte_offset_kernel(dir, address)
 #define pte_unmap(pte)		do { } while (0)
-#define pte_unmap_nested(pte)	do { } while (0)
 
 struct vm_area_struct;
 extern void update_mmu_cache(struct vm_area_struct * vma,
arch/cris/include/asm/pgtable.h +0 -2
Index: linux-2.6/arch/cris/include/asm/pgtable.h
===================================================================
@@ -248,10 +248,8 @@ static inline pgd_t * pgd_offset(const s
 	((pte_t *) pmd_page_vaddr(*(dir)) +  __pte_offset(address))
 #define pte_offset_map(dir, address) \
 	((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address))
-#define pte_offset_map_nested(dir, address) pte_offset_map(dir, address)
 
 #define pte_unmap(pte) do { } while (0)
-#define pte_unmap_nested(pte) do { } while (0)
 #define pte_pfn(x)		((unsigned long)(__va((x).pte)) >> PAGE_SHIFT)
 #define pfn_pte(pfn, prot)	__pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
 
arch/frv/include/asm/pgtable.h +0 -5
Index: linux-2.6/arch/frv/include/asm/pgtable.h
===================================================================
@@ -452,16 +452,11 @@ static inline pte_t pte_modify(pte_t pte
 #if defined(CONFIG_HIGHPTE)
 #define pte_offset_map(dir, address) \
 	((pte_t *)kmap_atomic(pmd_page(*(dir))) + pte_index(address))
-#define pte_offset_map_nested(dir, address) \
-	((pte_t *)kmap_atomic(pmd_page(*(dir))) + pte_index(address))
 #define pte_unmap(pte) kunmap_atomic(pte)
-#define pte_unmap_nested(pte) kunmap_atomic((pte))
 #else
 #define pte_offset_map(dir, address) \
 	((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address))
-#define pte_offset_map_nested(dir, address) pte_offset_map((dir), (address))
 #define pte_unmap(pte) do { } while (0)
-#define pte_unmap_nested(pte) do { } while (0)
 #endif
 
 /*
arch/ia64/include/asm/pgtable.h +0 -2
Index: linux-2.6/arch/ia64/include/asm/pgtable.h
===================================================================
@@ -406,9 +406,7 @@ pgd_offset (const struct mm_struct *mm, 
 #define pte_index(addr)	 	(((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
 #define pte_offset_kernel(dir,addr)	((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(addr))
 #define pte_offset_map(dir,addr)	pte_offset_kernel(dir, addr)
-#define pte_offset_map_nested(dir,addr)	pte_offset_map(dir, addr)
 #define pte_unmap(pte)			do { } while (0)
-#define pte_unmap_nested(pte)		do { } while (0)
 
 /* atomic versions of the some PTE manipulations: */
 
arch/m32r/include/asm/pgtable.h +0 -2
Index: linux-2.6/arch/m32r/include/asm/pgtable.h
===================================================================
@@ -332,9 +332,7 @@ static inline void pmd_set(pmd_t * pmdp,
 	((pte_t *)pmd_page_vaddr(*(dir)) + pte_index(address))
 #define pte_offset_map(dir, address)	\
 	((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address))
-#define pte_offset_map_nested(dir, address)	pte_offset_map(dir, address)
 #define pte_unmap(pte)		do { } while (0)
-#define pte_unmap_nested(pte)	do { } while (0)
 
 /* Encode and de-code a swap entry */
 #define __swp_type(x)			(((x).val >> 2) & 0x1f)
arch/m68k/include/asm/motorola_pgtable.h +0 -2
Index: linux-2.6/arch/m68k/include/asm/motorola_pgtable.h
===================================================================
@@ -221,9 +221,7 @@ static inline pte_t *pte_offset_kernel(p
 }
 
 #define pte_offset_map(pmdp,address) ((pte_t *)__pmd_page(*pmdp) + (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)))
-#define pte_offset_map_nested(pmdp, address) pte_offset_map(pmdp, address)
 #define pte_unmap(pte)		((void)0)
-#define pte_unmap_nested(pte)	((void)0)
 
 /*
  * Allocate and free page tables. The xxx_kernel() versions are
arch/m68k/include/asm/sun3_pgtable.h +0 -2
Index: linux-2.6/arch/m68k/include/asm/sun3_pgtable.h
===================================================================
@@ -219,9 +219,7 @@ static inline pte_t pgoff_to_pte(unsigne
 #define pte_offset_kernel(pmd, address) ((pte_t *) __pmd_page(*pmd) + pte_index(address))
 /* FIXME: should we bother with kmap() here? */
 #define pte_offset_map(pmd, address) ((pte_t *)kmap(pmd_page(*pmd)) + pte_index(address))
-#define pte_offset_map_nested(pmd, address) pte_offset_map(pmd, address)
 #define pte_unmap(pte) kunmap(pte)
-#define pte_unmap_nested(pte) kunmap(pte)
 
 /* Macros to (de)construct the fake PTEs representing swap pages. */
 #define __swp_type(x)		((x).val & 0x7F)
arch/microblaze/include/asm/pgtable.h +0 -3
Index: linux-2.6/arch/microblaze/include/asm/pgtable.h
===================================================================
@@ -498,11 +498,8 @@ static inline pmd_t *pmd_offset(pgd_t *d
 	((pte_t *) pmd_page_kernel(*(dir)) + pte_index(addr))
 #define pte_offset_map(dir, addr)		\
 	((pte_t *) kmap_atomic(pmd_page(*(dir))) + pte_index(addr))
-#define pte_offset_map_nested(dir, addr)	\
-	((pte_t *) kmap_atomic(pmd_page(*(dir))) + pte_index(addr))
 
 #define pte_unmap(pte)		kunmap_atomic(pte)
-#define pte_unmap_nested(pte)	kunmap_atomic(pte)
 
 /* Encode and decode a nonlinear file mapping entry */
 #define PTE_FILE_MAX_BITS	29
arch/mips/include/asm/pgtable-32.h +0 -3
Index: linux-2.6/arch/mips/include/asm/pgtable-32.h
===================================================================
@@ -154,10 +154,7 @@ pfn_pte(unsigned long pfn, pgprot_t prot
 
 #define pte_offset_map(dir, address)                                    \
 	((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address))
-#define pte_offset_map_nested(dir, address)                             \
-	((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address))
 #define pte_unmap(pte) ((void)(pte))
-#define pte_unmap_nested(pte) ((void)(pte))
 
 #if defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX)
 
arch/mips/include/asm/pgtable-64.h +0 -3
Index: linux-2.6/arch/mips/include/asm/pgtable-64.h
===================================================================
@@ -257,10 +257,7 @@ static inline pmd_t *pmd_offset(pud_t * 
 	((pte_t *) pmd_page_vaddr(*(dir)) + __pte_offset(address))
 #define pte_offset_map(dir, address)					\
 	((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address))
-#define pte_offset_map_nested(dir, address)				\
-	((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address))
 #define pte_unmap(pte) ((void)(pte))
-#define pte_unmap_nested(pte) ((void)(pte))
 
 /*
  * Initialize a new pgd / pmd table with invalid pointers.
arch/mn10300/include/asm/pgtable.h +0 -2
Index: linux-2.6/arch/mn10300/include/asm/pgtable.h
===================================================================
@@ -457,9 +457,7 @@ static inline int set_kernel_exec(unsign
 
 #define pte_offset_map(dir, address) \
 	((pte_t *) page_address(pmd_page(*(dir))) + pte_index(address))
-#define pte_offset_map_nested(dir, address) pte_offset_map(dir, address)
 #define pte_unmap(pte)		do {} while (0)
-#define pte_unmap_nested(pte)	do {} while (0)
 
 /*
  * The MN10300 has external MMU info in the form of a TLB: this is adapted from
arch/parisc/include/asm/pgtable.h +0 -2
Index: linux-2.6/arch/parisc/include/asm/pgtable.h
===================================================================
@@ -397,9 +397,7 @@ static inline pte_t pte_modify(pte_t pte
 #define pte_offset_kernel(pmd, address) \
 	((pte_t *) pmd_page_vaddr(*(pmd)) + pte_index(address))
 #define pte_offset_map(pmd, address) pte_offset_kernel(pmd, address)
-#define pte_offset_map_nested(pmd, address) pte_offset_kernel(pmd, address)
 #define pte_unmap(pte) do { } while (0)
-#define pte_unmap_nested(pte) do { } while (0)
 
 #define pte_unmap(pte)			do { } while (0)
 #define pte_unmap_nested(pte)		do { } while (0)
arch/powerpc/include/asm/pgtable-ppc32.h +0 -4
Index: linux-2.6/arch/powerpc/include/asm/pgtable-ppc32.h
===================================================================
@@ -309,11 +309,7 @@ static inline void __ptep_set_access_fla
 	((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(addr))
 #define pte_offset_map(dir, addr)		\
 	((pte_t *) kmap_atomic(pmd_page(*(dir))) + pte_index(addr))
-#define pte_offset_map_nested(dir, addr)	\
-	((pte_t *) kmap_atomic(pmd_page(*(dir))) + pte_index(addr))
-
 #define pte_unmap(pte)		kunmap_atomic(pte)
-#define pte_unmap_nested(pte)	kunmap_atomic(pte)
 
 /*
  * Encode and decode a swap entry.
arch/powerpc/include/asm/pgtable-ppc64.h +0 -2
Index: linux-2.6/arch/powerpc/include/asm/pgtable-ppc64.h
===================================================================
@@ -193,9 +193,7 @@
   (((pte_t *) pmd_page_vaddr(*(dir))) + (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)))
 
 #define pte_offset_map(dir,addr)	pte_offset_kernel((dir), (addr))
-#define pte_offset_map_nested(dir,addr)	pte_offset_kernel((dir), (addr))
 #define pte_unmap(pte)			do { } while(0)
-#define pte_unmap_nested(pte)		do { } while(0)
 
 /* to find an entry in a kernel page-table-directory */
 /* This now only contains the vmalloc pages */
arch/s390/include/asm/pgtable.h +0 -2
Index: linux-2.6/arch/s390/include/asm/pgtable.h
===================================================================
@@ -1046,9 +1046,7 @@ static inline pmd_t *pmd_offset(pud_t *p
 #define pte_offset(pmd, addr) ((pte_t *) pmd_deref(*(pmd)) + pte_index(addr))
 #define pte_offset_kernel(pmd, address) pte_offset(pmd,address)
 #define pte_offset_map(pmd, address) pte_offset_kernel(pmd, address)
-#define pte_offset_map_nested(pmd, address) pte_offset_kernel(pmd, address)
 #define pte_unmap(pte) do { } while (0)
-#define pte_unmap_nested(pte) do { } while (0)
 
 /*
  * 31 bit swap entry format:
arch/score/include/asm/pgtable.h +0 -3
Index: linux-2.6/arch/score/include/asm/pgtable.h
===================================================================
@@ -88,10 +88,7 @@ static inline void pmd_clear(pmd_t *pmdp
 
 #define pte_offset_map(dir, address)	\
 	((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address))
-#define pte_offset_map_nested(dir, address)	\
-	((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address))
 #define pte_unmap(pte) ((void)(pte))
-#define pte_unmap_nested(pte) ((void)(pte))
 
 /*
  * Bits 9(_PAGE_PRESENT) and 10(_PAGE_FILE)are taken,
arch/sh/include/asm/pgtable_32.h +0 -3
Index: linux-2.6/arch/sh/include/asm/pgtable_32.h
===================================================================
@@ -429,10 +429,7 @@ static inline pte_t pte_modify(pte_t pte
 #define pte_offset_kernel(dir, address) \
 	((pte_t *) pmd_page_vaddr(*(dir)) + pte_index(address))
 #define pte_offset_map(dir, address)		pte_offset_kernel(dir, address)
-#define pte_offset_map_nested(dir, address)	pte_offset_kernel(dir, address)
-
 #define pte_unmap(pte)		do { } while (0)
-#define pte_unmap_nested(pte)	do { } while (0)
 
 #ifdef CONFIG_X2TLB
 #define pte_ERROR(e) \
arch/sh/include/asm/pgtable_64.h +0 -2
Index: linux-2.6/arch/sh/include/asm/pgtable_64.h
===================================================================
@@ -84,9 +84,7 @@ static __inline__ void set_pte(pte_t *pt
 		((pte_t *) ((pmd_val(*(dir))) & PAGE_MASK) + pte_index((addr)))
 
 #define pte_offset_map(dir,addr)	pte_offset_kernel(dir, addr)
-#define pte_offset_map_nested(dir,addr)	pte_offset_kernel(dir, addr)
 #define pte_unmap(pte)		do { } while (0)
-#define pte_unmap_nested(pte)	do { } while (0)
 
 #ifndef __ASSEMBLY__
 #define IOBASE_VADDR	0xff000000
arch/sparc/include/asm/pgtable_32.h +0 -3
Index: linux-2.6/arch/sparc/include/asm/pgtable_32.h
===================================================================
@@ -304,10 +304,7 @@ BTFIXUPDEF_CALL(pte_t *, pte_offset_kern
  * and sun4c is guaranteed to have no highmem anyway.
  */
 #define pte_offset_map(d, a)		pte_offset_kernel(d,a)
-#define pte_offset_map_nested(d, a)	pte_offset_kernel(d,a)
-
 #define pte_unmap(pte)		do{}while(0)
-#define pte_unmap_nested(pte)	do{}while(0)
 
 /* Certain architectures need to do special things when pte's
  * within a page table are directly modified.  Thus, the following
arch/sparc/include/asm/pgtable_64.h +0 -2
Index: linux-2.6/arch/sparc/include/asm/pgtable_64.h
===================================================================
@@ -652,9 +652,7 @@ static inline int pte_special(pte_t pte)
 	 ((address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1)))
 #define pte_offset_kernel		pte_index
 #define pte_offset_map			pte_index
-#define pte_offset_map_nested		pte_index
 #define pte_unmap(pte)			do { } while (0)
-#define pte_unmap_nested(pte)		do { } while (0)
 
 /* Actual page table PTE updates.  */
 extern void tlb_batch_add(struct mm_struct *mm, unsigned long vaddr, pte_t *ptep, pte_t orig);
arch/um/include/asm/pgtable.h +0 -2
Index: linux-2.6/arch/um/include/asm/pgtable.h
===================================================================
@@ -338,9 +338,7 @@ static inline pte_t pte_modify(pte_t pte
 	((pte_t *) pmd_page_vaddr(*(dir)) +  pte_index(address))
 #define pte_offset_map(dir, address) \
 	((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address))
-#define pte_offset_map_nested(dir, address) pte_offset_map(dir, address)
 #define pte_unmap(pte) do { } while (0)
-#define pte_unmap_nested(pte) do { } while (0)
 
 struct mm_struct;
 extern pte_t *virt_to_pte(struct mm_struct *mm, unsigned long addr);
arch/x86/include/asm/pgtable_32.h +0 -6
Index: linux-2.6/arch/x86/include/asm/pgtable_32.h
===================================================================
@@ -52,17 +52,11 @@ extern void set_pmd_pfn(unsigned long, u
 #define pte_offset_map(dir, address)				\
 	((pte_t *)kmap_atomic(pmd_page(*(dir))) +		\
 	 pte_index((address)))
-#define pte_offset_map_nested(dir, address)			\
-	((pte_t *)kmap_atomic(pmd_page(*(dir))) +		\
-	 pte_index((address)))
 #define pte_unmap(pte) kunmap_atomic((pte))
-#define pte_unmap_nested(pte) kunmap_atomic((pte))
 #else
 #define pte_offset_map(dir, address)					\
 	((pte_t *)page_address(pmd_page(*(dir))) + pte_index((address)))
-#define pte_offset_map_nested(dir, address) pte_offset_map((dir), (address))
 #define pte_unmap(pte) do { } while (0)
-#define pte_unmap_nested(pte) do { } while (0)
 #endif
 
 /* Clear a kernel PTE and flush it from the TLB */
arch/x86/include/asm/pgtable_64.h +0 -2
Index: linux-2.6/arch/x86/include/asm/pgtable_64.h
===================================================================
@@ -125,9 +125,7 @@ static inline int pgd_large(pgd_t pgd) {
 
 /* x86-64 always has all page tables mapped. */
 #define pte_offset_map(dir, address) pte_offset_kernel((dir), (address))
-#define pte_offset_map_nested(dir, address) pte_offset_kernel((dir), (address))
 #define pte_unmap(pte) ((void)(pte))/* NOP */
-#define pte_unmap_nested(pte) ((void)(pte)) /* NOP */
 
 #define update_mmu_cache(vma, address, ptep) do { } while (0)
 
arch/xtensa/include/asm/pgtable.h +0 -3
Index: linux-2.6/arch/xtensa/include/asm/pgtable.h
===================================================================
@@ -324,10 +324,7 @@ ptep_set_wrprotect(struct mm_struct *mm,
 #define pte_offset_kernel(dir,addr) 					\
 	((pte_t*) pmd_page_vaddr(*(dir)) + pte_index(addr))
 #define pte_offset_map(dir,addr)	pte_offset_kernel((dir),(addr))
-#define pte_offset_map_nested(dir,addr)	pte_offset_kernel((dir),(addr))
-
 #define pte_unmap(pte)		do { } while (0)
-#define pte_unmap_nested(pte)	do { } while (0)
 
 
 /*
mm/memory.c +2 -2
Index: linux-2.6/mm/memory.c
===================================================================
@@ -736,7 +736,7 @@ again:
 	dst_pte = pte_alloc_map_lock(dst_mm, dst_pmd, addr, &dst_ptl);
 	if (!dst_pte)
 		return -ENOMEM;
-	src_pte = pte_offset_map_nested(src_pmd, addr);
+	src_pte = pte_offset_map(src_pmd, addr);
 	src_ptl = pte_lockptr(src_mm, src_pmd);
 	spin_lock_nested(src_ptl, SINGLE_DEPTH_NESTING);
 	orig_src_pte = src_pte;
@@ -767,7 +767,7 @@ again:
 
 	arch_leave_lazy_mmu_mode();
 	spin_unlock(src_ptl);
-	pte_unmap_nested(orig_src_pte);
+	pte_unmap(orig_src_pte);
 	add_mm_rss_vec(dst_mm, rss);
 	pte_unmap_unlock(orig_dst_pte, dst_ptl);
 	cond_resched();
mm/mremap.c +2 -2
Index: linux-2.6/mm/mremap.c
===================================================================
@@ -101,7 +101,7 @@ static void move_ptes(struct vm_area_str
 	 * pte locks because exclusive mmap_sem prevents deadlock.
 	 */
 	old_pte = pte_offset_map_lock(mm, old_pmd, old_addr, &old_ptl);
- 	new_pte = pte_offset_map_nested(new_pmd, new_addr);
+	new_pte = pte_offset_map(new_pmd, new_addr);
 	new_ptl = pte_lockptr(mm, new_pmd);
 	if (new_ptl != old_ptl)
 		spin_lock_nested(new_ptl, SINGLE_DEPTH_NESTING);
@@ -119,7 +119,7 @@ static void move_ptes(struct vm_area_str
 	arch_leave_lazy_mmu_mode();
 	if (new_ptl != old_ptl)
 		spin_unlock(new_ptl);
-	pte_unmap_nested(new_pte - 1);
+	pte_unmap(new_pte - 1);
 	pte_unmap_unlock(old_pte - 1, old_ptl);
 	if (mapping)
 		spin_unlock(&mapping->i_mmap_lock);

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

Acked-by on v1 6/6
#16 lore raw

Re: [RFC][PATCH 6/6] mm: Remove pte_*map_nested()

Quoted 4 lines · Peter Zijlstra

Since we no longer need to provide KM_type, the whole pte_*map_nested() API is now redundant, remove it.

Signature · 7 lines
All rights reversed

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to [email protected].  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
maintainer
#17 lore raw
In reply to Peter Zijlstra
Quoted 8 lines · On Thu, 19 Aug 2010 22:13:17 +0200 Peter Zijlstra <[email protected]>…

This patch-set reworks the kmap_atomic API to be a stack based, instead of static slot based. Some might remember this from last year, some not ;-)

The advantage is that you no longer need to worry about KM_foo, the disadvantage is that kmap_atomic/kunmap_atomic now needs to be strictly nested (CONFIG_HIGHMEM_DEBUG should complain in case its not) -- and of course its a big massive patch changing a widely used API.

Nice. That fixes the "use of irq-only slots from interrupts-on context" bugs which people keep adding.

We don't have any checks in there for the stack overflowing?

Did you add every runtime check you could possibly think of? kmap_atomic_idx_push() and pop() don't have much in there. It'd be good to lard it up with runtime checks for at least a few weeks.

Quoted 10 lines

The patch-set is currently based on tip/master as of today, and compile tested on: i386-all{mod,yes}config, mips-yosemite_defconfig, sparc-sparc32_defconfig, powerpc-ppc6xx_defconfig, and some arm config.

(Sorry dhowells, I again couldn't find frv/mn10300 compilers)

Boot tested with i386-defconfig on kvm.

Since its a rather large set, and somewhat tedious to rebase, I wanted to ask how to go about getting this merged?

Well, there's that monster conversion patch. How's about you temporarily do

#define kmap_atomic(x, arg...) __kmap_atomic(x)

so for a while, both kmap_atomic(a, KM_foo) and kmap_atomic(a) are turned into __kmap_atomic(a). Once all the dust has settled, pull that out again?

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>

maintainer
#18 lore raw
Quoted 7 lines · Andrew Morton
Quoted 4 lines · On Thu, 19 Aug 2010 22:13:17 +0200 Peter Zijlstra <[email protected]>…

This patch-set reworks the kmap_atomic API to be a stack based, instead of static slot based. Some might remember this from last year, some not ;-)

Quoted 7 lines
Quoted 4 lines

The advantage is that you no longer need to worry about KM_foo, the disadvantage is that kmap_atomic/kunmap_atomic now needs to be strictly nested (CONFIG_HIGHMEM_DEBUG should complain in case its not) -- and of course its a big massive patch changing a widely used API.

Nice. That fixes the "use of irq-only slots from interrupts-on context" bugs which people keep adding.

Ah, I should add a:

  WARN_ON_ONCE(in_irq() && !irqs_disabled());

like check to ensure people don't use kmap_atomic() in nestable IRQ contexts (nestable IRQ context is bad anyway) the old debug code I deleted did something similar.

Quoted 1 line

We don't have any checks in there for the stack overflowing?

+#ifdef CONFIG_DEBUG_HIGHMEM
+ BUG_ON(idx > KM_TYPE_NR);
+#endif

Seems to be that.

Quoted 3 lines

Did you add every runtime check you could possibly think of? kmap_atomic_idx_push() and pop() don't have much in there. It'd be good to lard it up with runtime checks for at least a few weeks.

Right, so I currently have:

- stack size check in push/pop
- proper nesting check in pop (verifies that the vaddr you try to unmap is indeed the top most on the stack)

Aside from the proposed no irq-nesting thing to avoid unbounded recursion I can't really come up with more creative abuse.

Quoted 8 lines

Well, there's that monster conversion patch. How's about you temporarily do

#define kmap_atomic(x, arg...) __kmap_atomic(x)

so for a while, both kmap_atomic(a, KM_foo) and kmap_atomic(a) are turned into __kmap_atomic(a). Once all the dust has settled, pull that out again?

Ah, that's a nifty trick, let me try that.

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"[email protected]"> [email protected] </a>