Messages in this thread | | | Date | Mon, 19 Jun 2023 11:43:13 +0530 | From | "Gautham R. Shenoy" <> | Subject | Re: [RFC PATCH 3/3] sched: Implement shared wakequeue in CFS |
| |
Hello David,
On Tue, Jun 13, 2023 at 12:20:04AM -0500, David Vernet wrote: [..snip..]
> +static void swqueue_enqueue(struct rq *rq, struct task_struct *p, int enq_flags) > +{ > + unsigned long flags; > + struct swqueue *swqueue; > + bool task_migrated = enq_flags & ENQUEUE_MIGRATED; > + bool task_wakeup = enq_flags & ENQUEUE_WAKEUP; > + > + /* > + * Only enqueue the task in the shared wakequeue if: > + * > + * - SWQUEUE is enabled > + * - The task is on the wakeup path > + * - The task wasn't purposefully migrated to the current rq by > + * select_task_rq() > + * - The task isn't pinned to a specific CPU > + */ > + if (!task_wakeup || task_migrated || p->nr_cpus_allowed == 1) > + return;
In select_task_rq_fair(), having determined if the target of task wakeup should be the task's previous CPU vs the waker's current CPU, we spend quite a bit of time already to determine if there is an idle core/CPU in the target's LLC. @rq would correspond to CPU chosen as a result of that scan or if no idle CPU exists, @rq corresponds to the target CPU determined by wake_affine_idle()/wake_affine_weight().
So if the CPU of @rq is idle here, can we not simply return here?
Or if the idea is to avoid the scan for an idle core/CPU in select_task_rq_fair(), then
Perhaps I am missing something...
> + > + swqueue = rq_swqueue(rq); > + spin_lock_irqsave(&swqueue->lock, flags); > + list_add_tail(&p->swqueue_node, &swqueue->list); > + spin_unlock_irqrestore(&swqueue->lock, flags); > +} > +
-- Thanks and Regards gautham.
| |