diff options
| -rw-r--r-- | kernel/sched/core.c | 38 | ||||
| -rw-r--r-- | kernel/sched/deadline.c | 2 | ||||
| -rw-r--r-- | kernel/sched/fair.c | 7 | ||||
| -rw-r--r-- | kernel/sched/rt.c | 2 | ||||
| -rw-r--r-- | kernel/sched/sched.h | 2 |
5 files changed, 24 insertions, 27 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 797a6c84c48d..24beb9bb4c3e 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -2475,31 +2475,6 @@ EXPORT_PER_CPU_SYMBOL(kstat); | |||
| 2475 | EXPORT_PER_CPU_SYMBOL(kernel_cpustat); | 2475 | EXPORT_PER_CPU_SYMBOL(kernel_cpustat); |
| 2476 | 2476 | ||
| 2477 | /* | 2477 | /* |
| 2478 | * Return any ns on the sched_clock that have not yet been accounted in | ||
| 2479 | * @p in case that task is currently running. | ||
| 2480 | * | ||
| 2481 | * Called with task_rq_lock() held on @rq. | ||
| 2482 | */ | ||
| 2483 | static u64 do_task_delta_exec(struct task_struct *p, struct rq *rq) | ||
| 2484 | { | ||
| 2485 | u64 ns = 0; | ||
| 2486 | |||
| 2487 | /* | ||
| 2488 | * Must be ->curr _and_ ->on_rq. If dequeued, we would | ||
| 2489 | * project cycles that may never be accounted to this | ||
| 2490 | * thread, breaking clock_gettime(). | ||
| 2491 | */ | ||
| 2492 | if (task_current(rq, p) && task_on_rq_queued(p)) { | ||
| 2493 | update_rq_clock(rq); | ||
| 2494 | ns = rq_clock_task(rq) - p->se.exec_start; | ||
| 2495 | if ((s64)ns < 0) | ||
| 2496 | ns = 0; | ||
| 2497 | } | ||
| 2498 | |||
| 2499 | return ns; | ||
| 2500 | } | ||
| 2501 | |||
| 2502 | /* | ||
| 2503 | * Return accounted runtime for the task. | 2478 | * Return accounted runtime for the task. |
| 2504 | * In case the task is currently running, return the runtime plus current's | 2479 | * In case the task is currently running, return the runtime plus current's |
| 2505 | * pending runtime that have not been accounted yet. | 2480 | * pending runtime that have not been accounted yet. |
| @@ -2508,7 +2483,7 @@ unsigned long long task_sched_runtime(struct task_struct *p) | |||
| 2508 | { | 2483 | { |
| 2509 | unsigned long flags; | 2484 | unsigned long flags; |
| 2510 | struct rq *rq; | 2485 | struct rq *rq; |
| 2511 | u64 ns = 0; | 2486 | u64 ns; |
| 2512 | 2487 | ||
| 2513 | #if defined(CONFIG_64BIT) && defined(CONFIG_SMP) | 2488 | #if defined(CONFIG_64BIT) && defined(CONFIG_SMP) |
| 2514 | /* | 2489 | /* |
| @@ -2527,7 +2502,16 @@ unsigned long long task_sched_runtime(struct task_struct *p) | |||
| 2527 | #endif | 2502 | #endif |
| 2528 | 2503 | ||
| 2529 | rq = task_rq_lock(p, &flags); | 2504 | rq = task_rq_lock(p, &flags); |
| 2530 | ns = p->se.sum_exec_runtime + do_task_delta_exec(p, rq); | 2505 | /* |
| 2506 | * Must be ->curr _and_ ->on_rq. If dequeued, we would | ||
| 2507 | * project cycles that may never be accounted to this | ||
| 2508 | * thread, breaking clock_gettime(). | ||
| 2509 | */ | ||
| 2510 | if (task_current(rq, p) && task_on_rq_queued(p)) { | ||
| 2511 | update_rq_clock(rq); | ||
| 2512 | p->sched_class->update_curr(rq); | ||
| 2513 | } | ||
| 2514 | ns = p->se.sum_exec_runtime; | ||
| 2531 | task_rq_unlock(rq, p, &flags); | 2515 | task_rq_unlock(rq, p, &flags); |
| 2532 | 2516 | ||
| 2533 | return ns; | 2517 | return ns; |
diff --git a/kernel/sched/deadline.c b/kernel/sched/deadline.c index 5285332392d5..28fa9d9e9201 100644 --- a/kernel/sched/deadline.c +++ b/kernel/sched/deadline.c | |||
| @@ -1701,4 +1701,6 @@ const struct sched_class dl_sched_class = { | |||
| 1701 | .prio_changed = prio_changed_dl, | 1701 | .prio_changed = prio_changed_dl, |
| 1702 | .switched_from = switched_from_dl, | 1702 | .switched_from = switched_from_dl, |
| 1703 | .switched_to = switched_to_dl, | 1703 | .switched_to = switched_to_dl, |
| 1704 | |||
| 1705 | .update_curr = update_curr_dl, | ||
| 1704 | }; | 1706 | }; |
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 3af3d1e7df9b..ef2b104b254c 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c | |||
| @@ -726,6 +726,11 @@ static void update_curr(struct cfs_rq *cfs_rq) | |||
| 726 | account_cfs_rq_runtime(cfs_rq, delta_exec); | 726 | account_cfs_rq_runtime(cfs_rq, delta_exec); |
| 727 | } | 727 | } |
| 728 | 728 | ||
| 729 | static void update_curr_fair(struct rq *rq) | ||
| 730 | { | ||
| 731 | update_curr(cfs_rq_of(&rq->curr->se)); | ||
| 732 | } | ||
| 733 | |||
| 729 | static inline void | 734 | static inline void |
| 730 | update_stats_wait_start(struct cfs_rq *cfs_rq, struct sched_entity *se) | 735 | update_stats_wait_start(struct cfs_rq *cfs_rq, struct sched_entity *se) |
| 731 | { | 736 | { |
| @@ -7956,6 +7961,8 @@ const struct sched_class fair_sched_class = { | |||
| 7956 | 7961 | ||
| 7957 | .get_rr_interval = get_rr_interval_fair, | 7962 | .get_rr_interval = get_rr_interval_fair, |
| 7958 | 7963 | ||
| 7964 | .update_curr = update_curr_fair, | ||
| 7965 | |||
| 7959 | #ifdef CONFIG_FAIR_GROUP_SCHED | 7966 | #ifdef CONFIG_FAIR_GROUP_SCHED |
| 7960 | .task_move_group = task_move_group_fair, | 7967 | .task_move_group = task_move_group_fair, |
| 7961 | #endif | 7968 | #endif |
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index d024e6ce30ba..20bca398084a 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c | |||
| @@ -2128,6 +2128,8 @@ const struct sched_class rt_sched_class = { | |||
| 2128 | 2128 | ||
| 2129 | .prio_changed = prio_changed_rt, | 2129 | .prio_changed = prio_changed_rt, |
| 2130 | .switched_to = switched_to_rt, | 2130 | .switched_to = switched_to_rt, |
| 2131 | |||
| 2132 | .update_curr = update_curr_rt, | ||
| 2131 | }; | 2133 | }; |
| 2132 | 2134 | ||
| 2133 | #ifdef CONFIG_SCHED_DEBUG | 2135 | #ifdef CONFIG_SCHED_DEBUG |
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 24156c8434d1..2df8ef067cc5 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h | |||
| @@ -1135,6 +1135,8 @@ struct sched_class { | |||
| 1135 | unsigned int (*get_rr_interval) (struct rq *rq, | 1135 | unsigned int (*get_rr_interval) (struct rq *rq, |
| 1136 | struct task_struct *task); | 1136 | struct task_struct *task); |
| 1137 | 1137 | ||
| 1138 | void (*update_curr) (struct rq *rq); | ||
| 1139 | |||
| 1138 | #ifdef CONFIG_FAIR_GROUP_SCHED | 1140 | #ifdef CONFIG_FAIR_GROUP_SCHED |
| 1139 | void (*task_move_group) (struct task_struct *p, int on_rq); | 1141 | void (*task_move_group) (struct task_struct *p, int on_rq); |
| 1140 | #endif | 1142 | #endif |
