-
Notifications
You must be signed in to change notification settings - Fork 5
barrier: Add smp_cond_load_*_timeout() #6162
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
barrier: Add smp_cond_load_*_timeout() #6162
Conversation
|
Upstream branch: 48a97ff |
AI reviewed your patch. Please fix the bug or email reply why it's not a bug. In-Reply-To-Subject: |
|
Forwarding comment 3414086411 via email |
cf0c057 to
ccb5a6d
Compare
|
Upstream branch: 48a97ff |
33ad338 to
cf0608a
Compare
ccb5a6d to
87d0496
Compare
|
Upstream branch: 50de48a |
cf0608a to
d3ab866
Compare
87d0496 to
83f20be
Compare
|
Upstream branch: c67f4ae |
d3ab866 to
ca73e78
Compare
83f20be to
b7224b3
Compare
|
Upstream branch: 7361c86 |
ca73e78 to
1040aa5
Compare
b7224b3 to
2b803ce
Compare
|
Upstream branch: 04a8995 |
1040aa5 to
0ecef12
Compare
2b803ce to
9b33bf7
Compare
Add smp_cond_load_relaxed_timeout(), which extends smp_cond_load_relaxed() to allow waiting for a duration. The waiting loop uses cpu_poll_relax() to wait on the condition variable with a periodic evaluation of a time-check. cpu_poll_relax() unless overridden by the arch code, amounts to a cpu_relax(). The number of times we spin is defined by SMP_TIMEOUT_POLL_COUNT (chosen to be 200 by default) which, assuming each cpu_poll_relax() iteration takes around 20-30 cycles (measured on a variety of x86 platforms), for a total of ~4000-6000 cycles. Cc: Arnd Bergmann <[email protected]> Cc: Will Deacon <[email protected]> Cc: Catalin Marinas <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: [email protected] Reviewed-by: Catalin Marinas <[email protected]> Reviewed-by: Haris Okanovic <[email protected]> Tested-by: Haris Okanovic <[email protected]> Signed-off-by: Ankur Arora <[email protected]>
Support waiting in smp_cond_load_relaxed_timeout() via __cmpwait_relaxed(). Limit this to when the event-stream is enabled, to ensure that we wake from WFE periodically and don't block forever if there are no stores to the cacheline. In the unlikely event that the event-stream is unavailable, fallback to spin-waiting. Also set SMP_TIMEOUT_POLL_COUNT to 1 so we do the time-check for each iteration in smp_cond_load_relaxed_timeout(). Cc: [email protected] Cc: Catalin Marinas <[email protected]> Suggested-by: Will Deacon <[email protected]> Signed-off-by: Ankur Arora <[email protected]>
…ait() In preparation for defining smp_cond_load_acquire_timeout(), remove the private copy. Lacking this, the rqspinlock code falls back to using smp_cond_load_acquire(). Cc: Kumar Kartikeya Dwivedi <[email protected]> Cc: Alexei Starovoitov <[email protected]> Reviewed-by: Catalin Marinas <[email protected]> Reviewed-by: Haris Okanovic <[email protected]> Signed-off-by: Ankur Arora <[email protected]>
Add the acquire variant of smp_cond_load_relaxed_timeout(). This reuses the relaxed variant, with an additional LOAD->LOAD ordering. Cc: Arnd Bergmann <[email protected]> Cc: Will Deacon <[email protected]> Cc: Catalin Marinas <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: [email protected] Reviewed-by: Catalin Marinas <[email protected]> Reviewed-by: Haris Okanovic <[email protected]> Tested-by: Haris Okanovic <[email protected]> Signed-off-by: Ankur Arora <[email protected]>
Add atomic load wrappers, atomic_cond_read_*_timeout() and atomic64_cond_read_*_timeout() for the cond-load timeout interfaces. Cc: Will Deacon <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Boqun Feng <[email protected]> Signed-off-by: Ankur Arora <[email protected]>
Switch out the conditional load interfaces used by rqspinlock to atomic_cond_read_acquire_timeout(), and smp_cond_read_acquire_timeout(). Both these handle the timeout and amortize as needed, so use check_timeout() directly. Also, when using spin-wait implementations, redefine SMP_TIMEOUT_POLL_COUNT to be 16k to be similar to the spin-count used in RES_CHECK_TIMEOUT(). Cc: Kumar Kartikeya Dwivedi <[email protected]> Cc: Alexei Starovoitov <[email protected]> Signed-off-by: Ankur Arora <[email protected]>
The inner loop in poll_idle() polls over the thread_info flags, waiting to see if the thread has TIF_NEED_RESCHED set. The loop exits once the condition is met, or if the poll time limit has been exceeded. To minimize the number of instructions executed in each iteration, the time check is done only intermittently (once every POLL_IDLE_RELAX_COUNT iterations). In addition, each loop iteration executes cpu_relax() which on certain platforms provides a hint to the pipeline that the loop busy-waits, allowing the processor to reduce power consumption. This is close to what smp_cond_load_relaxed_timeout() provides. So, restructure the loop and fold the loop condition and the timeout check in smp_cond_load_relaxed_timeout(). Cc: "Rafael J. Wysocki" <[email protected]> Cc: Daniel Lezcano <[email protected]> Signed-off-by: Ankur Arora <[email protected]>
|
Upstream branch: 04a8995 |
0ecef12 to
08373b7
Compare
9b33bf7 to
33b4c7f
Compare
|
At least one diff in series https://patchwork.kernel.org/project/netdevbpf/list/?series=1012679 irrelevant now. Closing PR. |
Pull request for series with
subject: barrier: Add smp_cond_load_*_timeout()
version: 7
url: https://patchwork.kernel.org/project/netdevbpf/list/?series=1012679