diff options
author | Linux Build Service Account <lnxbuild@localhost> | 2017-01-14 03:42:58 -0800 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2017-01-14 03:42:58 -0800 |
commit | a1e7739089bd98d1c0b1bb61aa837a05f712c3af (patch) | |
tree | 47c2ae8c66b24598a8dcbc2c29eb64d43d5b97c7 /kernel | |
parent | 500c0ddd7cb5af7ffaba17b6e2b4490f140e0795 (diff) | |
parent | add97fe0da92778d694c69c2354446196f6e0f9e (diff) |
Merge "sched: fix a bug in handling top task table rollover"
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/sched/hmp.c | 40 |
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)) |