Skip to content

Commit 3ed71b7

Browse files
authored
Merge pull request #5838 from wasmerio/fix/wasix-hangs
Fix a number of WASIX stalls
2 parents 9533eb2 + da6d38a commit 3ed71b7

File tree

37 files changed

+692
-317
lines changed

37 files changed

+692
-317
lines changed

Cargo.lock

Lines changed: 245 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ wasm-encoder = { version = "0.235.0", default-features = false, features = [
170170
"std",
171171
] }
172172
ignore = "0.4"
173+
parking_lot = "0.12"
173174
clap = { version = "=4.5.50" }
174175
clap_builder = { version = "=4.5.50" }
175176
clap_derive = { version = "=4.5.49" }

Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,8 @@ build-wasmer-api-js:
468468
$(CARGO_BINARY) rustc --target wasm32-unknown-unknown --release --manifest-path lib/api/Cargo.toml --no-default-features --features "js, js-default, wasm-types-polyfill, enable-serde" --crate-type=cdylib --locked
469469

470470
build-wasmer-debug:
471-
$(CARGO_BINARY) build $(CARGO_TARGET_FLAG) --manifest-path lib/cli/Cargo.toml $(compiler_features) --bin wasmer --locked
471+
RUSTFLAGS="--cfg tokio_unstable" \
472+
$(CARGO_BINARY) build $(CARGO_TARGET_FLAG) --features tokio-subscriber --manifest-path lib/cli/Cargo.toml $(compiler_features) --bin wasmer --locked
472473

473474
bench:
474475
$(CARGO_BINARY) bench $(CARGO_TARGET_FLAG) $(compiler_features)

lib/api/src/backend/sys/entities/memory/mod.rs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -147,12 +147,7 @@ impl SharedMemoryOps for ThreadConditionsHandle {
147147
let count = self
148148
.upgrade()
149149
.ok_or(crate::AtomicsError::Unimplemented)?
150-
.do_notify(
151-
wasmer_vm::NotifyLocation {
152-
address: dst.address,
153-
},
154-
count,
155-
);
150+
.do_notify(dst.address, count);
156151
Ok(count)
157152
}
158153

@@ -161,20 +156,25 @@ impl SharedMemoryOps for ThreadConditionsHandle {
161156
dst: MemoryLocation,
162157
timeout: Option<std::time::Duration>,
163158
) -> Result<u32, crate::AtomicsError> {
164-
self.upgrade()
165-
.ok_or(crate::AtomicsError::Unimplemented)?
166-
.do_wait(
167-
wasmer_vm::NotifyLocation {
168-
address: dst.address,
169-
},
170-
timeout,
171-
)
172-
.map_err(|e| match e {
173-
wasmer_vm::WaiterError::Unimplemented => crate::AtomicsError::Unimplemented,
174-
wasmer_vm::WaiterError::TooManyWaiters => crate::AtomicsError::TooManyWaiters,
175-
wasmer_vm::WaiterError::AtomicsDisabled => crate::AtomicsError::AtomicsDisabled,
176-
_ => crate::AtomicsError::Unimplemented,
177-
})
159+
// Safety: `ExpectedValue::None` has no safety requirements.
160+
unsafe {
161+
self.upgrade()
162+
.ok_or(crate::AtomicsError::Unimplemented)?
163+
.do_wait(
164+
wasmer_vm::NotifyLocation {
165+
memory_base: std::ptr::null_mut(),
166+
address: dst.address,
167+
},
168+
wasmer_vm::ExpectedValue::None,
169+
timeout,
170+
)
171+
.map_err(|e| match e {
172+
wasmer_vm::WaiterError::Unimplemented => crate::AtomicsError::Unimplemented,
173+
wasmer_vm::WaiterError::TooManyWaiters => crate::AtomicsError::TooManyWaiters,
174+
wasmer_vm::WaiterError::AtomicsDisabled => crate::AtomicsError::AtomicsDisabled,
175+
_ => crate::AtomicsError::Unimplemented,
176+
})
177+
}
178178
}
179179

180180
fn disable_atomics(&self) -> Result<(), MemoryError> {

lib/c-api/src/wasm_c_api/wasi/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use wasmer_api::{AsStoreMut, Imports, Module};
2121
use wasmer_wasix::{
2222
Pipe, PluggableRuntime, WasiEnv, WasiEnvBuilder, WasiFunctionEnv, WasiVersion,
2323
default_fs_backing, get_wasi_version,
24-
runtime::task_manager::{InlineWaker, tokio::TokioTaskManager},
24+
runtime::task_manager::{block_on, tokio::TokioTaskManager},
2525
virtual_fs::AsyncReadExt,
2626
virtual_fs::VirtualFile,
2727
};
@@ -452,7 +452,7 @@ fn read_inner(
452452
wasi_file: &mut Box<dyn VirtualFile + Send + Sync + 'static>,
453453
inner_buffer: &mut [u8],
454454
) -> isize {
455-
InlineWaker::block_on(async {
455+
block_on(async {
456456
match wasi_file.read(inner_buffer).await {
457457
Ok(a) => a as isize,
458458
Err(err) => {

lib/cli/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ enable-serde = [
108108
"wasmer-wasix/enable-serde",
109109
]
110110

111+
tokio-subscriber = ["dep:console-subscriber", "tokio/tracing"]
112+
111113
[dependencies]
112114
# Repo-local dependencies.
113115

@@ -234,6 +236,8 @@ console = "0.15.8"
234236
dotenvy = "0.15.7"
235237
lzma-rs = "0.3.0"
236238

239+
console-subscriber = { version = "0.4", optional = true }
240+
237241
# NOTE: Must use different features for clap because the "color" feature does not
238242
# work on wasi due to the anstream dependency not compiling.
239243
[target.'cfg(not(target_family = "wasm"))'.dependencies]

lib/cli/src/logging.rs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use is_terminal::IsTerminal;
44
use tracing::level_filters::LevelFilter;
5-
use tracing_subscriber::{EnvFilter, fmt, layer::SubscriberExt, util::SubscriberInitExt};
5+
use tracing_subscriber::{EnvFilter, Layer, fmt, layer::SubscriberExt, util::SubscriberInitExt};
66

77
const WHITELISTED_LOG_TARGETS: &[&str] = &["wasmer", "wasmer_wasix", "virtual_fs"];
88

@@ -35,6 +35,8 @@ impl Output {
3535
/// Initialize logging based on the `$RUST_LOG` environment variable and
3636
/// command-line flags.
3737
pub fn initialize_logging(&self) {
38+
let filter_layer = self.log_filter();
39+
3840
let fmt_layer = fmt::layer()
3941
.with_target(true)
4042
.with_ansi(self.should_emit_colors())
@@ -49,18 +51,24 @@ impl Output {
4951
}
5052
};
5153

52-
let filter_layer = self.log_filter();
54+
let registry = tracing_subscriber::registry();
55+
56+
#[cfg(feature = "tokio-subscriber")]
57+
let registry = registry.with(console_subscriber::spawn());
5358

5459
match self.log_format {
55-
LogFormat::Text => tracing_subscriber::registry()
56-
.with(filter_layer)
57-
.with(fmt_layer.compact().with_target(true))
60+
LogFormat::Text => registry
61+
.with(
62+
fmt_layer
63+
.compact()
64+
.with_target(true)
65+
.with_filter(filter_layer),
66+
)
5867
.init(),
59-
LogFormat::Json => tracing_subscriber::registry()
60-
.with(filter_layer)
61-
.with(fmt_layer.json().with_target(true))
68+
LogFormat::Json => registry
69+
.with(fmt_layer.json().with_target(true).with_filter(filter_layer))
6270
.init(),
63-
}
71+
};
6472
}
6573

6674
fn log_filter(&self) -> EnvFilter {

lib/compiler/src/engine/trap/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ pub use frame_info::{
44
CompiledFunctionFrameInfoVariant, FRAME_INFO, FrameInfosVariant, FunctionExtent,
55
GlobalFrameInfoRegistration, register as register_frame_info,
66
};
7-
pub use stack::get_trace_and_trapcode;
7+
pub use stack::{get_trace_and_trapcode, wasm_trace_from_current_stack};

lib/compiler/src/engine/trap/stack.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,15 @@ pub fn get_trace_and_trapcode(trap: &Trap) -> (Vec<FrameInfo>, Option<TrapCode>)
3838
}
3939
}
4040

41+
/// Captures the current Wasm stack trace. Only useful when
42+
/// there are active Wasm frames on the stack, such as in
43+
/// libcalls or imported functions.
44+
pub fn wasm_trace_from_current_stack() -> Vec<FrameInfo> {
45+
let info = FRAME_INFO.read().unwrap();
46+
let backtrace = Backtrace::new_unresolved();
47+
wasm_trace(&info, None, &backtrace)
48+
}
49+
4150
fn wasm_trace(
4251
info: &GlobalFrameInfo,
4352
trap_pc: Option<usize>,

lib/sys-utils/src/memory/fd_memory/memories.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -488,15 +488,29 @@ impl LinearMemory for VMSharedMemory {
488488
Ok(Box::new(forked))
489489
}
490490

491-
fn do_wait(
491+
unsafe fn do_wait(
492492
&mut self,
493-
dst: wasmer_vm::NotifyLocation,
493+
dst: u32,
494+
expected: wasmer_vm::ExpectedValue,
494495
timeout: Option<std::time::Duration>,
495496
) -> Result<u32, WaiterError> {
496-
self.conditions.do_wait(dst, timeout)
497+
unsafe {
498+
let dst = wasmer_vm::NotifyLocation {
499+
address: dst,
500+
memory_base: self
501+
.mmap
502+
.read()
503+
.unwrap()
504+
.vm_memory_definition
505+
.as_ptr()
506+
.as_ref()
507+
.base,
508+
};
509+
self.conditions.do_wait(dst, expected, timeout)
510+
}
497511
}
498512

499-
fn do_notify(&mut self, dst: wasmer_vm::NotifyLocation, count: u32) -> u32 {
513+
fn do_notify(&mut self, dst: u32, count: u32) -> u32 {
500514
self.conditions.do_notify(dst, count)
501515
}
502516
}

0 commit comments

Comments
 (0)