summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2017-01-14 03:42:58 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2017-01-14 03:42:58 -0800
commita1e7739089bd98d1c0b1bb61aa837a05f712c3af (patch)
tree47c2ae8c66b24598a8dcbc2c29eb64d43d5b97c7 /kernel
parent500c0ddd7cb5af7ffaba17b6e2b4490f140e0795 (diff)
parentadd97fe0da92778d694c69c2354446196f6e0f9e (diff)
Merge "sched: fix a bug in handling top task table rollover"
Diffstat (limited to 'kernel')
-rw-r--r--kernel/sched/hmp.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/kernel/sched/hmp.c b/kernel/sched/hmp.c
index 12fa618a8135..15b8f2c80e06 100644
--- a/kernel/sched/hmp.c
+++ b/kernel/sched/hmp.c
@@ -2241,6 +2241,27 @@ static inline void clear_top_tasks_table(u8 *table)
memset(table, 0, NUM_LOAD_INDICES * sizeof(u8));
}
+static void rollover_top_tasks(struct rq *rq, bool full_window)
+{
+ u8 curr_table = rq->curr_table;
+ u8 prev_table = 1 - curr_table;
+ int curr_top = rq->curr_top;
+
+ clear_top_tasks_table(rq->top_tasks[prev_table]);
+ clear_top_tasks_bitmap(rq->top_tasks_bitmap[prev_table]);
+
+ if (full_window) {
+ curr_top = 0;
+ clear_top_tasks_table(rq->top_tasks[curr_table]);
+ clear_top_tasks_bitmap(
+ rq->top_tasks_bitmap[curr_table]);
+ }
+
+ rq->curr_table = prev_table;
+ rq->prev_top = curr_top;
+ rq->curr_top = 0;
+}
+
static u32 empty_windows[NR_CPUS];
static void rollover_task_window(struct task_struct *p, bool full_window)
@@ -2358,29 +2379,18 @@ static void update_cpu_busy_time(struct task_struct *p, struct rq *rq,
if (flip_counters) {
u64 curr_sum = *curr_runnable_sum;
u64 nt_curr_sum = *nt_curr_runnable_sum;
- u8 curr_table = rq->curr_table;
- u8 prev_table = 1 - curr_table;
- int curr_top = rq->curr_top;
-
- clear_top_tasks_table(rq->top_tasks[prev_table]);
- clear_top_tasks_bitmap(rq->top_tasks_bitmap[prev_table]);
- if (prev_sum_reset) {
+ if (prev_sum_reset)
curr_sum = nt_curr_sum = 0;
- curr_top = 0;
- clear_top_tasks_table(rq->top_tasks[curr_table]);
- clear_top_tasks_bitmap(
- rq->top_tasks_bitmap[curr_table]);
- }
*prev_runnable_sum = curr_sum;
*nt_prev_runnable_sum = nt_curr_sum;
*curr_runnable_sum = 0;
*nt_curr_runnable_sum = 0;
- rq->curr_table = prev_table;
- rq->prev_top = curr_top;
- rq->curr_top = 0;
+
+ if (p_is_curr_task)
+ rollover_top_tasks(rq, full_window);
}
if (!account_busy_for_cpu_time(rq, p, irqtime, event))