kernel icon indicating copy to clipboard operation
kernel copied to clipboard

Async IO, Mio support

Open koraa opened this issue 1 year ago • 9 comments

Thank you for building hermit; I hope this will become a conerstone of rust infrastructure soon!

At Rosenpass (post quantum security for WireGuard in Rust) we are currently exploring using broker based security sandboxing. As part of this project we are trying to add experimental support for running significant parts of the Rosenpass deployment inside Hermit OS.

The core rosenpass process uses mio to handle IO operations to enable the use of async io. We are considering eventually migrating to tokio.

Building hermit-rs-template with --target x86_64-unknown-hermit and a dependency on mio without non-default features yields a successful build. Adding the net feature yields a whole bunch of compile time errors (log).

Is using mio expected to work?

diff --git a/Cargo.toml b/Cargo.toml
index 452bbdc..240333f 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -4,4 +4,7 @@ version = "0.1.0"
 edition = "2021"

 [target.'cfg(target_os = "hermit")'.dependencies]
-hermit = "0.8"
+hermit = { version = "0.8", features = ["pci", "pci-ids", "acpi", "fsgsbase", "tcp", "rtl8139"]}
+
+[dependencies]
+mio = { version = "0.8.10", features = ["net"] }

Errors (excerpt)

   Compiling mio v0.8.10
error[E0425]: cannot find value `listener` in this scope
  --> /home/karo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.10/src/net/tcp/listener.rs:74:24
   |
74 |         set_reuseaddr(&listener.inner, true)?;
   |                        ^^^^^^^^ help: a function with a similar name exists: `listen`
   |
  ::: /home/karo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.10/src/sys/shell/tcp.rs:20:1
   |
20 | pub(crate) fn listen(_: &net::TcpListener, _: u32) -> io::Result<()> {
   | -------------------------------------------------------------------- similarly named function `listen` defined here

error[E0425]: cannot find value `listener` in this scope
  --> /home/karo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.10/src/net/tcp/listener.rs:76:15
   |
76 |         bind(&listener.inner, addr)?;
   |               ^^^^^^^^ help: a function with a similar name exists: `listen`
   |
  ::: /home/karo/.cargo/registry/src/index.crates.io-6f17d22bba15001f/mio-0.8.10/src/sys/shell/tcp.rs:20:1
   |
20 | pub(crate) fn listen(_: &net::TcpListener, _: u32) -> io::Result<()> {
   | -------------------------------------------------------------------- similarly named function `listen` defined here

koraa avatar Jan 27 '24 22:01 koraa

We are working on async support for userspace. :)

See also https://github.com/smol-rs/polling/issues/177

mkroening avatar Jan 29 '24 08:01 mkroening

We are working on async support for userspace. :)

See also smol-rs/polling#177

That is wonderful, thank you :)

So we'd probably have to mygrate to smol-rs/polling to make use of that?

koraa avatar Jan 29 '24 09:01 koraa

So we'd probably have to mygrate to smol-rs/polling to make use of that?

No, we want to support Mio too. We are currently at the stage of needing to implement the kernel primitives, but are happy to support multiple different user space crates for async I/O.

mkroening avatar Jan 29 '24 09:01 mkroening

So we'd probably have to mygrate to smol-rs/polling to make use of that?

No, we want to support Mio too. We are currently at the stage of needing to implement the kernel primitives, but are happy to support multiple different user space crates for async I/O.

Sounds great, thank you for that work! Then we will try again once that lands.

koraa avatar Jan 29 '24 09:01 koraa

@stlankes just made a lot of progress towards async I/O on Hermit by adding poll support in https://github.com/hermit-os/kernel/pull/1046. 🥳

mkroening avatar Feb 05 '24 15:02 mkroening

I've seen some work have been done on making mio and socket2 compatible with hermit in the repos, but none upstreamed, any issues there?

tema3210 avatar May 28 '24 18:05 tema3210

In principle not. At first, we want to upstream the current version into mio (see tokio-rs/mio#1775). To simplify it, we wrote a PR for libc (see rust-lang/libc#3724). Afterwards, we will upstream the other versions.

stlankes avatar May 28 '24 19:05 stlankes

I've seen tokio now building correctly with .cargo/config.toml target set up to hermit

tema3210 avatar Aug 04 '24 13:08 tema3210

So far i've made a merge and little fixes to tests here: https://github.com/tema3210/socket2 based on your branch - have i missed smth?

tema3210 avatar Aug 17 '24 12:08 tema3210