aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorPeter Zijlstra <a.p.zijlstra@chello.nl>2008-01-25 15:08:29 -0500
committerIngo Molnar <mingo@elte.hu>2008-01-25 15:08:29 -0500
commit8f4d37ec073c17e2d4aa8851df5837d798606d6f (patch)
treea9ac9063eca53e4d0110e8086f55241ea70ba993 /arch/x86
parent02b67cc3ba36bdba351d6c3a00593f4ec550d9d3 (diff)
sched: high-res preemption tick
Use HR-timers (when available) to deliver an accurate preemption tick. The regular scheduler tick that runs at 1/HZ can be too coarse when nice level are used. The fairness system will still keep the cpu utilisation 'fair' by then delaying the task that got an excessive amount of CPU time but try to minimize this by delivering preemption points spot-on. The average frequency of this extra interrupt is sched_latency / nr_latency. Which need not be higher than 1/HZ, its just that the distribution within the sched_latency period is important. Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/kernel/entry_64.S6
-rw-r--r--arch/x86/kernel/signal_32.c3
-rw-r--r--arch/x86/kernel/signal_64.c3
3 files changed, 9 insertions, 3 deletions
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/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)