diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-19 21:19:48 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-19 21:19:48 -0500 |
| commit | d652e1eb8e7b739fccbfb503a3da3e9f640fbf3d (patch) | |
| tree | 55ab77bad0cbb045eac0b84b80d63f88f1ae09e6 /kernel | |
| parent | 8f55cea410dbc56114bb71a3742032070c8108d0 (diff) | |
| parent | 77852fea6e2442a0e654a9292060489895de18c7 (diff) | |
Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull scheduler changes from Ingo Molnar:
"Main changes:
- scheduler side full-dynticks (user-space execution is undisturbed
and receives no timer IRQs) preparation changes that convert the
cputime accounting code to be full-dynticks ready, from Frederic
Weisbecker.
- Initial sched.h split-up changes, by Clark Williams
- select_idle_sibling() performance improvement by Mike Galbraith:
" 1 tbench pair (worst case) in a 10 core + SMT package:
pre 15.22 MB/sec 1 procs
post 252.01 MB/sec 1 procs "
- sched_rr_get_interval() ABI fix/change. We think this detail is not
used by apps (so it's not an ABI in practice), but lets keep it
under observation.
- misc RT scheduling cleanups, optimizations"
* 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (24 commits)
sched/rt: Add <linux/sched/rt.h> header to <linux/init_task.h>
cputime: Remove irqsave from seqlock readers
sched, powerpc: Fix sched.h split-up build failure
cputime: Restore CPU_ACCOUNTING config defaults for PPC64
sched/rt: Move rt specific bits into new header file
sched/rt: Add a tuning knob to allow changing SCHED_RR timeslice
sched: Move sched.h sysctl bits into separate header
sched: Fix signedness bug in yield_to()
sched: Fix select_idle_sibling() bouncing cow syndrome
sched/rt: Further simplify pick_rt_task()
sched/rt: Do not account zero delta_exec in update_curr_rt()
cputime: Safely read cputime of full dynticks CPUs
kvm: Prepare to add generic guest entry/exit callbacks
cputime: Use accessors to read task cputime stats
cputime: Allow dynamic switch between tick/virtual based cputime accounting
cputime: Generic on-demand virtual cputime accounting
cputime: Move default nsecs_to_cputime() to jiffies based cputime file
cputime: Librarize per nsecs resolution cputime definitions
cputime: Avoid multiplication overflow on utime scaling
context_tracking: Export context state for generic vtime
...
Fix up conflict in kernel/context_tracking.c due to comment additions.
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/acct.c | 6 | ||||
| -rw-r--r-- | kernel/context_tracking.c | 43 | ||||
| -rw-r--r-- | kernel/cpu.c | 4 | ||||
| -rw-r--r-- | kernel/delayacct.c | 7 | ||||
| -rw-r--r-- | kernel/exit.c | 10 | ||||
| -rw-r--r-- | kernel/fork.c | 6 | ||||
| -rw-r--r-- | kernel/futex.c | 1 | ||||
| -rw-r--r-- | kernel/hrtimer.c | 2 | ||||
| -rw-r--r-- | kernel/irq/manage.c | 1 | ||||
| -rw-r--r-- | kernel/mutex.c | 1 | ||||
| -rw-r--r-- | kernel/posix-cpu-timers.c | 28 | ||||
| -rw-r--r-- | kernel/rtmutex-debug.c | 1 | ||||
| -rw-r--r-- | kernel/rtmutex-tester.c | 1 | ||||
| -rw-r--r-- | kernel/rtmutex.c | 1 | ||||
| -rw-r--r-- | kernel/sched/core.c | 22 | ||||
| -rw-r--r-- | kernel/sched/cpupri.c | 2 | ||||
| -rw-r--r-- | kernel/sched/cputime.c | 314 | ||||
| -rw-r--r-- | kernel/sched/fair.c | 27 | ||||
| -rw-r--r-- | kernel/sched/rt.c | 26 | ||||
| -rw-r--r-- | kernel/sched/sched.h | 2 | ||||
| -rw-r--r-- | kernel/signal.c | 12 | ||||
| -rw-r--r-- | kernel/softirq.c | 6 | ||||
| -rw-r--r-- | kernel/sysctl.c | 8 | ||||
| -rw-r--r-- | kernel/time/tick-sched.c | 5 | ||||
| -rw-r--r-- | kernel/timer.c | 1 | ||||
| -rw-r--r-- | kernel/trace/trace.c | 1 | ||||
| -rw-r--r-- | kernel/trace/trace_sched_wakeup.c | 2 | ||||
| -rw-r--r-- | kernel/tsacct.c | 44 | ||||
| -rw-r--r-- | kernel/watchdog.c | 1 |
29 files changed, 462 insertions, 123 deletions
diff --git a/kernel/acct.c b/kernel/acct.c index 051e071a06e7..e8b1627ab9c7 100644 --- a/kernel/acct.c +++ b/kernel/acct.c | |||
| @@ -566,6 +566,7 @@ out: | |||
| 566 | void acct_collect(long exitcode, int group_dead) | 566 | void acct_collect(long exitcode, int group_dead) |
| 567 | { | 567 | { |
| 568 | struct pacct_struct *pacct = ¤t->signal->pacct; | 568 | struct pacct_struct *pacct = ¤t->signal->pacct; |
| 569 | cputime_t utime, stime; | ||
| 569 | unsigned long vsize = 0; | 570 | unsigned long vsize = 0; |
| 570 | 571 | ||
| 571 | if (group_dead && current->mm) { | 572 | if (group_dead && current->mm) { |
| @@ -593,8 +594,9 @@ void acct_collect(long exitcode, int group_dead) | |||
| 593 | pacct->ac_flag |= ACORE; | 594 | pacct->ac_flag |= ACORE; |
| 594 | if (current->flags & PF_SIGNALED) | 595 | if (current->flags & PF_SIGNALED) |
| 595 | pacct->ac_flag |= AXSIG; | 596 | pacct->ac_flag |= AXSIG; |
| 596 | pacct->ac_utime += current->utime; | 597 | task_cputime(current, &utime, &stime); |
| 597 | pacct->ac_stime += current->stime; | 598 | pacct->ac_utime += utime; |
| 599 | pacct->ac_stime += stime; | ||
| 598 | pacct->ac_minflt += current->min_flt; | 600 | pacct->ac_minflt += current->min_flt; |
| 599 | pacct->ac_majflt += current->maj_flt; | 601 | pacct->ac_majflt += current->maj_flt; |
| 600 | spin_unlock_irq(¤t->sighand->siglock); | 602 | spin_unlock_irq(¤t->sighand->siglock); |
diff --git a/kernel/context_tracking.c b/kernel/context_tracking.c index d566aba7e801..65349f07b878 100644 --- a/kernel/context_tracking.c +++ b/kernel/context_tracking.c | |||
| @@ -15,26 +15,13 @@ | |||
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #include <linux/context_tracking.h> | 17 | #include <linux/context_tracking.h> |
| 18 | #include <linux/kvm_host.h> | ||
| 18 | #include <linux/rcupdate.h> | 19 | #include <linux/rcupdate.h> |
| 19 | #include <linux/sched.h> | 20 | #include <linux/sched.h> |
| 20 | #include <linux/percpu.h> | ||
| 21 | #include <linux/hardirq.h> | 21 | #include <linux/hardirq.h> |
| 22 | #include <linux/export.h> | ||
| 22 | 23 | ||
| 23 | struct context_tracking { | 24 | DEFINE_PER_CPU(struct context_tracking, context_tracking) = { |
| 24 | /* | ||
| 25 | * When active is false, probes are unset in order | ||
| 26 | * to minimize overhead: TIF flags are cleared | ||
| 27 | * and calls to user_enter/exit are ignored. This | ||
| 28 | * may be further optimized using static keys. | ||
| 29 | */ | ||
| 30 | bool active; | ||
| 31 | enum { | ||
| 32 | IN_KERNEL = 0, | ||
| 33 | IN_USER, | ||
| 34 | } state; | ||
| 35 | }; | ||
| 36 | |||
| 37 | static DEFINE_PER_CPU(struct context_tracking, context_tracking) = { | ||
| 38 | #ifdef CONFIG_CONTEXT_TRACKING_FORCE | 25 | #ifdef CONFIG_CONTEXT_TRACKING_FORCE |
| 39 | .active = true, | 26 | .active = true, |
| 40 | #endif | 27 | #endif |
| @@ -70,7 +57,6 @@ void user_enter(void) | |||
| 70 | local_irq_save(flags); | 57 | local_irq_save(flags); |
| 71 | if (__this_cpu_read(context_tracking.active) && | 58 | if (__this_cpu_read(context_tracking.active) && |
| 72 | __this_cpu_read(context_tracking.state) != IN_USER) { | 59 | __this_cpu_read(context_tracking.state) != IN_USER) { |
| 73 | __this_cpu_write(context_tracking.state, IN_USER); | ||
| 74 | /* | 60 | /* |
| 75 | * At this stage, only low level arch entry code remains and | 61 | * At this stage, only low level arch entry code remains and |
| 76 | * then we'll run in userspace. We can assume there won't be | 62 | * then we'll run in userspace. We can assume there won't be |
| @@ -78,7 +64,9 @@ void user_enter(void) | |||
| 78 | * user_exit() or rcu_irq_enter(). Let's remove RCU's dependency | 64 | * user_exit() or rcu_irq_enter(). Let's remove RCU's dependency |
| 79 | * on the tick. | 65 | * on the tick. |
| 80 | */ | 66 | */ |
| 67 | vtime_user_enter(current); | ||
| 81 | rcu_user_enter(); | 68 | rcu_user_enter(); |
| 69 | __this_cpu_write(context_tracking.state, IN_USER); | ||
| 82 | } | 70 | } |
| 83 | local_irq_restore(flags); | 71 | local_irq_restore(flags); |
| 84 | } | 72 | } |
| @@ -104,16 +92,35 @@ void user_exit(void) | |||
| 104 | 92 | ||
| 105 | local_irq_save(flags); | 93 | local_irq_save(flags); |
| 106 | if (__this_cpu_read(context_tracking.state) == IN_USER) { | 94 | if (__this_cpu_read(context_tracking.state) == IN_USER) { |
| 107 | __this_cpu_write(context_tracking.state, IN_KERNEL); | ||
| 108 | /* | 95 | /* |
| 109 | * We are going to run code that may use RCU. Inform | 96 | * We are going to run code that may use RCU. Inform |
| 110 | * RCU core about that (ie: we may need the tick again). | 97 | * RCU core about that (ie: we may need the tick again). |
| 111 | */ | 98 | */ |
| 112 | rcu_user_exit(); | 99 | rcu_user_exit(); |
| 100 | vtime_user_exit(current); | ||
| 101 | __this_cpu_write(context_tracking.state, IN_KERNEL); | ||
| 113 | } | 102 | } |
| 114 | local_irq_restore(flags); | 103 | local_irq_restore(flags); |
| 115 | } | 104 | } |
| 116 | 105 | ||
| 106 | void guest_enter(void) | ||
| 107 | { | ||
| 108 | if (vtime_accounting_enabled()) | ||
| 109 | vtime_guest_enter(current); | ||
| 110 | else | ||
| 111 | __guest_enter(); | ||
| 112 | } | ||
| 113 | EXPORT_SYMBOL_GPL(guest_enter); | ||
| 114 | |||
| 115 | void guest_exit(void) | ||
| 116 | { | ||
| 117 | if (vtime_accounting_enabled()) | ||
| 118 | vtime_guest_exit(current); | ||
| 119 | else | ||
| 120 | __guest_exit(); | ||
| 121 | } | ||
| 122 | EXPORT_SYMBOL_GPL(guest_exit); | ||
| 123 | |||
| 117 | 124 | ||
| 118 | /** | 125 | /** |
| 119 | * context_tracking_task_switch - context switch the syscall callbacks | 126 | * context_tracking_task_switch - context switch the syscall callbacks |
diff --git a/kernel/cpu.c b/kernel/cpu.c index 3046a503242c..e5d5e8e1e030 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c | |||
| @@ -224,11 +224,13 @@ void clear_tasks_mm_cpumask(int cpu) | |||
| 224 | static inline void check_for_tasks(int cpu) | 224 | static inline void check_for_tasks(int cpu) |
| 225 | { | 225 | { |
| 226 | struct task_struct *p; | 226 | struct task_struct *p; |
| 227 | cputime_t utime, stime; | ||
| 227 | 228 | ||
| 228 | write_lock_irq(&tasklist_lock); | 229 | write_lock_irq(&tasklist_lock); |
| 229 | for_each_process(p) { | 230 | for_each_process(p) { |
| 231 | task_cputime(p, &utime, &stime); | ||
| 230 | if (task_cpu(p) == cpu && p->state == TASK_RUNNING && | 232 | if (task_cpu(p) == cpu && p->state == TASK_RUNNING && |
