Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+39 -11
+1 -1
arch/microblaze/Kconfig
··· 52 52 def_bool y 53 53 54 54 config GENERIC_GPIO 55 - def_bool y 55 + bool 56 56 57 57 config GENERIC_CSUM 58 58 def_bool y
+4 -3
arch/microblaze/kernel/entry.S
··· 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).*/
+1 -1
arch/microblaze/kernel/mcount.S
··· 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;
+5 -1
arch/microblaze/kernel/process.c
··· 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 }
+28 -5
arch/microblaze/mm/fault.c
··· 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; ··· 140 138 if (kernel_mode(regs) && !search_exception_tables(regs->pc)) 141 139 goto bad_area_nosemaphore; 142 140 141 + retry: 143 142 down_read(&mm->mmap_sem); 144 143 } 145 144 ··· 213 210 * make sure we exit gracefully rather than endlessly redo 214 211 * the fault. 215 212 */ 216 - fault = handle_mm_fault(mm, vma, address, is_write ? FAULT_FLAG_WRITE : 0); 213 + fault = handle_mm_fault(mm, vma, address, flags); 214 + 215 + if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) 216 + return; 217 + 217 218 if (unlikely(fault & VM_FAULT_ERROR)) { 218 219 if (fault & VM_FAULT_OOM) 219 220 goto out_of_memory; ··· 225 218 goto do_sigbus; 226 219 BUG(); 227 220 } 228 - if (unlikely(fault & VM_FAULT_MAJOR)) 229 - current->maj_flt++; 230 - else 231 - current->min_flt++; 221 + 222 + if (flags & FAULT_FLAG_ALLOW_RETRY) { 223 + if (unlikely(fault & VM_FAULT_MAJOR)) 224 + current->maj_flt++; 225 + else 226 + current->min_flt++; 227 + if (fault & VM_FAULT_RETRY) { 228 + flags &= ~FAULT_FLAG_ALLOW_RETRY; 229 + 230 + /* 231 + * No need to up_read(&mm->mmap_sem) as we would 232 + * have already released it in __lock_page_or_retry 233 + * in mm/filemap.c. 234 + */ 235 + 236 + goto retry; 237 + } 238 + } 239 + 232 240 up_read(&mm->mmap_sem); 241 + 233 242 /* 234 243 * keep track of tlb+htab misses that are good addrs but 235 244 * just need pte's created via handle_mm_fault()