diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-28 12:49:56 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-05-28 12:49:56 -0400 |
commit | fb8b00675eb6462aacab56bca31ed6107bda5314 (patch) | |
tree | cd3c081dca9ea37d2ddc5e13b55fb4baeccf5452 | |
parent | b48b2c3e50433ff6f7e46186daa7f986bd960215 (diff) | |
parent | d5c15f17844b8883bc13b61a8ae114f0d3d59cdd (diff) |
Merge branch 'next' of git://git.monstr.eu/linux-2.6-microblaze
Pull microblaze changes from Michal Simek.
* 'next' of git://git.monstr.eu/linux-2.6-microblaze:
microblaze: Setup correct pointer to TLS area
microblaze: Add TLS support to sys_clone
microblaze: ftrace: Pass the first calling instruction for dynamic ftrace
microblaze: Port OOM changes to do_page_fault
microblaze: Do not select GENERIC_GPIO by default
-rw-r--r-- | arch/microblaze/Kconfig | 2 | ||||
-rw-r--r-- | arch/microblaze/kernel/entry.S | 7 | ||||
-rw-r--r-- | arch/microblaze/kernel/mcount.S | 2 | ||||
-rw-r--r-- | arch/microblaze/kernel/process.c | 6 | ||||
-rw-r--r-- | arch/microblaze/mm/fault.c | 33 |
5 files changed, 39 insertions, 11 deletions
diff --git a/arch/microblaze/Kconfig b/arch/microblaze/Kconfig index 83460468998d..0bf44231aaf9 100644 --- a/arch/microblaze/Kconfig +++ b/arch/microblaze/Kconfig | |||
@@ -52,7 +52,7 @@ config GENERIC_CALIBRATE_DELAY | |||
52 | def_bool y | 52 | def_bool y |
53 | 53 | ||
54 | config GENERIC_GPIO | 54 | config GENERIC_GPIO |
55 | def_bool y | 55 | bool |
56 | 56 | ||
57 | config GENERIC_CSUM | 57 | config GENERIC_CSUM |
58 | def_bool y | 58 | def_bool y |
diff --git a/arch/microblaze/kernel/entry.S b/arch/microblaze/kernel/entry.S index daff9e5e4a1f..03f7b8ce6b6b 100644 --- a/arch/microblaze/kernel/entry.S +++ b/arch/microblaze/kernel/entry.S | |||
@@ -492,10 +492,11 @@ C_ENTRY(sys_clone): | |||
492 | bnei r6, 1f; /* See if child SP arg (arg 1) is 0. */ | 492 | bnei r6, 1f; /* See if child SP arg (arg 1) is 0. */ |
493 | lwi r6, r1, PT_R1; /* If so, use paret's stack ptr */ | 493 | lwi r6, r1, PT_R1; /* If so, use paret's stack ptr */ |
494 | 1: addik r7, r1, 0; /* Arg 2: parent context */ | 494 | 1: addik r7, r1, 0; /* Arg 2: parent context */ |
495 | add r8, r0, r0; /* Arg 3: (unused) */ | 495 | lwi r9, r1, PT_R8; /* parent tid. */ |
496 | add r9, r0, r0; /* Arg 4: (unused) */ | 496 | lwi r10, r1, PT_R9; /* child tid. */ |
497 | /* do_fork will pick up TLS from regs->r10. */ | ||
497 | brid do_fork /* Do real work (tail-call) */ | 498 | brid do_fork /* Do real work (tail-call) */ |
498 | add r10, r0, r0; /* Arg 5: (unused) */ | 499 | add r8, r0, r0; /* Arg 3: (unused) */ |
499 | 500 | ||
500 | C_ENTRY(sys_execve): | 501 | C_ENTRY(sys_execve): |
501 | brid microblaze_execve; /* Do real work (tail-call).*/ | 502 | brid microblaze_execve; /* Do real work (tail-call).*/ |
diff --git a/arch/microblaze/kernel/mcount.S b/arch/microblaze/kernel/mcount.S index e7eaa7a8cbd3..fc1e1322ce4c 100644 --- a/arch/microblaze/kernel/mcount.S +++ b/arch/microblaze/kernel/mcount.S | |||
@@ -138,7 +138,7 @@ NOALIGN_ENTRY(ftrace_call) | |||
138 | #endif /* CONFIG_DYNAMIC_FTRACE */ | 138 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
139 | /* static normal trace */ | 139 | /* static normal trace */ |
140 | lwi r6, r1, 120; /* MS: load parent addr */ | 140 | lwi r6, r1, 120; /* MS: load parent addr */ |
141 | addik r5, r15, 0; /* MS: load current function addr */ | 141 | addik r5, r15, -4; /* MS: load current function addr */ |
142 | /* MS: here is dependency on previous code */ | 142 | /* MS: here is dependency on previous code */ |
143 | brald r15, r20; /* MS: jump to ftrace handler */ | 143 | brald r15, r20; /* MS: jump to ftrace handler */ |
144 | nop; | 144 | nop; |
diff --git a/arch/microblaze/kernel/process.c b/arch/microblaze/kernel/process.c index 883b92789cdf..1944e00f07e1 100644 --- a/arch/microblaze/kernel/process.c +++ b/arch/microblaze/kernel/process.c | |||
@@ -182,8 +182,12 @@ int copy_thread(unsigned long clone_flags, unsigned long usp, | |||
182 | #endif | 182 | #endif |
183 | ti->cpu_context.r15 = (unsigned long)ret_from_fork - 8; | 183 | ti->cpu_context.r15 = (unsigned long)ret_from_fork - 8; |
184 | 184 | ||
185 | /* | ||
186 | * r21 is the thread reg, r10 is 6th arg to clone | ||
187 | * which contains TLS area | ||
188 | */ | ||
185 | if (clone_flags & CLONE_SETTLS) | 189 | if (clone_flags & CLONE_SETTLS) |
186 | ; | 190 | childregs->r21 = childregs->r10; |
187 | 191 | ||
188 | return 0; | 192 | return 0; |
189 | } | 193 | } |
diff --git a/arch/microblaze/mm/fault.c b/arch/microblaze/mm/fault.c index c38a265846de..eb365d6795fa 100644 --- a/arch/microblaze/mm/fault.c +++ b/arch/microblaze/mm/fault.c | |||
@@ -92,6 +92,8 @@ void do_page_fault(struct pt_regs *regs, unsigned long address, | |||
92 | int code = SEGV_MAPERR; | 92 | int code = SEGV_MAPERR; |
93 | int is_write = error_code & ESR_S; | 93 | int is_write = error_code & ESR_S; |
94 | int fault; | 94 | int fault; |
95 | unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | | ||
96 | (is_write ? FAULT_FLAG_WRITE : 0); | ||
95 | 97 | ||
96 | regs->ear = address; | 98 | regs->ear = address; |
97 | regs->esr = error_code; | 99 | regs->esr = error_code; |
@@ -138,6 +140,7 @@ void do_page_fault(struct pt_regs *regs, unsigned long address, | |||
138 | if (kernel_mode(regs) && !search_exception_tables(regs->pc)) | 140 | if (kernel_mode(regs) && !search_exception_tables(regs->pc)) |
139 | goto bad_area_nosemaphore; | 141 | goto bad_area_nosemaphore; |
140 | 142 | ||
143 | retry: | ||
141 | down_read(&mm->mmap_sem); | 144 | down_read(&mm->mmap_sem); |
142 | } | 145 | } |
143 | 146 | ||
@@ -210,7 +213,11 @@ good_area: | |||
210 | * make sure we exit gracefully rather than endlessly redo | 213 | * make sure we exit gracefully rather than endlessly redo |
211 | * the fault. | 214 | * the fault. |
212 | */ | 215 | */ |
213 | fault = handle_mm_fault(mm, vma, address, is_write ? FAULT_FLAG_WRITE : 0); | 216 | fault = handle_mm_fault(mm, vma, address, flags); |
217 | |||
218 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) | ||
219 | return; | ||
220 | |||
214 | if (unlikely(fault & VM_FAULT_ERROR)) { | 221 | if (unlikely(fault & VM_FAULT_ERROR)) { |
215 | if (fault & VM_FAULT_OOM) | 222 | if (fault & VM_FAULT_OOM) |
216 | goto out_of_memory; | 223 | goto out_of_memory; |
@@ -218,11 +225,27 @@ good_area: | |||
218 | goto do_sigbus; | 225 | goto do_sigbus; |
219 | BUG(); | 226 | BUG(); |
220 | } | 227 | } |
221 | if (unlikely(fault & VM_FAULT_MAJOR)) | 228 | |
222 | current->maj_flt++; | 229 | if (flags & FAULT_FLAG_ALLOW_RETRY) { |
223 | else | 230 | if (unlikely(fault & VM_FAULT_MAJOR)) |
224 | current->min_flt++; | 231 | current->maj_flt++; |
232 | else | ||
233 | current->min_flt++; | ||
234 | if (fault & VM_FAULT_RETRY) { | ||
235 | flags &= ~FAULT_FLAG_ALLOW_RETRY; | ||
236 | |||
237 | /* | ||
238 | * No need to up_read(&mm->mmap_sem) as we would | ||
239 | * have already released it in __lock_page_or_retry | ||
240 | * in mm/filemap.c. | ||
241 | */ | ||
242 | |||
243 | goto retry; | ||
244 | } | ||
245 | } | ||
246 | |||
225 | up_read(&mm->mmap_sem); | 247 | up_read(&mm->mmap_sem); |
248 | |||
226 | /* | 249 | /* |
227 | * keep track of tlb+htab misses that are good addrs but | 250 | * keep track of tlb+htab misses that are good addrs but |
228 | * just need pte's created via handle_mm_fault() | 251 | * just need pte's created via handle_mm_fault() |