diff options
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r-- | arch/x86/kernel/cpu/mtrr/main.c | 8 | ||||
-rw-r--r-- | arch/x86/kernel/entry_64.S | 6 | ||||
-rw-r--r-- | arch/x86/kernel/microcode.c | 16 | ||||
-rw-r--r-- | arch/x86/kernel/signal_32.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/signal_64.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/stacktrace.c | 27 |
6 files changed, 48 insertions, 15 deletions
diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c index 3b20613325dc..beb45c9c0835 100644 --- a/arch/x86/kernel/cpu/mtrr/main.c +++ b/arch/x86/kernel/cpu/mtrr/main.c | |||
@@ -349,7 +349,7 @@ int mtrr_add_page(unsigned long base, unsigned long size, | |||
349 | replace = -1; | 349 | replace = -1; |
350 | 350 | ||
351 | /* No CPU hotplug when we change MTRR entries */ | 351 | /* No CPU hotplug when we change MTRR entries */ |
352 | lock_cpu_hotplug(); | 352 | get_online_cpus(); |
353 | /* Search for existing MTRR */ | 353 | /* Search for existing MTRR */ |
354 | mutex_lock(&mtrr_mutex); | 354 | mutex_lock(&mtrr_mutex); |
355 | for (i = 0; i < num_var_ranges; ++i) { | 355 | for (i = 0; i < num_var_ranges; ++i) { |
@@ -405,7 +405,7 @@ int mtrr_add_page(unsigned long base, unsigned long size, | |||
405 | error = i; | 405 | error = i; |
406 | out: | 406 | out: |
407 | mutex_unlock(&mtrr_mutex); | 407 | mutex_unlock(&mtrr_mutex); |
408 | unlock_cpu_hotplug(); | 408 | put_online_cpus(); |
409 | return error; | 409 | return error; |
410 | } | 410 | } |
411 | 411 | ||
@@ -495,7 +495,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size) | |||
495 | 495 | ||
496 | max = num_var_ranges; | 496 | max = num_var_ranges; |
497 | /* No CPU hotplug when we change MTRR entries */ | 497 | /* No CPU hotplug when we change MTRR entries */ |
498 | lock_cpu_hotplug(); | 498 | get_online_cpus(); |
499 | mutex_lock(&mtrr_mutex); | 499 | mutex_lock(&mtrr_mutex); |
500 | if (reg < 0) { | 500 | if (reg < 0) { |
501 | /* Search for existing MTRR */ | 501 | /* Search for existing MTRR */ |
@@ -536,7 +536,7 @@ int mtrr_del_page(int reg, unsigned long base, unsigned long size) | |||
536 | error = reg; | 536 | error = reg; |
537 | out: | 537 | out: |
538 | mutex_unlock(&mtrr_mutex); | 538 | mutex_unlock(&mtrr_mutex); |
539 | unlock_cpu_hotplug(); | 539 | put_online_cpus(); |
540 | return error; | 540 | return error; |
541 | } | 541 | } |
542 | /** | 542 | /** |
diff --git a/arch/x86/kernel/entry_64.S b/arch/x86/kernel/entry_64.S index 3a058bb16409..e70f3881d7e4 100644 --- a/arch/x86/kernel/entry_64.S +++ b/arch/x86/kernel/entry_64.S | |||
@@ -283,7 +283,7 @@ sysret_careful: | |||
283 | sysret_signal: | 283 | sysret_signal: |
284 | TRACE_IRQS_ON | 284 | TRACE_IRQS_ON |
285 | sti | 285 | sti |
286 | testl $(_TIF_SIGPENDING|_TIF_SINGLESTEP|_TIF_MCE_NOTIFY),%edx | 286 | testl $_TIF_DO_NOTIFY_MASK,%edx |
287 | jz 1f | 287 | jz 1f |
288 | 288 | ||
289 | /* Really a signal */ | 289 | /* Really a signal */ |
@@ -377,7 +377,7 @@ int_very_careful: | |||
377 | jmp int_restore_rest | 377 | jmp int_restore_rest |
378 | 378 | ||
379 | int_signal: | 379 | int_signal: |
380 | testl $(_TIF_SIGPENDING|_TIF_SINGLESTEP|_TIF_MCE_NOTIFY),%edx | 380 | testl $_TIF_DO_NOTIFY_MASK,%edx |
381 | jz 1f | 381 | jz 1f |
382 | movq %rsp,%rdi # &ptregs -> arg1 | 382 | movq %rsp,%rdi # &ptregs -> arg1 |
383 | xorl %esi,%esi # oldset -> arg2 | 383 | xorl %esi,%esi # oldset -> arg2 |
@@ -603,7 +603,7 @@ retint_careful: | |||
603 | jmp retint_check | 603 | jmp retint_check |
604 | 604 | ||
605 | retint_signal: | 605 | retint_signal: |
606 | testl $(_TIF_SIGPENDING|_TIF_SINGLESTEP|_TIF_MCE_NOTIFY),%edx | 606 | testl $_TIF_DO_NOTIFY_MASK,%edx |
607 | jz retint_swapgs | 607 | jz retint_swapgs |
608 | TRACE_IRQS_ON | 608 | TRACE_IRQS_ON |
609 | sti | 609 | sti |
diff --git a/arch/x86/kernel/microcode.c b/arch/x86/kernel/microcode.c index 09c315214a5e..40cfd5488719 100644 --- a/arch/x86/kernel/microcode.c +++ b/arch/x86/kernel/microcode.c | |||
@@ -436,7 +436,7 @@ static ssize_t microcode_write (struct file *file, const char __user *buf, size_ | |||
436 | return -EINVAL; | 436 | return -EINVAL; |
437 | } | 437 | } |
438 | 438 | ||
439 | lock_cpu_hotplug(); | 439 | get_online_cpus(); |
440 | mutex_lock(µcode_mutex); | 440 | mutex_lock(µcode_mutex); |
441 | 441 | ||
442 | user_buffer = (void __user *) buf; | 442 | user_buffer = (void __user *) buf; |
@@ -447,7 +447,7 @@ static ssize_t microcode_write (struct file *file, const char __user *buf, size_ | |||
447 | ret = (ssize_t)len; | 447 | ret = (ssize_t)len; |
448 | 448 | ||
449 | mutex_unlock(µcode_mutex); | 449 | mutex_unlock(µcode_mutex); |
450 | unlock_cpu_hotplug(); | 450 | put_online_cpus(); |
451 | 451 | ||
452 | return ret; | 452 | return ret; |
453 | } | 453 | } |
@@ -658,14 +658,14 @@ static ssize_t reload_store(struct sys_device *dev, const char *buf, size_t sz) | |||
658 | 658 | ||
659 | old = current->cpus_allowed; | 659 | old = current->cpus_allowed; |
660 | 660 | ||
661 | lock_cpu_hotplug(); | 661 | get_online_cpus(); |
662 | set_cpus_allowed(current, cpumask_of_cpu(cpu)); | 662 | set_cpus_allowed(current, cpumask_of_cpu(cpu)); |
663 | 663 | ||
664 | mutex_lock(µcode_mutex); | 664 | mutex_lock(µcode_mutex); |
665 | if (uci->valid) | 665 | if (uci->valid) |
666 | err = cpu_request_microcode(cpu); | 666 | err = cpu_request_microcode(cpu); |
667 | mutex_unlock(µcode_mutex); | 667 | mutex_unlock(µcode_mutex); |
668 | unlock_cpu_hotplug(); | 668 | put_online_cpus(); |
669 | set_cpus_allowed(current, old); | 669 | set_cpus_allowed(current, old); |
670 | } | 670 | } |
671 | if (err) | 671 | if (err) |
@@ -817,9 +817,9 @@ static int __init microcode_init (void) | |||
817 | return PTR_ERR(microcode_pdev); | 817 | return PTR_ERR(microcode_pdev); |
818 | } | 818 | } |
819 | 819 | ||
820 | lock_cpu_hotplug(); | 820 | get_online_cpus(); |
821 | error = sysdev_driver_register(&cpu_sysdev_class, &mc_sysdev_driver); | 821 | error = sysdev_driver_register(&cpu_sysdev_class, &mc_sysdev_driver); |
822 | unlock_cpu_hotplug(); | 822 | put_online_cpus(); |
823 | if (error) { | 823 | if (error) { |
824 | microcode_dev_exit(); | 824 | microcode_dev_exit(); |
825 | platform_device_unregister(microcode_pdev); | 825 | platform_device_unregister(microcode_pdev); |
@@ -839,9 +839,9 @@ static void __exit microcode_exit (void) | |||
839 | 839 | ||
840 | unregister_hotcpu_notifier(&mc_cpu_notifier); | 840 | unregister_hotcpu_notifier(&mc_cpu_notifier); |
841 | 841 | ||
842 | lock_cpu_hotplug(); | 842 | get_online_cpus(); |
843 | sysdev_driver_unregister(&cpu_sysdev_class, &mc_sysdev_driver); | 843 | sysdev_driver_unregister(&cpu_sysdev_class, &mc_sysdev_driver); |
844 | unlock_cpu_hotplug(); | 844 | put_online_cpus(); |
845 | 845 | ||
846 | platform_device_unregister(microcode_pdev); | 846 | platform_device_unregister(microcode_pdev); |
847 | } | 847 | } |
diff --git a/arch/x86/kernel/signal_32.c b/arch/x86/kernel/signal_32.c index 9bdd83022f5f..20f29e4c1d33 100644 --- a/arch/x86/kernel/signal_32.c +++ b/arch/x86/kernel/signal_32.c | |||
@@ -658,6 +658,9 @@ void do_notify_resume(struct pt_regs *regs, void *_unused, | |||
658 | /* deal with pending signal delivery */ | 658 | /* deal with pending signal delivery */ |
659 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) | 659 | if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK)) |
660 | do_signal(regs); | 660 | do_signal(regs); |
661 | |||
662 | if (thread_info_flags & _TIF_HRTICK_RESCHED) | ||
663 | hrtick_resched(); | ||
661 | 664 | ||
662 | clear_thread_flag(TIF_IRET); | 665 | clear_thread_flag(TIF_IRET); |
663 | } | 666 | } |
diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c index ab086b0357fc..38d806467c0f 100644 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c | |||
@@ -480,6 +480,9 @@ do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags) | |||
480 | /* deal with pending signal delivery */ | 480 | /* deal with pending signal delivery */ |
481 | if (thread_info_flags & (_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK)) | 481 | if (thread_info_flags & (_TIF_SIGPENDING|_TIF_RESTORE_SIGMASK)) |
482 | do_signal(regs); | 482 | do_signal(regs); |
483 | |||
484 | if (thread_info_flags & _TIF_HRTICK_RESCHED) | ||
485 | hrtick_resched(); | ||
483 | } | 486 | } |
484 | 487 | ||
485 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where) | 488 | void signal_fault(struct pt_regs *regs, void __user *frame, char *where) |
diff --git a/arch/x86/kernel/stacktrace.c b/arch/x86/kernel/stacktrace.c index 6fa6cf036c70..55771fd7e545 100644 --- a/arch/x86/kernel/stacktrace.c +++ b/arch/x86/kernel/stacktrace.c | |||
@@ -33,6 +33,19 @@ static void save_stack_address(void *data, unsigned long addr) | |||
33 | trace->entries[trace->nr_entries++] = addr; | 33 | trace->entries[trace->nr_entries++] = addr; |
34 | } | 34 | } |
35 | 35 | ||
36 | static void save_stack_address_nosched(void *data, unsigned long addr) | ||
37 | { | ||
38 | struct stack_trace *trace = (struct stack_trace *)data; | ||
39 | if (in_sched_functions(addr)) | ||
40 | return; | ||
41 | if (trace->skip > 0) { | ||
42 | trace->skip--; | ||
43 | return; | ||
44 | } | ||
45 | if (trace->nr_entries < trace->max_entries) | ||
46 | trace->entries[trace->nr_entries++] = addr; | ||
47 | } | ||
48 | |||
36 | static const struct stacktrace_ops save_stack_ops = { | 49 | static const struct stacktrace_ops save_stack_ops = { |
37 | .warning = save_stack_warning, | 50 | .warning = save_stack_warning, |
38 | .warning_symbol = save_stack_warning_symbol, | 51 | .warning_symbol = save_stack_warning_symbol, |
@@ -40,6 +53,13 @@ static const struct stacktrace_ops save_stack_ops = { | |||
40 | .address = save_stack_address, | 53 | .address = save_stack_address, |
41 | }; | 54 | }; |
42 | 55 | ||
56 | static const struct stacktrace_ops save_stack_ops_nosched = { | ||
57 | .warning = save_stack_warning, | ||
58 | .warning_symbol = save_stack_warning_symbol, | ||
59 | .stack = save_stack_stack, | ||
60 | .address = save_stack_address_nosched, | ||
61 | }; | ||
62 | |||
43 | /* | 63 | /* |
44 | * Save stack-backtrace addresses into a stack_trace buffer. | 64 | * Save stack-backtrace addresses into a stack_trace buffer. |
45 | */ | 65 | */ |
@@ -50,3 +70,10 @@ void save_stack_trace(struct stack_trace *trace) | |||
50 | trace->entries[trace->nr_entries++] = ULONG_MAX; | 70 | trace->entries[trace->nr_entries++] = ULONG_MAX; |
51 | } | 71 | } |
52 | EXPORT_SYMBOL(save_stack_trace); | 72 | EXPORT_SYMBOL(save_stack_trace); |
73 | |||
74 | void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace) | ||
75 | { | ||
76 | dump_trace(tsk, NULL, NULL, &save_stack_ops_nosched, trace); | ||
77 | if (trace->nr_entries < trace->max_entries) | ||
78 | trace->entries[trace->nr_entries++] = ULONG_MAX; | ||
79 | } | ||