diff options
Diffstat (limited to 'arch/arm/lib')
-rw-r--r-- | arch/arm/lib/Makefile | 1 | ||||
-rw-r--r-- | arch/arm/lib/bitops.h | 5 | ||||
-rw-r--r-- | arch/arm/lib/io-shark.c | 13 | ||||
-rw-r--r-- | arch/arm/lib/uaccess_with_memcpy.c | 41 |
4 files changed, 43 insertions, 17 deletions
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index bd454b09133e..47d7338561de 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile | |||
@@ -41,7 +41,6 @@ else | |||
41 | endif | 41 | endif |
42 | 42 | ||
43 | lib-$(CONFIG_ARCH_RPC) += ecard.o io-acorn.o floppydma.o | 43 | lib-$(CONFIG_ARCH_RPC) += ecard.o io-acorn.o floppydma.o |
44 | lib-$(CONFIG_ARCH_SHARK) += io-shark.o | ||
45 | 44 | ||
46 | $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S | 45 | $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S |
47 | $(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S | 46 | $(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S |
diff --git a/arch/arm/lib/bitops.h b/arch/arm/lib/bitops.h index d6408d1ee543..e0c68d5bb7dc 100644 --- a/arch/arm/lib/bitops.h +++ b/arch/arm/lib/bitops.h | |||
@@ -10,6 +10,11 @@ UNWIND( .fnstart ) | |||
10 | and r3, r0, #31 @ Get bit offset | 10 | and r3, r0, #31 @ Get bit offset |
11 | mov r0, r0, lsr #5 | 11 | mov r0, r0, lsr #5 |
12 | add r1, r1, r0, lsl #2 @ Get word offset | 12 | add r1, r1, r0, lsl #2 @ Get word offset |
13 | #if __LINUX_ARM_ARCH__ >= 7 | ||
14 | .arch_extension mp | ||
15 | ALT_SMP(W(pldw) [r1]) | ||
16 | ALT_UP(W(nop)) | ||
17 | #endif | ||
13 | mov r3, r2, lsl r3 | 18 | mov r3, r2, lsl r3 |
14 | 1: ldrex r2, [r1] | 19 | 1: ldrex r2, [r1] |
15 | \instr r2, r2, r3 | 20 | \instr r2, r2, r3 |
diff --git a/arch/arm/lib/io-shark.c b/arch/arm/lib/io-shark.c deleted file mode 100644 index 824253948f51..000000000000 --- a/arch/arm/lib/io-shark.c +++ /dev/null | |||
@@ -1,13 +0,0 @@ | |||
1 | /* | ||
2 | * linux/arch/arm/lib/io-shark.c | ||
3 | * | ||
4 | * by Alexander Schulz | ||
5 | * | ||
6 | * derived from: | ||
7 | * linux/arch/arm/lib/io-ebsa.S | ||
8 | * Copyright (C) 1995, 1996 Russell King | ||
9 | * | ||
10 | * This program is free software; you can redistribute it and/or modify | ||
11 | * it under the terms of the GNU General Public License version 2 as | ||
12 | * published by the Free Software Foundation. | ||
13 | */ | ||
diff --git a/arch/arm/lib/uaccess_with_memcpy.c b/arch/arm/lib/uaccess_with_memcpy.c index 025f742dd4df..3e58d710013c 100644 --- a/arch/arm/lib/uaccess_with_memcpy.c +++ b/arch/arm/lib/uaccess_with_memcpy.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/hardirq.h> /* for in_atomic() */ | 18 | #include <linux/hardirq.h> /* for in_atomic() */ |
19 | #include <linux/gfp.h> | 19 | #include <linux/gfp.h> |
20 | #include <linux/highmem.h> | 20 | #include <linux/highmem.h> |
21 | #include <linux/hugetlb.h> | ||
21 | #include <asm/current.h> | 22 | #include <asm/current.h> |
22 | #include <asm/page.h> | 23 | #include <asm/page.h> |
23 | 24 | ||
@@ -40,7 +41,35 @@ pin_page_for_write(const void __user *_addr, pte_t **ptep, spinlock_t **ptlp) | |||
40 | return 0; | 41 | return 0; |
41 | 42 | ||
42 | pmd = pmd_offset(pud, addr); | 43 | pmd = pmd_offset(pud, addr); |
43 | if (unlikely(pmd_none(*pmd) || pmd_bad(*pmd))) | 44 | if (unlikely(pmd_none(*pmd))) |
45 | return 0; | ||
46 | |||
47 | /* | ||
48 | * A pmd can be bad if it refers to a HugeTLB or THP page. | ||
49 | * | ||
50 | * Both THP and HugeTLB pages have the same pmd layout | ||
51 | * and should not be manipulated by the pte functions. | ||
52 | * | ||
53 | * Lock the page table for the destination and check | ||
54 | * to see that it's still huge and whether or not we will | ||
55 | * need to fault on write, or if we have a splitting THP. | ||
56 | */ | ||
57 | if (unlikely(pmd_thp_or_huge(*pmd))) { | ||
58 | ptl = ¤t->mm->page_table_lock; | ||
59 | spin_lock(ptl); | ||
60 | if (unlikely(!pmd_thp_or_huge(*pmd) | ||
61 | || pmd_hugewillfault(*pmd) | ||
62 | || pmd_trans_splitting(*pmd))) { | ||
63 | spin_unlock(ptl); | ||
64 | return 0; | ||
65 | } | ||
66 | |||
67 | *ptep = NULL; | ||
68 | *ptlp = ptl; | ||
69 | return 1; | ||
70 | } | ||
71 | |||
72 | if (unlikely(pmd_bad(*pmd))) | ||
44 | return 0; | 73 | return 0; |
45 | 74 | ||
46 | pte = pte_offset_map_lock(current->mm, pmd, addr, &ptl); | 75 | pte = pte_offset_map_lock(current->mm, pmd, addr, &ptl); |
@@ -94,7 +123,10 @@ __copy_to_user_memcpy(void __user *to, const void *from, unsigned long n) | |||
94 | from += tocopy; | 123 | from += tocopy; |
95 | n -= tocopy; | 124 | n -= tocopy; |
96 | 125 | ||
97 | pte_unmap_unlock(pte, ptl); | 126 | if (pte) |
127 | pte_unmap_unlock(pte, ptl); | ||
128 | else | ||
129 | spin_unlock(ptl); | ||
98 | } | 130 | } |
99 | if (!atomic) | 131 | if (!atomic) |
100 | up_read(¤t->mm->mmap_sem); | 132 | up_read(¤t->mm->mmap_sem); |
@@ -147,7 +179,10 @@ __clear_user_memset(void __user *addr, unsigned long n) | |||
147 | addr += tocopy; | 179 | addr += tocopy; |
148 | n -= tocopy; | 180 | n -= tocopy; |
149 | 181 | ||
150 | pte_unmap_unlock(pte, ptl); | 182 | if (pte) |
183 | pte_unmap_unlock(pte, ptl); | ||
184 | else | ||
185 | spin_unlock(ptl); | ||
151 | } | 186 | } |
152 | up_read(¤t->mm->mmap_sem); | 187 | up_read(¤t->mm->mmap_sem); |
153 | 188 | ||