-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
runtime: eliminate unnecessary lfence while operating on queue::Local<T>
#7340
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
runtime: eliminate unnecessary lfence while operating on queue::Local<T>
#7340
Conversation
cea005b
to
ad6f9ea
Compare
I just merged #7339, so merging master should fix the ci issue 👍 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks.
I am learning lock-free structure right now. Currently I just read the implementation of this steal-queue. |
# 1.46.0 (July 1st, 2025) ### Fixed - net: fixed `TcpStream::shutdown` incorrectly returning an error on macOS ([#7290]) ## Added - sync: `mpsc::OwnedPermit::{same_channel, same_channel_as_sender}` methods ([#7389]) - macros: `biased` option for `join!` and `try_join!`, similar to `select!` ([#7307]) - net: support for cygwin ([#7393]) - net: support `pope::OpenOptions::read_write` on Android ([#7426]) - net: add `Clone` implementation for `net::unix::SocketAddr` ([#7422]) ## Changed - runtime: eliminate unnecessary lfence while operating on `queue::Local<T>` ([#7340]) - task: disallow blocking in `LocalSet::{poll,drop}` ([#7372]) ## Unstable - runtime: add `TaskMeta::spawn_location` tracking where a task was spawned ([#7417]) - runtime: removed borrow from `LocalOptions` parameter to `runtime::Builder::build_local` ([#7346]) ## Documented - io: clarify behavior of seeking when `start_seek` is not used ([#7366]) - io: document cancellation safety of `AsyncWriteExt::flush` ([#7364]) - net: fix docs for `recv_buffer_size` method ([#7336]) - net: fix broken link of `RawFd` in `TcpSocket` docs ([#7416]) - net: update `AsRawFd` doc link to current Rust stdlib location ([#7429]) - readme: fix double period in reactor description (#7363) - runtime: add doc note that `on_*_task_poll` is unstable ([#7311]) - sync: update broadcast docs on allocation failure ([#7352]) - time: add a missing panic scenario of `time::advance` ([#7394]) [#7290]: #7290 [#7307]: #7307 [#7311]: #7311 [#7336]: #7336 [#7340]: #7340 [#7346]: #7346 [#7352]: #7352 [#7364]: #7364 [#7366]: #7366 [#7372]: #7372 [#7389]: #7389 [#7393]: #7393 [#7394]: #7394 [#7416]: #7416 [#7422]: #7422 [#7426]: #7426 [#7429]: #7429 [#7417]: #7417
# 1.46.0 (July 1st, 2025) ### Fixed - net: fixed `TcpStream::shutdown` incorrectly returning an error on macOS ([#7290]) ## Added - sync: `mpsc::OwnedPermit::{same_channel, same_channel_as_sender}` methods ([#7389]) - macros: `biased` option for `join!` and `try_join!`, similar to `select!` ([#7307]) - net: support for cygwin ([#7393]) - net: support `pope::OpenOptions::read_write` on Android ([#7426]) - net: add `Clone` implementation for `net::unix::SocketAddr` ([#7422]) ## Changed - runtime: eliminate unnecessary lfence while operating on `queue::Local<T>` ([#7340]) - task: disallow blocking in `LocalSet::{poll,drop}` ([#7372]) ## Unstable - runtime: add `TaskMeta::spawn_location` tracking where a task was spawned ([#7417]) - runtime: removed borrow from `LocalOptions` parameter to `runtime::Builder::build_local` ([#7346]) ## Documented - io: clarify behavior of seeking when `start_seek` is not used ([#7366]) - io: document cancellation safety of `AsyncWriteExt::flush` ([#7364]) - net: fix docs for `recv_buffer_size` method ([#7336]) - net: fix broken link of `RawFd` in `TcpSocket` docs ([#7416]) - net: update `AsRawFd` doc link to current Rust stdlib location ([#7429]) - readme: fix double period in reactor description (#7363) - runtime: add doc note that `on_*_task_poll` is unstable ([#7311]) - sync: update broadcast docs on allocation failure ([#7352]) - time: add a missing panic scenario of `time::advance` ([#7394]) [#7290]: #7290 [#7307]: #7307 [#7311]: #7311 [#7336]: #7336 [#7340]: #7340 [#7346]: #7346 [#7352]: #7352 [#7364]: #7364 [#7366]: #7366 [#7372]: #7372 [#7389]: #7389 [#7393]: #7393 [#7394]: #7394 [#7416]: #7416 [#7422]: #7422 [#7426]: #7426 [#7429]: #7429 [#7417]: #7417
Blocked by #7339 which fixes the CI failures caused by the new compilation error message of the new stable toolchain.Motivation
queue::Local<T>
is never been send to another thread (except while shutting down), thetail
is only updated by the worker thread who owned this local queue, so any change totail
is immediately visible to the current thread.This means the
Acquire
ordering is not required for loadingtail
while operating on the local queue.Solution
Unsync load
Since the lfence is not required for this scenario, the atomic loading was replaced by simple pointer deref.
Remove all methods of the
queue::Inner<T>
Because of the following reasons:
Inner<T>
can be implemented in differently way forLocal<T>
andSteal<T>
len_local
orunsync_len
creates possibilities for incorrect usage in the future which causes ABA problems in critical path.I removed all methods on the
Inner<T>
and re-implement it for bothLocal<T>
andSteal<T>
.Remove the feature gate of
Steal<T>::len()
The feature gate
cfg_unstable_metrics
is removed forSteal<T>::len()
to avoid duplicating the same code.This doesn't seem to break anything, but if it does please let me know and I'll switch to something else.
Anything else?
Ideally, the
queue::Local<T>
should be marked as!Send
to lower the risk that unintentionally send it to another thread, but it required the changes of the starting and shutdown logic, I will try to open another PR for this improvement.