diff options
author | Kirill Tkhai <tkhai@yandex.ru> | 2013-09-14 08:02:11 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-11-14 17:57:21 -0500 |
commit | 812cb83a56a908729c453a7db3fb2c262119bc9d (patch) | |
tree | 3fdf3df047276db7de85558ff6caff006c3b1cc4 /arch/sparc/mm/fault_64.c | |
parent | 1a36265bf7d7e16b35fab5ae7f2f5d499bd0c14d (diff) |
sparc64: Implement HAVE_CONTEXT_TRACKING
Mark the places when the system are in user or are in kernel.
This is used to make full dynticks system (tickless) --
CONFIG_NO_HZ_FULL dependence.
Signed-off-by: Kirill Tkhai <tkhai@yandex.ru>
CC: David Miller <davem@davemloft.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/sparc/mm/fault_64.c')
-rw-r--r-- | arch/sparc/mm/fault_64.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/arch/sparc/mm/fault_64.c b/arch/sparc/mm/fault_64.c index 2ebec263d685..69bb818fdd79 100644 --- a/arch/sparc/mm/fault_64.c +++ b/arch/sparc/mm/fault_64.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/kprobes.h> | 21 | #include <linux/kprobes.h> |
22 | #include <linux/kdebug.h> | 22 | #include <linux/kdebug.h> |
23 | #include <linux/percpu.h> | 23 | #include <linux/percpu.h> |
24 | #include <linux/context_tracking.h> | ||
24 | 25 | ||
25 | #include <asm/page.h> | 26 | #include <asm/page.h> |
26 | #include <asm/pgtable.h> | 27 | #include <asm/pgtable.h> |
@@ -272,6 +273,7 @@ static void noinline __kprobes bogus_32bit_fault_address(struct pt_regs *regs, | |||
272 | 273 | ||
273 | asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) | 274 | asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) |
274 | { | 275 | { |
276 | enum ctx_state prev_state = exception_enter(); | ||
275 | struct mm_struct *mm = current->mm; | 277 | struct mm_struct *mm = current->mm; |
276 | struct vm_area_struct *vma; | 278 | struct vm_area_struct *vma; |
277 | unsigned int insn = 0; | 279 | unsigned int insn = 0; |
@@ -282,7 +284,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) | |||
282 | fault_code = get_thread_fault_code(); | 284 | fault_code = get_thread_fault_code(); |
283 | 285 | ||
284 | if (notify_page_fault(regs)) | 286 | if (notify_page_fault(regs)) |
285 | return; | 287 | goto exit_exception; |
286 | 288 | ||
287 | si_code = SEGV_MAPERR; | 289 | si_code = SEGV_MAPERR; |
288 | address = current_thread_info()->fault_address; | 290 | address = current_thread_info()->fault_address; |
@@ -313,7 +315,7 @@ asmlinkage void __kprobes do_sparc64_fault(struct pt_regs *regs) | |||
313 | /* Valid, no problems... */ | 315 | /* Valid, no problems... */ |
314 | } else { | 316 | } else { |
315 | bad_kernel_pc(regs, address); | 317 | bad_kernel_pc(regs, address); |
316 | return; | 318 | goto exit_exception; |
317 | } | 319 | } |
318 | } else | 320 | } else |
319 | flags |= FAULT_FLAG_USER; | 321 | flags |= FAULT_FLAG_USER; |
@@ -430,7 +432,7 @@ good_area: | |||
430 | fault = handle_mm_fault(mm, vma, address, flags); | 432 | fault = handle_mm_fault(mm, vma, address, flags); |
431 | 433 | ||
432 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) | 434 | if ((fault & VM_FAULT_RETRY) && fatal_signal_pending(current)) |
433 | return; | 435 | goto exit_exception; |
434 | 436 | ||
435 | if (unlikely(fault & VM_FAULT_ERROR)) { | 437 | if (unlikely(fault & VM_FAULT_ERROR)) { |
436 | if (fault & VM_FAULT_OOM) | 438 | if (fault & VM_FAULT_OOM) |
@@ -482,6 +484,8 @@ good_area: | |||
482 | 484 | ||
483 | } | 485 | } |
484 | #endif | 486 | #endif |
487 | exit_exception: | ||
488 | exception_exit(prev_state); | ||
485 | return; | 489 | return; |
486 | 490 | ||
487 | /* | 491 | /* |
@@ -494,7 +498,7 @@ bad_area: | |||
494 | 498 | ||
495 | handle_kernel_fault: | 499 | handle_kernel_fault: |
496 | do_kernel_fault(regs, si_code, fault_code, insn, address); | 500 | do_kernel_fault(regs, si_code, fault_code, insn, address); |
497 | return; | 501 | goto exit_exception; |
498 | 502 | ||
499 | /* | 503 | /* |
500 | * We ran out of memory, or some other thing happened to us that made | 504 | * We ran out of memory, or some other thing happened to us that made |
@@ -505,7 +509,7 @@ out_of_memory: | |||
505 | up_read(&mm->mmap_sem); | 509 | up_read(&mm->mmap_sem); |
506 | if (!(regs->tstate & TSTATE_PRIV)) { | 510 | if (!(regs->tstate & TSTATE_PRIV)) { |
507 | pagefault_out_of_memory(); | 511 | pagefault_out_of_memory(); |
508 | return; | 512 | goto exit_exception; |
509 | } | 513 | } |
510 | goto handle_kernel_fault; | 514 | goto handle_kernel_fault; |
511 | 515 | ||