Skip to content

fs: check for opcode support before starting operation#7815

Merged
Darksonn merged 1 commit intotokio-rs:masterfrom
tahmid-23:tahmid-23/uring-opcode-check
Jan 3, 2026
Merged

fs: check for opcode support before starting operation#7815
Darksonn merged 1 commit intotokio-rs:masterfrom
tahmid-23:tahmid-23/uring-opcode-check

Conversation

@tahmid-23
Copy link
Copy Markdown
Contributor

@tahmid-23 tahmid-23 commented Jan 1, 2026

Motivation

io_uring exposes additional opcodes with successive kernel versions. Ideally, we can tell which opcodes are supported, so we can know whether to use the io_uring version or the threadpool version of an asynchronous function.

This functionality is exposed through io_uring's probing feature, which lists the supported opcodes. This is introduced in kernel 5.6. We fallback to attempting any opcode if probing support is not available.

All of the currently used opcodes (openat, read, write) were introduced before probing support in io_uring, so this is unnecessary for the current functionality. However, future additions can benefit from this check.

(Technically, #7799 and #7800 would benefit from this, although running on kernel [5.6, 5.10) is likely rare. But, other opcodes like mkdirat are not available on 5.10, which is an LTS.)

I bumped the io-uring crate to 0.7.11 to expose get_opcode, since it is tokio_unstable.

@tahmid-23 tahmid-23 force-pushed the tahmid-23/uring-opcode-check branch from fdeb36b to e5e9531 Compare January 1, 2026 01:19
@ADD-SP ADD-SP added A-tokio Area: The main tokio crate T-io-uring Topic: Linux io_uring labels Jan 1, 2026
Comment on lines +65 to +68
_ => {
// If the kernel does not support IORING_REGISTER_PROBE,
// try all opcodes anyway.
true
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not clear that this is the correct approach. Perhaps we should simply treat such cases as not supporting io_uring, or hardcode the list opcodes that are present on 5.10, which I understand is the only supported Linux kernel version without IOURING_REGISTER_PROBE?

Copy link
Copy Markdown
Contributor Author

@tahmid-23 tahmid-23 Jan 1, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If probing support isn't present, then none of the currently used opcodes will work (and I assume none of the future opcodes either). So let's go with the first option (5.6+).

@tahmid-23 tahmid-23 force-pushed the tahmid-23/uring-opcode-check branch from e5e9531 to 4025836 Compare January 1, 2026 20:03
@tahmid-23 tahmid-23 force-pushed the tahmid-23/uring-opcode-check branch from 4025836 to a962b8c Compare January 1, 2026 20:04
Copy link
Copy Markdown
Member

@Darksonn Darksonn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks.

@Darksonn Darksonn merged commit fdb1509 into tokio-rs:master Jan 3, 2026
89 checks passed
@vrtgs
Copy link
Copy Markdown
Contributor

vrtgs commented Jan 5, 2026

I feel like having to lock a lock when running check_and_init, makes the whole using atomics pointless in my humble opinion

@Darksonn
Copy link
Copy Markdown
Member

Darksonn commented Jan 5, 2026

That's a good point. Does is_opcode_supported take &mut self?

@tahmid-23
Copy link
Copy Markdown
Contributor Author

no, just &self / it needs to have been initialized.
It's not immediately obvious to me how to avoid a lock though. It needs an &mut Probe to store into, which is currently in the UringContext.
we could use something like an ArcSwap<Probe> in Handle, but that would require the arc-swap crate.

@Darksonn
Copy link
Copy Markdown
Member

Darksonn commented Jan 6, 2026

I guess we can probe the opcodes that Tokio cares about and store an AtomicU32 bitmap of the results.

Either way we should open an issue to remove the lock.

jimsynz pushed a commit to jimsynz/neonfs that referenced this pull request Mar 6, 2026
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [tokio](https://tokio.rs) ([source](https://github.com/tokio-rs/tokio)) | dependencies | minor | `1.49.0` → `1.50.0` |

---

### Release Notes

<details>
<summary>tokio-rs/tokio (tokio)</summary>

### [`v1.50.0`](https://github.com/tokio-rs/tokio/releases/tag/tokio-1.50.0): Tokio v1.50.0

[Compare Source](tokio-rs/tokio@tokio-1.49.0...tokio-1.50.0)

### 1.50.0 (Mar 3rd, 2026)

##### Added

- net: add `TcpStream::set_zero_linger` ([#&#8203;7837])
- rt: add `is_rt_shutdown_err` ([#&#8203;7771])

##### Changed

- io: add optimizer hint that `memchr` returns in-bounds pointer ([#&#8203;7792])
- io: implement vectored writes for `write_buf` ([#&#8203;7871])
- runtime: panic when `event_interval` is set to 0 ([#&#8203;7838])
- runtime: shorten default thread name to fit in Linux limit ([#&#8203;7880])
- signal: remember the result of `SetConsoleCtrlHandler` ([#&#8203;7833])
- signal: specialize windows `Registry` ([#&#8203;7885])

##### Fixed

- io: always cleanup `AsyncFd` registration list on deregister ([#&#8203;7773])
- macros: remove (most) local `use` declarations in `tokio::select!` ([#&#8203;7929])
- net: fix `GET_BUF_SIZE` constant for `target_os = "android"` ([#&#8203;7889])
- runtime: avoid redundant unpark in current\_thread scheduler ([#&#8203;7834])
- runtime: don't park in `current_thread` if `before_park` defers waker ([#&#8203;7835])
- io: fix write readiness on ESP32 on short writes ([#&#8203;7872])
- runtime: wake deferred tasks before entering `block_in_place` ([#&#8203;7879])
- sync: drop rx waker when oneshot receiver is dropped ([#&#8203;7886])
- runtime: fix double increment of `num_idle_threads` on shutdown ([#&#8203;7910], [#&#8203;7918], [#&#8203;7922])

##### Unstable

- fs: check for io-uring opcode support ([#&#8203;7815])
- runtime: avoid lock acquisition after uring init ([#&#8203;7850])

##### Documented

- docs: update outdated unstable features section ([#&#8203;7839])
- io: clarify the behavior of `AsyncWriteExt::shutdown()` ([#&#8203;7908])
- io: explain how to flush stdout/stderr ([#&#8203;7904])
- io: fix incorrect and confusing `AsyncWrite` documentation ([#&#8203;7875])
- rt: clarify the documentation of `Runtime::spawn` ([#&#8203;7803])
- rt: fix missing quotation in docs ([#&#8203;7925])
- runtime: correct the default thread name in docs ([#&#8203;7896])
- runtime: fix `event_interval` doc ([#&#8203;7932])
- sync: clarify RwLock fairness documentation ([#&#8203;7919])
- sync: clarify that `recv` returns `None` once closed and no more messages ([#&#8203;7920])
- task: clarify when to use `spawn_blocking` vs dedicated threads ([#&#8203;7923])
- task: doc that task drops before `JoinHandle` completion ([#&#8203;7825])
- signal: guarantee that listeners never return `None` ([#&#8203;7869])
- task: fix task module feature flags in docs ([#&#8203;7891])
- task: fix two typos ([#&#8203;7913])
- task: improve the docs of `Builder::spawn_local` ([#&#8203;7828])
- time: add docs about auto-advance and when to use sleep ([#&#8203;7858])
- util: fix typo in docs ([#&#8203;7926])

[#&#8203;7771]: tokio-rs/tokio#7771

[#&#8203;7773]: tokio-rs/tokio#7773

[#&#8203;7792]: tokio-rs/tokio#7792

[#&#8203;7803]: tokio-rs/tokio#7803

[#&#8203;7815]: tokio-rs/tokio#7815

[#&#8203;7825]: tokio-rs/tokio#7825

[#&#8203;7828]: tokio-rs/tokio#7828

[#&#8203;7833]: tokio-rs/tokio#7833

[#&#8203;7834]: tokio-rs/tokio#7834

[#&#8203;7835]: tokio-rs/tokio#7835

[#&#8203;7837]: tokio-rs/tokio#7837

[#&#8203;7838]: tokio-rs/tokio#7838

[#&#8203;7839]: tokio-rs/tokio#7839

[#&#8203;7850]: tokio-rs/tokio#7850

[#&#8203;7858]: tokio-rs/tokio#7858

[#&#8203;7869]: tokio-rs/tokio#7869

[#&#8203;7871]: tokio-rs/tokio#7871

[#&#8203;7872]: tokio-rs/tokio#7872

[#&#8203;7875]: tokio-rs/tokio#7875

[#&#8203;7879]: tokio-rs/tokio#7879

[#&#8203;7880]: tokio-rs/tokio#7880

[#&#8203;7885]: tokio-rs/tokio#7885

[#&#8203;7886]: tokio-rs/tokio#7886

[#&#8203;7889]: tokio-rs/tokio#7889

[#&#8203;7891]: tokio-rs/tokio#7891

[#&#8203;7896]: tokio-rs/tokio#7896

[#&#8203;7904]: tokio-rs/tokio#7904

[#&#8203;7908]: tokio-rs/tokio#7908

[#&#8203;7910]: tokio-rs/tokio#7910

[#&#8203;7913]: tokio-rs/tokio#7913

[#&#8203;7918]: tokio-rs/tokio#7918

[#&#8203;7919]: tokio-rs/tokio#7919

[#&#8203;7920]: tokio-rs/tokio#7920

[#&#8203;7922]: tokio-rs/tokio#7922

[#&#8203;7923]: tokio-rs/tokio#7923

[#&#8203;7925]: tokio-rs/tokio#7925

[#&#8203;7926]: tokio-rs/tokio#7926

[#&#8203;7929]: tokio-rs/tokio#7929

[#&#8203;7932]: tokio-rs/tokio#7932

</details>

---

### Configuration

📅 **Schedule**: Branch creation - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) in timezone Pacific/Auckland, Automerge - Between 12:00 AM and 03:59 AM ( * 0-3 * * * ) in timezone Pacific/Auckland.

🚦 **Automerge**: Disabled because a matching PR was automerged previously.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My41Mi4xIiwidXBkYXRlZEluVmVyIjoiNDMuNTIuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsicmVub3ZhdGUiXX0=-->

Reviewed-on: https://harton.dev/project-neon/neonfs/pulls/53
Co-authored-by: Renovate Bot <bot@harton.nz>
Co-committed-by: Renovate Bot <bot@harton.nz>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

A-tokio Area: The main tokio crate T-io-uring Topic: Linux io_uring

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants