diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index b7480fb5c3dc..254d56de2548 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -2212,6 +2212,27 @@ static int sched_balance_self(int cpu, int flag) | |||
2212 | 2212 | ||
2213 | #endif /* CONFIG_SMP */ | 2213 | #endif /* CONFIG_SMP */ |
2214 | 2214 | ||
2215 | /** | ||
2216 | * task_oncpu_function_call - call a function on the cpu on which a task runs | ||
2217 | * @p: the task to evaluate | ||
2218 | * @func: the function to be called | ||
2219 | * @info: the function call argument | ||
2220 | * | ||
2221 | * Calls the function @func when the task is currently running. This might | ||
2222 | * be on the current CPU, which just calls the function directly | ||
2223 | */ | ||
2224 | void task_oncpu_function_call(struct task_struct *p, | ||
2225 | void (*func) (void *info), void *info) | ||
2226 | { | ||
2227 | int cpu; | ||
2228 | |||
2229 | preempt_disable(); | ||
2230 | cpu = task_cpu(p); | ||
2231 | if (task_curr(p)) | ||
2232 | smp_call_function_single(cpu, func, info, 1); | ||
2233 | preempt_enable(); | ||
2234 | } | ||
2235 | |||
2215 | /*** | 2236 | /*** |
2216 | * try_to_wake_up - wake up a thread | 2237 | * try_to_wake_up - wake up a thread |
2217 | * @p: the to-be-woken-up thread | 2238 | * @p: the to-be-woken-up thread |
@@ -2534,6 +2555,7 @@ prepare_task_switch(struct rq *rq, struct task_struct *prev, | |||
2534 | struct task_struct *next) | 2555 | struct task_struct *next) |
2535 | { | 2556 | { |
2536 | fire_sched_out_preempt_notifiers(prev, next); | 2557 | fire_sched_out_preempt_notifiers(prev, next); |
2558 | perf_counter_task_sched_out(prev, cpu_of(rq)); | ||
2537 | prepare_lock_switch(rq, next); | 2559 | prepare_lock_switch(rq, next); |
2538 | prepare_arch_switch(next); | 2560 | prepare_arch_switch(next); |
2539 | } | 2561 | } |
@@ -2574,6 +2596,7 @@ static void finish_task_switch(struct rq *rq, struct task_struct *prev) | |||
2574 | */ | 2596 | */ |
2575 | prev_state = prev->state; | 2597 | prev_state = prev->state; |
2576 | finish_arch_switch(prev); | 2598 | finish_arch_switch(prev); |
2599 | perf_counter_task_sched_in(current, cpu_of(rq)); | ||
2577 | finish_lock_switch(rq, prev); | 2600 | finish_lock_switch(rq, prev); |
2578 | #ifdef CONFIG_SMP | 2601 | #ifdef CONFIG_SMP |
2579 | if (current->sched_class->post_schedule) | 2602 | if (current->sched_class->post_schedule) |
@@ -4296,6 +4319,7 @@ void scheduler_tick(void) | |||
4296 | rq->idle_at_tick = idle_cpu(cpu); | 4319 | rq->idle_at_tick = idle_cpu(cpu); |
4297 | trigger_load_balance(rq, cpu); | 4320 | trigger_load_balance(rq, cpu); |
4298 | #endif | 4321 | #endif |
4322 | perf_counter_task_tick(curr, cpu); | ||
4299 | } | 4323 | } |
4300 | 4324 | ||
4301 | #if defined(CONFIG_PREEMPT) && (defined(CONFIG_DEBUG_PREEMPT) || \ | 4325 | #if defined(CONFIG_PREEMPT) && (defined(CONFIG_DEBUG_PREEMPT) || \ |