On Thu, Nov 23, 2017 at 02:13:01PM +0100, Mike Galbraith wrote: > On Thu, 2017-11-23 at 11:52 +0100, Uladzislau Rezki wrote: > > Hello, Atish, Peter, all. > > > > I have a question about if a task's nr_cpus_allowed is 1. > > In that scenario we do not call select_task_rq. Therefore > > even thought a task "p" is placed on idle CPU that CPU > > will not be marked as claimed for wake-up. > > > > What do you think about adding per_cpu(claim_wakeup, cpu) = 1; > > to select_task_rq() instead and possibly get rid of them from > > other places (increases a race window a bit)? > > My thoughts on all of this is that we need less SIS, not more. Rather > than trying so hard for the absolute lowest wakeup latency, which > induces throughput/efficiency robbing bouncing, I think we'd be better > of considering leaving an already llc affine task where it is if the > average cycle time is sufficiently low that it will likely hit the CPU > RSN. I guess there is misunderstanding here. The main goal is not to cover pinned case, for sure. I was thinking more about below points:
- Extend a claim_wake_up logic for making an ILB/NO_HZ decision more predictable (that is good for mobile workloads). Because as it is right now it simply returns a first CPU in a "nohz" mask and if we know that CPU has been claimed i think it is worth to go with another ILB core, since waking up on a remote CPU + doing nohz_idle_balance does not improve wake-up latency and is a miss from ilb point of view. - Get rid of duplication; - Be not limited to pinned case. If you have any proposal, i would be appreciated if you could share your specific view. > Completely ignoring low utilization kernel threads would go a > long way to getting rid of bouncing userspace (which tends to have a > meaningful footprint), all over hell and creation. > > You could also periodically send mobile kthreads down the slow path to > try to keep them the hell away from partially busy CPUs, as well as > anything else that hasn't run for a while, to keep background cruft > from continually injecting itself into the middle of a cross core > cyber-sex. CPU is not considered idle (in terms of idle_cpu()) until it hits a first rule checking a condition if current is idle thread or not. If we hit last check when a claim wake-up is set it means that CPU switches from idle state to non-idle one and it will happen quite soon depending on wake-up latency. Considering a core as not-idle when somebody tends to wake up a task on it is a good point. If you have any specific example when it is bad, please share it. -- Uladzislau Rezki