Loading Documentation/scheduler/sched-hmp.txt +1 −10 Original line number Diff line number Diff line Loading @@ -1350,17 +1350,8 @@ Appears at: /proc/sys/kernel/sched_account_wait_time Default value: 1 This controls whether a tasks wait time is accounted as its demand for cpu This controls whether a task's wait time is accounted as its demand for cpu and thus the values found in its sum, sum_history[] and demand attributes. The load tracking algorithm only considers part of a tasks wait time as its demand. The portion of wait time accounted as demand is determined by each tasks percent load, i.e. a task that waits for 10ms and has 60 % task load, only 6 ms of the wait will contribute to task demand. This approach is fair as the scheduler tries to determine how much of its wait time would a task actually have been using the CPU if it had been executing. It ensures that tasks with high demand continue to see most of the benefits of accounting wait time as busy time, however, lower demand tasks don't experience a disproportionately high boost to demand. *** 7.16 sched_freq_account_wait_time Loading arch/arm64/configs/msm-perf_defconfig +1 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ CONFIG_SYSVIPC=y CONFIG_AUDIT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_RCU_FAST_NO_HZ=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y Loading arch/arm64/configs/msm_defconfig +1 −0 Original line number Diff line number Diff line CONFIG_SYSVIPC=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_AUDIT=y CONFIG_RCU_FAST_NO_HZ=y CONFIG_IKCONFIG=y Loading kernel/sched/core.c +10 −26 Original line number Diff line number Diff line Loading @@ -1631,23 +1631,19 @@ static inline void update_cpu_busy_time(struct task_struct *p, struct rq *rq, static int account_busy_for_task_demand(struct task_struct *p, int event) { /* No need to bother updating task demand for exiting tasks * or the idle task. */ if (exiting_task(p) || is_idle_task(p)) return 0; /* * When a task is waking up it is completing a segment of non-busy /* When a task is waking up it is completing a segment of non-busy * time. Likewise, if wait time is not treated as busy time, then * when a task begins to run or is migrated, it is not running and * is completing a segment of non-busy time. */ * is completing a segment of non-busy time. */ if (event == TASK_WAKE || (!sched_account_wait_time && (event == PICK_NEXT_TASK || event == TASK_MIGRATE))) return 0; /* * We are left with TASK_UPDATE, IRQ_UPDATE, PUT_PREV_TASK and * wait time being accounted as busy time. */ return 1; } Loading Loading @@ -1719,15 +1715,6 @@ static void add_to_task_demand(struct rq *rq, struct task_struct *p, p->ravg.sum = sched_ravg_window; } static u64 wait_adjust(struct task_struct *p, u64 delta, int event) { /* We already know that wait time counts as busy time. */ if (event == PICK_NEXT_TASK || event == TASK_MIGRATE) return div64_u64(delta * task_load(p), max_task_load()); return delta; } /* * Account cpu demand of task and/or update task's cpu demand history * Loading Loading @@ -1802,8 +1789,7 @@ static void update_task_demand(struct task_struct *p, struct rq *rq, if (!new_window) { /* The simple case - busy time contained within the existing * window. */ add_to_task_demand(rq, p, wait_adjust(p, wallclock - mark_start, event)); add_to_task_demand(rq, p, wallclock - mark_start); return; } Loading @@ -1814,14 +1800,13 @@ static void update_task_demand(struct task_struct *p, struct rq *rq, window_start -= (u64)nr_full_windows * (u64)window_size; /* Process (window_start - mark_start) first */ add_to_task_demand(rq, p, wait_adjust(p, window_start - mark_start, event)); add_to_task_demand(rq, p, window_start - mark_start); /* Push new sample(s) into task's demand history */ update_history(rq, p, p->ravg.sum, 1, event); if (nr_full_windows) update_history(rq, p, scale_exec_time(wait_adjust(p, window_size, event), rq), nr_full_windows, event); update_history(rq, p, scale_exec_time(window_size, rq), nr_full_windows, event); /* Roll window_start back to current to process any remainder * in current window. */ Loading @@ -1829,8 +1814,7 @@ static void update_task_demand(struct task_struct *p, struct rq *rq, /* Process (wallclock - window_start) next */ mark_start = window_start; add_to_task_demand(rq, p, wait_adjust(p, wallclock - mark_start, event)); add_to_task_demand(rq, p, wallclock - mark_start); } /* Reflect task activity on its demand and cpu's busy time statistics */ Loading kernel/sched/fair.c +1 −1 Original line number Diff line number Diff line Loading @@ -2449,7 +2449,7 @@ unsigned int __read_mostly sysctl_sched_init_task_load_pct = 15; unsigned int __read_mostly sysctl_sched_min_runtime = 0; /* 0 ms */ u64 __read_mostly sched_min_runtime = 0; /* 0 ms */ unsigned int task_load(struct task_struct *p) static inline unsigned int task_load(struct task_struct *p) { if (sched_use_pelt) return p->se.avg.runnable_avg_sum_scaled; Loading Loading
Documentation/scheduler/sched-hmp.txt +1 −10 Original line number Diff line number Diff line Loading @@ -1350,17 +1350,8 @@ Appears at: /proc/sys/kernel/sched_account_wait_time Default value: 1 This controls whether a tasks wait time is accounted as its demand for cpu This controls whether a task's wait time is accounted as its demand for cpu and thus the values found in its sum, sum_history[] and demand attributes. The load tracking algorithm only considers part of a tasks wait time as its demand. The portion of wait time accounted as demand is determined by each tasks percent load, i.e. a task that waits for 10ms and has 60 % task load, only 6 ms of the wait will contribute to task demand. This approach is fair as the scheduler tries to determine how much of its wait time would a task actually have been using the CPU if it had been executing. It ensures that tasks with high demand continue to see most of the benefits of accounting wait time as busy time, however, lower demand tasks don't experience a disproportionately high boost to demand. *** 7.16 sched_freq_account_wait_time Loading
arch/arm64/configs/msm-perf_defconfig +1 −0 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ CONFIG_SYSVIPC=y CONFIG_AUDIT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_RCU_FAST_NO_HZ=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y Loading
arch/arm64/configs/msm_defconfig +1 −0 Original line number Diff line number Diff line CONFIG_SYSVIPC=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_AUDIT=y CONFIG_RCU_FAST_NO_HZ=y CONFIG_IKCONFIG=y Loading
kernel/sched/core.c +10 −26 Original line number Diff line number Diff line Loading @@ -1631,23 +1631,19 @@ static inline void update_cpu_busy_time(struct task_struct *p, struct rq *rq, static int account_busy_for_task_demand(struct task_struct *p, int event) { /* No need to bother updating task demand for exiting tasks * or the idle task. */ if (exiting_task(p) || is_idle_task(p)) return 0; /* * When a task is waking up it is completing a segment of non-busy /* When a task is waking up it is completing a segment of non-busy * time. Likewise, if wait time is not treated as busy time, then * when a task begins to run or is migrated, it is not running and * is completing a segment of non-busy time. */ * is completing a segment of non-busy time. */ if (event == TASK_WAKE || (!sched_account_wait_time && (event == PICK_NEXT_TASK || event == TASK_MIGRATE))) return 0; /* * We are left with TASK_UPDATE, IRQ_UPDATE, PUT_PREV_TASK and * wait time being accounted as busy time. */ return 1; } Loading Loading @@ -1719,15 +1715,6 @@ static void add_to_task_demand(struct rq *rq, struct task_struct *p, p->ravg.sum = sched_ravg_window; } static u64 wait_adjust(struct task_struct *p, u64 delta, int event) { /* We already know that wait time counts as busy time. */ if (event == PICK_NEXT_TASK || event == TASK_MIGRATE) return div64_u64(delta * task_load(p), max_task_load()); return delta; } /* * Account cpu demand of task and/or update task's cpu demand history * Loading Loading @@ -1802,8 +1789,7 @@ static void update_task_demand(struct task_struct *p, struct rq *rq, if (!new_window) { /* The simple case - busy time contained within the existing * window. */ add_to_task_demand(rq, p, wait_adjust(p, wallclock - mark_start, event)); add_to_task_demand(rq, p, wallclock - mark_start); return; } Loading @@ -1814,14 +1800,13 @@ static void update_task_demand(struct task_struct *p, struct rq *rq, window_start -= (u64)nr_full_windows * (u64)window_size; /* Process (window_start - mark_start) first */ add_to_task_demand(rq, p, wait_adjust(p, window_start - mark_start, event)); add_to_task_demand(rq, p, window_start - mark_start); /* Push new sample(s) into task's demand history */ update_history(rq, p, p->ravg.sum, 1, event); if (nr_full_windows) update_history(rq, p, scale_exec_time(wait_adjust(p, window_size, event), rq), nr_full_windows, event); update_history(rq, p, scale_exec_time(window_size, rq), nr_full_windows, event); /* Roll window_start back to current to process any remainder * in current window. */ Loading @@ -1829,8 +1814,7 @@ static void update_task_demand(struct task_struct *p, struct rq *rq, /* Process (wallclock - window_start) next */ mark_start = window_start; add_to_task_demand(rq, p, wait_adjust(p, wallclock - mark_start, event)); add_to_task_demand(rq, p, wallclock - mark_start); } /* Reflect task activity on its demand and cpu's busy time statistics */ Loading
kernel/sched/fair.c +1 −1 Original line number Diff line number Diff line Loading @@ -2449,7 +2449,7 @@ unsigned int __read_mostly sysctl_sched_init_task_load_pct = 15; unsigned int __read_mostly sysctl_sched_min_runtime = 0; /* 0 ms */ u64 __read_mostly sched_min_runtime = 0; /* 0 ms */ unsigned int task_load(struct task_struct *p) static inline unsigned int task_load(struct task_struct *p) { if (sched_use_pelt) return p->se.avg.runnable_avg_sum_scaled; Loading