| #ifdef CONFIG_SMP |
| |
| int __update_load_avg_blocked_se(u64 now, int cpu, struct sched_entity *se); |
| int __update_load_avg_se(u64 now, int cpu, struct cfs_rq *cfs_rq, struct sched_entity *se); |
| int __update_load_avg_cfs_rq(u64 now, int cpu, struct cfs_rq *cfs_rq); |
| int update_rt_rq_load_avg(u64 now, struct rq *rq, int running); |
| int update_dl_rq_load_avg(u64 now, struct rq *rq, int running); |
| |
| #ifdef CONFIG_HAVE_SCHED_AVG_IRQ |
| int update_irq_load_avg(struct rq *rq, u64 running); |
| #else |
| static inline int |
| update_irq_load_avg(struct rq *rq, u64 running) |
| { |
| return 0; |
| } |
| #endif |
| |
| /* |
| * When a task is dequeued, its estimated utilization should not be update if |
| * its util_avg has not been updated at least once. |
| * This flag is used to synchronize util_avg updates with util_est updates. |
| * We map this information into the LSB bit of the utilization saved at |
| * dequeue time (i.e. util_est.dequeued). |
| */ |
| #define UTIL_AVG_UNCHANGED 0x1 |
| |
| static inline void cfs_se_util_change(struct sched_avg *avg) |
| { |
| unsigned int enqueued; |
| |
| if (!sched_feat(UTIL_EST)) |
| return; |
| |
| /* Avoid store if the flag has been already set */ |
| enqueued = avg->util_est.enqueued; |
| if (!(enqueued & UTIL_AVG_UNCHANGED)) |
| return; |
| |
| /* Reset flag to report util_avg has been updated */ |
| enqueued &= ~UTIL_AVG_UNCHANGED; |
| WRITE_ONCE(avg->util_est.enqueued, enqueued); |
| } |
| |
| #else |
| |
| static inline int |
| update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq) |
| { |
| return 0; |
| } |
| |
| static inline int |
| update_rt_rq_load_avg(u64 now, struct rq *rq, int running) |
| { |
| return 0; |
| } |
| |
| static inline int |
| update_dl_rq_load_avg(u64 now, struct rq *rq, int running) |
| { |
| return 0; |
| } |
| |
| static inline int |
| update_irq_load_avg(struct rq *rq, u64 running) |
| { |
| return 0; |
| } |
| #endif |
| |
| |