This commit removes support for the `userfaultfd` or "uffd" syscall on Linux. This support was originally added for users migrating from Lucet to Wasmtime, but the recent developments of kernel-supported copy-on-write support for memory initialization wound up being more appropriate for these use cases than usefaultfd. The main reason for moving to copy-on-write initialization are: * The `userfaultfd` feature was never necessarily intended for this style of use case with wasm and was susceptible to subtle and rare bugs that were extremely difficult to track down. We were never 100% certain that there were kernel bugs related to userfaultfd but the suspicion never went away. * Handling faults with userfaultfd was always slow and single-threaded. Only one thread could handle faults and traveling to user-space to handle faults is inherently slower than handling them all in the kernel. The single-threaded aspect in particular presented a significant scaling bottleneck for embeddings that want to run many wasm instances in parallel. * One of the major benefits of userfaultfd was lazy initialization of wasm linear memory which is also achieved with the copy-on-write initialization support we have right now. * One of the suspected benefits of userfaultfd was less frobbing of the kernel vma structures when wasm modules are instantiated. Currently the copy-on-write support has a mitigation where we attempt to reuse the memory images where possible to avoid changing vma structures. When comparing this to userfaultfd's performance it was found that kernel modifications of vmas aren't a worrisome bottleneck so copy-on-write is suitable for this as well. Overall there are no remaining benefits that userfaultfd gives that copy-on-write doesn't, and copy-on-write solves a major downsides of userfaultfd, the scaling issue with a single faulting thread. Additionally copy-on-write support seems much more robust in terms of kernel implementation since it's only using standard memory-management syscalls which are heavily exercised. Finally copy-on-write support provides a new bonus where read-only memory in WebAssembly can be mapped directly to the same kernel cache page, even amongst many wasm instances of the same module, which was never possible with userfaultfd. In light of all this it's expected that all users of userfaultfd should migrate to the copy-on-write initialization of Wasmtime (which is enabled by default).
143 lines
3.6 KiB
TOML
143 lines
3.6 KiB
TOML
[package]
|
|
name = "wasmtime-cli"
|
|
version = "0.37.0"
|
|
authors = ["The Wasmtime Project Developers"]
|
|
description = "Command-line interface for Wasmtime"
|
|
license = "Apache-2.0 WITH LLVM-exception"
|
|
documentation = "https://bytecodealliance.github.io/wasmtime/cli.html"
|
|
categories = ["wasm"]
|
|
keywords = ["webassembly", "wasm"]
|
|
repository = "https://github.com/bytecodealliance/wasmtime"
|
|
readme = "README.md"
|
|
edition = "2021"
|
|
default-run = "wasmtime"
|
|
|
|
[lib]
|
|
doctest = false
|
|
|
|
[[bin]]
|
|
name = "wasmtime"
|
|
path = "src/bin/wasmtime.rs"
|
|
doc = false
|
|
|
|
[dependencies]
|
|
wasmtime = { path = "crates/wasmtime", version = "0.37.0", default-features = false, features = ['cache', 'cranelift'] }
|
|
wasmtime-cache = { path = "crates/cache", version = "=0.37.0" }
|
|
wasmtime-cranelift = { path = "crates/cranelift", version = "=0.37.0" }
|
|
wasmtime-environ = { path = "crates/environ", version = "=0.37.0" }
|
|
wasmtime-wast = { path = "crates/wast", version = "=0.37.0" }
|
|
wasmtime-wasi = { path = "crates/wasi", version = "0.37.0" }
|
|
wasmtime-wasi-crypto = { path = "crates/wasi-crypto", version = "0.37.0", optional = true }
|
|
wasmtime-wasi-nn = { path = "crates/wasi-nn", version = "0.37.0", optional = true }
|
|
structopt = { version = "0.3.5", features = ["color", "suggestions"] }
|
|
anyhow = "1.0.19"
|
|
target-lexicon = { version = "0.12.0", default-features = false }
|
|
pretty_env_logger = "0.4.0"
|
|
file-per-thread-logger = "0.1.1"
|
|
libc = "0.2.60"
|
|
rayon = "1.5.0"
|
|
humantime = "2.0.0"
|
|
wasmparser = "0.84.0"
|
|
lazy_static = "1.4.0"
|
|
listenfd = "0.3.5"
|
|
|
|
[target.'cfg(unix)'.dependencies]
|
|
rustix = "0.33.6"
|
|
|
|
[dev-dependencies]
|
|
# depend again on wasmtime to activate its default features for tests
|
|
wasmtime = { path = "crates/wasmtime", version = "0.37.0" }
|
|
env_logger = "0.8.1"
|
|
filecheck = "0.5.0"
|
|
more-asserts = "0.2.1"
|
|
tempfile = "3.1.0"
|
|
test-programs = { path = "crates/test-programs" }
|
|
wasmtime-runtime = { path = "crates/runtime" }
|
|
tokio = { version = "1.8.0", features = ["rt", "time", "macros", "rt-multi-thread"] }
|
|
tracing-subscriber = "0.3.1"
|
|
wast = "39.0.0"
|
|
criterion = "0.3.4"
|
|
num_cpus = "1.13.0"
|
|
winapi = { version = "0.3.9", features = ['memoryapi'] }
|
|
memchr = "2.4"
|
|
async-trait = "0.1"
|
|
wat = "1.0.42"
|
|
once_cell = "1.9.0"
|
|
|
|
[build-dependencies]
|
|
anyhow = "1.0.19"
|
|
|
|
[profile.release.build-override]
|
|
opt-level = 0
|
|
|
|
[workspace]
|
|
resolver = '2'
|
|
members = [
|
|
"cranelift",
|
|
"cranelift/isle/fuzz",
|
|
"cranelift/isle/islec",
|
|
"cranelift/serde",
|
|
"crates/bench-api",
|
|
"crates/c-api",
|
|
"crates/misc/run-examples",
|
|
"examples/fib-debug/wasm",
|
|
"examples/wasi/wasm",
|
|
"examples/tokio/wasm",
|
|
"fuzz",
|
|
]
|
|
exclude = [
|
|
'crates/wasi-common/WASI/tools/witx-cli',
|
|
'docs/rust_wasi_markdown_parser'
|
|
]
|
|
|
|
[features]
|
|
default = [
|
|
"jitdump",
|
|
"wasmtime/wat",
|
|
"wasmtime/parallel-compilation",
|
|
"vtune",
|
|
"wasi-nn",
|
|
"pooling-allocator",
|
|
"memory-init-cow",
|
|
"wasm-backtrace",
|
|
]
|
|
jitdump = ["wasmtime/jitdump"]
|
|
vtune = ["wasmtime/vtune"]
|
|
wasi-crypto = ["wasmtime-wasi-crypto"]
|
|
wasi-nn = ["wasmtime-wasi-nn"]
|
|
memory-init-cow = ["wasmtime/memory-init-cow"]
|
|
pooling-allocator = ["wasmtime/pooling-allocator"]
|
|
all-arch = ["wasmtime/all-arch"]
|
|
posix-signals-on-macos = ["wasmtime/posix-signals-on-macos"]
|
|
wasm-backtrace = ["wasmtime/wasm-backtrace"]
|
|
|
|
# Stub feature that does nothing, for Cargo-features compatibility: the new
|
|
# backend is the default now.
|
|
experimental_x64 = []
|
|
|
|
[badges]
|
|
maintenance = { status = "actively-developed" }
|
|
|
|
[[test]]
|
|
name = "host_segfault"
|
|
harness = false
|
|
|
|
[[example]]
|
|
name = "tokio"
|
|
required-features = ["wasmtime-wasi/tokio"]
|
|
|
|
[profile.dev.package.backtrace]
|
|
debug = false # FIXME(#1813)
|
|
|
|
[[bench]]
|
|
name = "instantiation"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "thread_eager_init"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "call"
|
|
harness = false
|