Commit fb8b00675eb6462aacab56bca31ed6107bda5314
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
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
Showing 5 changed files Side-by-side Diff
arch/microblaze/Kconfig
arch/microblaze/kernel/entry.S
... | ... | @@ -492,10 +492,11 @@ |
492 | 492 | bnei r6, 1f; /* See if child SP arg (arg 1) is 0. */ |
493 | 493 | lwi r6, r1, PT_R1; /* If so, use paret's stack ptr */ |
494 | 494 | 1: addik r7, r1, 0; /* Arg 2: parent context */ |
495 | - add r8, r0, r0; /* Arg 3: (unused) */ | |
496 | - add r9, r0, r0; /* Arg 4: (unused) */ | |
495 | + lwi r9, r1, PT_R8; /* parent tid. */ | |
496 | + lwi r10, r1, PT_R9; /* child tid. */ | |
497 | + /* do_fork will pick up TLS from regs->r10. */ | |
497 | 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 | 501 | C_ENTRY(sys_execve): |
501 | 502 | brid microblaze_execve; /* Do real work (tail-call).*/ |
arch/microblaze/kernel/mcount.S
... | ... | @@ -138,7 +138,7 @@ |
138 | 138 | #endif /* CONFIG_DYNAMIC_FTRACE */ |
139 | 139 | /* static normal trace */ |
140 | 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 | 142 | /* MS: here is dependency on previous code */ |
143 | 143 | brald r15, r20; /* MS: jump to ftrace handler */ |
144 | 144 | nop; |
arch/microblaze/kernel/process.c
... | ... | @@ -182,8 +182,12 @@ |
182 | 182 | #endif |
183 | 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 | 189 | if (clone_flags & CLONE_SETTLS) |
186 | - ; | |
190 | + childregs->r21 = childregs->r10; | |
187 | 191 | |
188 | 192 | return 0; |
189 | 193 | } |
arch/microblaze/mm/fault.c
... | ... | @@ -92,6 +92,8 @@ |
92 | 92 | int code = SEGV_MAPERR; |
93 | 93 | int is_write = error_code & ESR_S; |
94 | 94 | int fault; |
95 | + unsigned int flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE | | |
96 | + (is_write ? FAULT_FLAG_WRITE : 0); | |
95 | 97 | |
96 | 98 | regs->ear = address; |
97 | 99 | regs->esr = error_code; |
... | ... | @@ -138,6 +140,7 @@ |
138 | 140 | if (kernel_mode(regs) && !search_exception_tables(regs->pc)) |
139 | 141 | goto bad_area_nosemaphore; |
140 | 142 | |
143 | +retry: | |
141 | 144 | down_read(&mm->mmap_sem); |
142 | 145 | } |
143 | 146 | |
... | ... | @@ -210,7 +213,11 @@ |
210 | 213 | * make sure we exit gracefully rather than endlessly redo |
211 | 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 | 221 | if (unlikely(fault & VM_FAULT_ERROR)) { |
215 | 222 | if (fault & VM_FAULT_OOM) |
216 | 223 | goto out_of_memory; |
217 | 224 | |
... | ... | @@ -218,11 +225,27 @@ |
218 | 225 | goto do_sigbus; |
219 | 226 | BUG(); |
220 | 227 | } |
221 | - if (unlikely(fault & VM_FAULT_MAJOR)) | |
222 | - current->maj_flt++; | |
223 | - else | |
224 | - current->min_flt++; | |
228 | + | |
229 | + if (flags & FAULT_FLAG_ALLOW_RETRY) { | |
230 | + if (unlikely(fault & VM_FAULT_MAJOR)) | |
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 | 247 | up_read(&mm->mmap_sem); |
248 | + | |
226 | 249 | /* |
227 | 250 | * keep track of tlb+htab misses that are good addrs but |
228 | 251 | * just need pte's created via handle_mm_fault() |