Messages in this thread Patch in this message | | | From | Tim Chen <> | Subject | Re: [RFC PATCH v2 11/17] sched: Basic tracking of matching tasks | Date | Tue, 23 Apr 2019 17:08:08 -0700 |
| |
On 4/23/19 9:18 AM, Vineeth Remanan Pillai wrote:
> +/* real prio, less is less */ > +static inline bool __prio_less(struct task_struct *a, struct task_struct *b, bool core_cmp) > +{ > + u64 vruntime; > + > + int pa = __task_prio(a), pb = __task_prio(b); > + > + if (-pa < -pb) > + return true; > + > + if (-pb < -pa) > + return false; > + > + if (pa == -1) /* dl_prio() doesn't work because of stop_class above */ > + return !dl_time_before(a->dl.deadline, b->dl.deadline); > + > + vruntime = b->se.vruntime; > + if (core_cmp) { > + vruntime -= task_cfs_rq(b)->min_vruntime; > + vruntime += task_cfs_rq(a)->min_vruntime; > + } > + if (pa == MAX_RT_PRIO + MAX_NICE) /* fair */ > + return !((s64)(a->se.vruntime - vruntime) <= 0); > + > + return false; > +} > + > +static inline bool cpu_prio_less(struct task_struct *a, struct task_struct *b) > +{ > + return __prio_less(a, b, false); > +} > + > +static inline bool core_prio_less(struct task_struct *a, struct task_struct *b) > +{ > + return __prio_less(a, b, true); > +} > + > +static inline bool __sched_core_less(struct task_struct *a, struct task_struct *b) > +{ > + if (a->core_cookie < b->core_cookie) > + return true; > + > + if (a->core_cookie > b->core_cookie) > + return false; > + > + /* flip prio, so high prio is leftmost */ > + if (cpu_prio_less(b, a)) > + return true; > + > + return false; > +} > +
A minor nitpick. I find keeping the vruntime base readjustment in core_prio_less probably is more straight forward rather than pass a core_cmp bool around.
Tim
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 455e7ecc2f48..5917fb85669b 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -100,15 +87,13 @@ static inline struct cfs_rq *task_cfs_rq(struct task_struct *p) */ /* real prio, less is less */ -static inline bool __prio_less(struct task_struct *a, struct task_struct *b, bool core_cmp) +static inline bool __prio_less(struct task_struct *a, struct task_struct *b, u64 vruntime) { - u64 vruntime; - int pa = __task_prio(a), pb = __task_prio(b); trace_printk("(%s/%d;%d,%Lu,%Lu) ?< (%s/%d;%d,%Lu,%Lu)\n", - a->comm, a->pid, pa, a->se.vruntime, a->dl.deadline, - b->comm, b->pid, pa, b->se.vruntime, b->dl.deadline); + a->comm, a->pid, pa, a->se.vruntime, a->dl.deadline, + b->comm, b->pid, pa, b->se.vruntime, b->dl.deadline); if (-pa < -pb) return true; @@ -119,11 +104,6 @@ static inline bool __prio_less(struct task_struct *a, struct task_struct *b, boo if (pa == -1) /* dl_prio() doesn't work because of stop_class above */ return !dl_time_before(a->dl.deadline, b->dl.deadline); - vruntime = b->se.vruntime; - if (core_cmp) { - vruntime -= task_cfs_rq(b)->min_vruntime; - vruntime += task_cfs_rq(a)->min_vruntime; - } if (pa == MAX_RT_PRIO + MAX_NICE) /* fair */ return !((s64)(a->se.vruntime - vruntime) <= 0); @@ -132,12 +112,17 @@ static inline bool __prio_less(struct task_struct *a, struct task_struct *b, boo static inline bool cpu_prio_less(struct task_struct *a, struct task_struct *b) { - return __prio_less(a, b, false); + return __prio_less(a, b, b->se.vruntime); } static inline bool core_prio_less(struct task_struct *a, struct task_struct *b) { - return __prio_less(a, b, true); + u64 vruntime = b->se.vruntime; + + vruntime -= task_cfs_rq(b)->min_vruntime; + vruntime += task_cfs_rq(a)->min_vruntime; + + return __prio_less(a, b, vruntime); } static inline bool __sched_core_less(struct task_struct *a, struct task_struct *b)
| |