diff options
author | Peter Zijlstra <a.p.zijlstra@chello.nl> | 2008-01-25 15:08:29 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-25 15:08:29 -0500 |
commit | 8f4d37ec073c17e2d4aa8851df5837d798606d6f (patch) | |
tree | a9ac9063eca53e4d0110e8086f55241ea70ba993 /arch/x86 | |
parent | 02b67cc3ba36bdba351d6c3a00593f4ec550d9d3 (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.S | 6 | ||||
-rw-r--r-- | arch/x86/kernel/signal_32.c | 3 | ||||
-rw-r--r-- | arch/x86/kernel/signal_64.c | 3 |
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: | |||
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/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) |