aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel')
-rw-r--r--arch/x86/kernel/cpu/mtrr/main.c8
-rw-r--r--arch/x86/kernel/entry_64.S6
-rw-r--r--arch/x86/kernel/microcode.c16
-rw-r--r--arch/x86/kernel/signal_32.c3
-rw-r--r--arch/x86/kernel/signal_64.c3
-rw-r--r--arch/x86/kernel/stacktrace.c27
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:
283sysret_signal: 283sysret_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
379int_signal: 379int_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
605retint_signal: 605retint_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(&microcode_mutex); 440 mutex_lock(&microcode_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(&microcode_mutex); 449 mutex_unlock(&microcode_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(&microcode_mutex); 664 mutex_lock(&microcode_mutex);
665 if (uci->valid) 665 if (uci->valid)
666 err = cpu_request_microcode(cpu); 666 err = cpu_request_microcode(cpu);
667 mutex_unlock(&microcode_mutex); 667 mutex_unlock(&microcode_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
485void signal_fault(struct pt_regs *regs, void __user *frame, char *where) 488void 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
36static 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
36static const struct stacktrace_ops save_stack_ops = { 49static 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
56static 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}
52EXPORT_SYMBOL(save_stack_trace); 72EXPORT_SYMBOL(save_stack_trace);
73
74void 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}