Commit fb8b00675eb6462aacab56bca31ed6107bda5314

Authored by Linus Torvalds

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
... ... @@ -52,7 +52,7 @@
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
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()