Skip to content

improve fork performance by avoiding copying unnescessary grate poll stack - #1385

Open
qianxichen233 wants to merge 1 commit into
mainfrom
improve-perf
Open

qianxichen233 wants to merge 1 commit into
mainfrom
improve-perf

Conversation

@qianxichen233

Copy link
Copy Markdown
Contributor

Each stack in grate pool used to always assigned with RW permission at start even if they aren't used. This is a huge allocation. During fork, all the RW memories will be copied entirely including those unused grate stacks (8MB * grate_worker_number). This is a huge amount of unnescessary work.

This PR make grate worker's stack always assigned with PROT_NONE at start, so that fork will skip these slots as they are not used. Only when the grate worker is activated, the worker's stack is mmap-ed into RW and can be potentially copied at fork.

speed up fork 10-100 times faster depending on different scenarios

lind eagerly built a full 32-worker grate stack pool (32 x 8MB stack
slots, ~256MB) for every static-build cage, both at initial exec time
and again on every single fork -- regardless of whether the program
ever registers a grate handler. Since fork_vmmap must fork-copy every
accessible byte, this made fork enormously expensive for ordinary
(non-grate) programs: profiling bash showed 90%+ of fork's wall time
inside process_vm_writev copying that unused arena, dominated by the
kernel zero-filling pages that were about to be immediately copied
over (mostly with more zeros).

Three coordinated changes:
- instance.rs: only mprotect(RW) a static cage's own required memory
  at boot, not the full stack_arena_base + grate arena. The arena
  stays PROT_NONE by default.
- lind-3i's create_worker: activate each grate worker's own 8MB stack
  slot lazily, when that worker is actually created, instead of
  relying on a blanket upfront reservation.
- execute.rs / lind-multi-process's fork_call: stop unconditionally
  building a worker pool for every static cage at exec and fork time.
  Gate it on the module actually exporting the grate entry trampoline
  (pass_fptr_to_wt, i.e. --compile-grate builds), with a new per-cage
  registration flag in lind_platform_const propagated across fork so
  a genuine grate-using cage's children still get a pool rebuilt.

Measured on bash (lind-wasm-apps): fork ~108x faster (65.6ms ->
0.61ms/fork), fork+exec ~41-61x faster, pipe (2 forks/op) ~129x
faster. A dedicated fork microbenchmark (simple fork, fork+exec,
nested fork chains, fork after dirtying varying heap sizes) confirms
the same pattern and shows post-fix cost finally scales with actual
dirtied memory instead of being swamped by the fixed 256MB copy.

Verified: all 15/15 grate-tests pass, and a direct sweep of
process_tests/memory_tests/signal_tests (bypassing an unrelated,
pre-existing wasmtestreport harness bug) shows no exit-code
regressions vs. unmodified main.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown
Contributor

End-to-End Test Report

Test Preview
grate harness

Grate Test Report

MetricValue
Total15
Success15
Failures0
Compile Failures0
Runtime Failures0
Timeout Failures0
Missing Pair Failures0

Cases

TestStatusError TypeOutput
concurrent-request/geteuid_grate.cSuccess
STDOUT:
[Grate|geteuid] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 3
[Cage | geteuid] PASS: 1000000 calls returned 10
[Grate|geteuid] PASS

STDERR:

concurrent-request/race-test_grate.cSuccess
STDOUT:
pass

STDERR:

concurrent-request/thread_race_grate.cSuccess
STDOUT:
[thread_race] Registering handler for cage 2 in grate 1 with fn ptr addr: 3
[thread_race] PASS: 20 threads x 100000 calls returned 10
[thread_race] PASS

STDERR:

copy-data-between-cages/cp-stncpy_grate.cSuccess
STDOUT:
[cage] pathname addr=0xfffb6ff9
[cage] pathname='random'
[Grate|open] intercepts open call: thiscage=1, arg1cage=2
[Grate|open] copied pathname: random
[cage] fd=10

STDERR:

copy-data-between-cages/cpdata_grate.cSuccess
STDOUT:
[Grate|open] intercepts open call: thiscage=1, arg1cage=2
[Grate|open] copied pathname: random
[cage] fd=10

STDERR:

interposing-calls/fork-with-newret_grate.cSuccess
STDOUT:
[Grate|interpose-fork] Registering fork handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|interpose-fork] Handling function ptr: 3 from cage: 1
[Grate|interpose-fork] In fork_grate 1 handler for cage: 1
[Cage] Forked process with PID: 10
[Grate|interpose-fork] PASS

STDERR:

interposing-calls/interpose-exec_grate.cSuccess
STDOUT:
[Grate|interpose-exec] Registering exec handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|interpose-exec] Handling function ptr: 3 from cage: 1
[Grate|interpose-exec] In exec_grate 1 handler for cage: 1
[Grate|interpose-exec] Handling function ptr: 3 from cage: 1
[Grate|interpose-exec] In exec_grate 1 handler for cage: 1
Exec successful, argv[1]: --execd
[Grate|interpose-exec] PASS

STDERR:

interposing-calls/interpose-exit_grate.cSuccess
STDOUT:
[Grate|interpose-exit] Registering exit handler for cage 2 in grate 1 with fn ptr addr: 3
Exiting...

[Grate|interpose-exit] PASS

STDERR:

interposing-calls/interpose-fork_grate.cSuccess
STDOUT:
[Grate|interpose-fork] Registering fork handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|interpose-fork] Handling function ptr: 3 from cage: 1
[Grate|interpose-fork] In fork_grate 1 handler for cage: 1
[Grate|interpose-fork] PASS

STDERR:

interposing-calls/interpose-mmap_grate.cSuccess
STDOUT:
[Grate|interpose-mmap] Registering mmap handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|interpose-mmap] Handling function ptr: 3 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
[Grate|interpose-mmap] Handling function ptr: 3 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
[Grate|interpose-mmap] Handling function ptr: 3 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
[Grate|interpose-mmap] Handling function ptr: 3 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
[Grate|interpose-mmap] Handling function ptr: 3 from cage: 1
[Grate|interpose-mmap] In mmap_grate 1 handler for cage: 1
mmap test: PASS
[Grate|interpose-mmap] PASS

STDERR:

interposing-calls/interpose-register_grate.cSuccess
STDOUT:
[Grate|interpose-register] Registering register_handler for cage 2 in grate 1 with fn ptr addr: 4
[cage] registering 107. grateid: 2 cageid: 3
[Grate|interpose-register] Handling function ptr: 4 from cage: 1
[Grate|interpose-register] In register_grate 1 handler for cage: 1
[Grate|geteuid] Registering geteuid handler for cage 1 in grate 1 with fn ptr addr: 3
[Grate|interpose-register] Handling function ptr: 3 from cage: 1
[Grate|interpose-register] In register_grate 1 handler for cage: 1
[Grate|interpose-register] PASS

STDERR:

multi-register_grate.cSuccess
STDOUT:
[Grate|multi-register_grate] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 4
[Grate|multi-register_grate] Registering getuid handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|multi-register_grate] Handling function ptr: 4 from cage: 1
[Grate|multi-register_grate] In multi-register_grate 1 handler for cage: 1
[Grate|multi-register_grate] Handling function ptr: 3 from cage: 1
[Grate|multi-register_grate] In multi-register_grate 1 handler for cage: 1
[Cage | multi-register] PASS: geteuid=10, getuid=20
[Grate|multi-register] PASS

STDERR:

simple-tests/copy-handler-table_grate.cSuccess
STDOUT:
[Grate|copy-handler-table] Registering geteuid handler for cage 2 in grate 1
[Grate|copy-handler-table] geteuid handler invoked for cage 1
[Grate|copy-handler-table] geteuid handler invoked for cage 1
[Cage|copy-handler-table] PASS: child inherited handler, then overwrite changed geteuid to 0
[Cage|copy-handler-table] PASS: parent=123 child_exit=0
[Grate|copy-handler-table] PASS

STDERR:

simple-tests/diff-cage-args_grate.cSuccess
STDOUT:
[Grate|diff-cage-args] Handling function ptr: 3 from cage: 1
[Grate|diff-cage-args] In open_grate 1 handler for cage: 1
Hello world. FD=-1
[Grate|diff-cage-args] Handling function ptr: 4 from cage: 1
Goodbye world! ret=4321 buf=helloworld
[Grate|diff-cage-args] PASS

STDERR:

simple-tests/geteuid_grate.cSuccess
STDOUT:
[Grate|geteuid] Registering geteuid handler for cage 2 in grate 1 with fn ptr addr: 3
[Grate|geteuid] Handling function ptr: 3 from cage: 1
[Grate|geteuid] In geteuid_grate 1 handler for cage: 1
[Cage | geteuid] PASS: geteuid ret = 10
[Grate|geteuid] PASS

STDERR:

static harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases3
Number of Successes3
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Static Tests
fork_simple.cSuccessNone0.060324s3.942276s
Success
thread.cSuccessNone0.051606s4.050598s
Success
tls_test.cSuccessNone0.059328s4.067979s
Success

Fail Tests

Summary

MetricCount
Total Test Cases0
Number of Successes0
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0
wasm-math harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases3
Number of Successes3
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Math Tests
math_link_smoke.cSuccessNone0.059590s0.114865s
Success
math_tests.cSuccessNone0.064409s0.147264s
Success
printf_float.cSuccessNone0.057045s0.138174s
Success

Fail Tests

Summary

MetricCount
Total Test Cases0
Number of Successes0
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0
wasm-filesystem harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases75
Number of Successes75
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
File Tests
chartests.cSuccessNone0.051915s0.151833s
Success
chdir_getcwd.cSuccessNone0.052760s0.124094s
Success
chmod.cSuccessNone0.058433s0.139101s
Success
clock_gettime_highlevel.cSuccessNone0.124438s0.178592s
Success
clock_gettime_simple.cSuccessNone0.047958s0.113912s
Success
cloexec.cSuccessNone0.055205s0.156318s
Success
close.cSuccessNone0.066207s0.149940s
Success
copy_file_range.cSuccessNone0.056234s0.148771s
Success
creat_access.cSuccessNone0.054928s0.125615s
Success
cross_cage_fd_bruteforce.cSuccessNone0.056746s0.190028s
Success
doubleclose.cSuccessNone0.049056s0.109824s
Success
dup.cSuccessNone0.049302s0.127348s
Success
dup2.cSuccessNone0.054032s0.120785s
Success
dup3.cSuccessNone0.051724s0.123239s
Success
dupwrite.cSuccessNone0.055384s0.124411s
Success
etc_conf.cSuccessNone0.050882s0.123964s
Success
faccessat.cSuccessNone0.051966s0.124882s
Success
fchdir.cSuccessNone0.057752s0.139267s
Success
fchmod.cSuccessNone0.056633s0.133616s
Success
fchmodat.cSuccessNone0.051819s0.131806s
Success
fcntl.cSuccessNone0.054922s0.136727s
Success
fcntl_dupfd.cSuccessNone0.049191s0.117323s
Success
fdatasync.cSuccessNone0.054436s0.119034s
Success
filetest.cSuccessNone0.054644s0.120694s
Success
filetest1000.cSuccessNone0.064651s0.138309s
Success
flock.cSuccessNone0.061709s0.182725s
Success
fstat.cSuccessNone0.056979s0.141302s
Success
fstatfs.cSuccessNone0.051018s0.119146s
Success
fsync.cSuccessNone0.052701s0.119716s
Success
ftruncate.cSuccessNone0.059037s0.212800s
Success
getcwd.cSuccessNone0.052043s0.115281s
Success
getcwd_null.cSuccessNone0.055428s0.129212s
Success
getpgid.cSuccessNone0.049654s0.111713s
Success
getrandom.cSuccessNone0.055355s0.136683s
Success
ioctl.cSuccessNone0.059078s0.128486s
Success
link.cSuccessNone0.059386s0.168765s
Success
linkat.cSuccessNone0.058964s0.181837s
Success
locale_test.cSuccessNone0.065675s0.322757s
Success
lseek.cSuccessNone0.058753s0.196370s
Success
lstat.cSuccessNone0.060086s0.147181s
Success
mkdir_rmdir.cSuccessNone0.056069s0.126343s
Success
mkfifo_test.cSuccessNone0.059688s0.176834s
Success
mknod.cSuccessNone0.054715s0.133220s
Success
nocancel_io.cSuccessNone0.058841s0.151470s
Success
open.cSuccessNone0.050111s0.118245s
Success
openat.cSuccessNone0.051139s0.120041s
Success
path_conversion_safety.cSuccessNone0.057984s0.140659s
Success
ppoll.cSuccessNone0.058752s0.136093s
Success
pread_pwrite.cSuccessNone0.053031s0.128501s
Success
preadv_pwritev.cSuccessNone0.058005s0.143601s
Success
printf.cSuccessNone0.048492s0.111576s
Success
prlimit64.cSuccessNone0.049580s0.114640s
Success
read.cSuccessNone0.055616s0.133721s
Success
readbytes.cSuccessNone0.052398s0.120976s
Success
readdir_basic.cSuccessNone0.059619s0.156651s
Success
readlink.cSuccessNone0.054419s0.129762s
Success
readlinkat.cSuccessNone0.056935s0.137200s
Success
readv_writev_test.cSuccessNone0.056676s0.134730s
Success
rename.cSuccessNone0.058666s0.125819s
Success
renameat.cSuccessNone0.058560s0.139750s
Success
sc-writev.cSuccessNone0.053703s0.122762s
Success
stat.cSuccessNone0.056921s0.140907s
Success
statfs.cSuccessNone0.050807s0.115339s
Success
symlink.cSuccessNone0.057457s0.153666s
Success
sync_file_range.cSuccessNone0.053664s0.120343s
Success
timespec_time_t_compat.cSuccessNone0.053129s0.117863s
Success
trailing_slash.cSuccessNone0.053957s0.128189s
Success
truncate.cSuccessNone0.057054s0.151449s
Success
unlink.cSuccessNone0.057918s0.162001s
Success
unlinkat.cSuccessNone0.057185s0.140082s
Success
utimensat.cSuccessNone0.055442s0.141545s
Success
write.cSuccessNone0.047046s0.108292s
Success
writeloop.cSuccessNone0.057469s0.124339s
Success
writepartial.cSuccessNone0.055594s0.117197s
Success
writev.cSuccessNone0.056052s0.132842s
Success

Fail Tests

Summary

MetricCount
Total Test Cases0
Number of Successes0
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0
wasm-memory harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases28
Number of Successes28
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Memory Tests
brk.cSuccessNone0.055072s0.121479s
Success
fork_large_memory.cSuccessNone0.119066s0.566560s
Success
malloc.cSuccessNone0.054955s0.140530s
Success
malloc_large.cSuccessNone0.053709s0.117708s
Success
memcpy.cSuccessNone0.071389s0.129426s
Success
memory_error_test.cSuccessNone0.058379s0.150972s
Success
mmap.cSuccessNone0.064158s0.173419s
Success
mmap_address_truncation.cSuccessNone0.053718s0.121946s
Success
mmap_aligned.cSuccessNone0.050370s0.132274s
Success
mmap_complicated.cSuccessNone0.075365s0.244591s
Success
mmap_file.cSuccessNone0.059150s0.164919s
Success
mmap_shared.cSuccessNone0.069899s0.185601s
Success
mmaptest.cSuccessNone0.053168s0.124179s
Success
mprotect.cSuccessNone0.050044s0.119946s
Success
mprotect_boundary.cSuccessNone0.061607s0.124995s
Success
mprotect_end_region.cSuccessNone0.051046s0.122689s
Success
mprotect_middle_region.cSuccessNone0.050844s0.128383s
Success
mprotect_multiple_times.cSuccessNone0.051743s0.128070s
Success
mprotect_same_value.cSuccessNone0.066331s0.183535s
Success
mprotect_spanning_regions.cSuccessNone0.052005s0.156556s
Success
munmap_adjacent_shm.cSuccessNone0.081050s0.322022s
Success
sbrk.cSuccessNone0.052084s0.121926s
Success
segfault.cSuccessNone0.075793s0.215709s
Success
shm.cSuccessNone0.055420s0.163652s
Success
shmtest.cSuccessNone0.054745s0.125340s
Success
thread_malloc_sequential.cSuccessNone0.067706s0.259630s
Success
vmmap_escape.cSuccessNone0.080039s0.276453s
Success
vtable.cSuccessNone0.083471s0.268353s
Success

Fail Tests

Summary

MetricCount
Total Test Cases4
Number of Successes4
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Memory Tests
invalid_access_direct.cSuccessNone0.124591s0.172425s
Success
invalid_access_fork.cSuccessNone0.140259s0.149273s
Success
mmap-negative1.cSuccessNone0.123474s0.132586s
Success
mmap-negative2.cSuccessNone0.173087s0.198444s
Success
wasm-process harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases58
Number of Successes58
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Process Tests
barrier_test.cSuccessNone0.053561s0.146040s
Success
chain_thread.cSuccessNone1.056076s1.157164s
Success
ctor_syscall_test.cSuccessNone0.046286s0.113085s
Success
cxa_atexit_test.cSuccessNone0.050971s0.115536s
Success
exec_bss_reset.cSuccessNone0.058834s0.167938s
Success
exec_non_utf8.cSuccessNone0.053840s0.124385s
Success
execve_shebang.cSuccessNone0.055823s0.123050s
Success
exit.cSuccessNone0.053305s0.118993s
Success
exit_failure.cSuccessNone0.054969s0.143879s
Success
exit_group_thread.cSuccessNone0.057720s0.168872s
Success
exit_status_first_wins.cSuccessNone0.058458s0.167779s
Success
flockfile_test.cSuccessNone0.054420s0.155480s
Success
fork2malloc.cSuccessNone0.055233s0.152391s
Success
fork_select.cSuccessNone0.055327s0.157193s
Success
fork_simple.cSuccessNone0.053313s0.141038s
Success
fork_syscall.cSuccessNone0.059079s0.650379s
Success
fork_tls_ctype.cSuccessNone0.056766s0.165430s
Success
forkandopen.cSuccessNone0.057018s0.157983s
Success
forkdup.cSuccessNone0.058569s0.158349s
Success
forkexecuid.cSuccessNone0.053579s0.168938s
Success
forkexecv-arg.cSuccessNone0.053389s0.160113s
Success
forkexecv.cSuccessNone0.052139s0.154462s
Success
forkfiles.cSuccessNone0.055038s0.151782s
Success
forkmalloc.cSuccessNone0.056549s0.145943s
Success
forknodup.cSuccessNone0.057210s0.154442s
Success
function-ptr.cSuccessNone0.050573s0.113289s
Success
getegid_syscall.cSuccessNone0.056020s0.497163s
Success
getgid_syscall.cSuccessNone0.055849s0.510799s
Success
getpid.cSuccessNone0.050619s0.112418s
Success
getpid_syscall.cSuccessNone0.058408s0.515577s
Success
getppid.cSuccessNone0.055312s0.151047s
Success
getppid_syscall.cSuccessNone0.059151s0.407614s
Success
getuid.cSuccessNone0.054615s0.119982s
Success
getuid_syscall.cSuccessNone0.054356s0.265867s
Success
hello-arg.cSuccessNone0.047593s0.121428s
Success
hello.cSuccessNone0.046071s0.107755s
Success
longjmp.cSuccessNone0.046932s0.121942s
Success
mutex.cSuccessNone2.057622s2.143690s
Success
printf_deadlock_smoke.cSuccessNone0.062587s0.177341s
Success
printf_thread_test.cSuccessNone0.055442s0.151852s
Success
sem_forks.cSuccessNone0.056898s0.194463s
Success
sem_slow_path.cSuccessNone1.058871s1.156845s
Success
setjmp_edge.cSuccessNone0.053831s0.209655s
Success
setsid.cSuccessNone0.049395s0.109477s
Success
template.cSuccessNone0.055314s0.198769s
Success
test_crossmodule_longjmp.cSuccessNone0.056740s0.154001s
Success
test_exec_nofork.cSuccessNone0.053958s0.146822s
Success
test_unlink_open_file.cSuccessNone0.050544s0.111961s
Success
thread-guard.cSuccessNone0.054298s0.141947s
Success
thread-test.cSuccessNone0.051086s0.128511s
Success
thread.cSuccessNone0.051131s0.130997s
Success
thread_cageid_race.cSuccessNone0.052129s0.304121s
Success
tls_test.cSuccessNone0.054625s0.172164s
Success
uname.cSuccessNone0.048895s0.111868s
Success
wait.cSuccessNone0.052161s0.165978s
Success
waitpid_anychild.cSuccessNone0.054424s0.143524s
Success
waitpid_syscall.cSuccessNone1.056243s1.246698s
Success
waitpid_wnohang.cSuccessNone0.057914s0.149506s
Success

Fail Tests

Summary

MetricCount
Total Test Cases0
Number of Successes0
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0
wasm-signals harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases24
Number of Successes24
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Signal Tests
alarm.cSuccessNone7.055076s7.152149s
Success
eintr_fork_signal.cSuccessNone1.055807s1.157004s
Success
kill.cSuccessNone1.053707s1.143630s
Success
pause_test.cSuccessNone1.055635s1.146717s
Success
setitimer.cSuccessNone7.054280s7.152410s
Success
sigalrm.cSuccessNone2.054693s2.140331s
Success
sigaltstack.cSuccessNone0.057331s0.136778s
Success
sigchld.cSuccessNone1.056776s1.147517s
Success
signal-fork.cSuccessNone4.056093s4.141471s
Success
signal-simple.cSuccessNone0.054937s0.125524s
Success
signal_SIGCHLD.cSuccessNone0.055142s0.151420s
Success
signal_fork.cSuccessNone0.051763s0.157122s
Success
signal_int_ignored.cSuccessNone2.055558s2.146800s
Success
signal_kill_cleanup.cSuccessNone1.054206s1.139964s
Success
signal_procmask.cSuccessNone0.050131s0.126711s
Success
signal_read_interrupt.cSuccessNone0.560332s0.650115s
Success
signal_recursive.cSuccessNone0.049786s0.140991s
Success
signal_sa_mask.cSuccessNone0.049350s0.123811s
Success
signal_select_interrupt.cSuccessNone0.557691s0.652768s
Success
signal_write_interrupt.cSuccessNone1.058820s1.144135s
Success
sigpipe.cSuccessNone1.058056s1.155175s
Success
sigprocmask.cSuccessNone1.055622s1.129642s
Success
sigsuspend_test.cSuccessNone1.053569s1.152712s
Success
test_sigsetjmp.cSuccessNone0.054617s0.152706s
Success

Fail Tests

Summary

MetricCount
Total Test Cases1
Number of Successes1
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Signal Tests
signal_resethand.cSuccessNone1.053241s1.148412s
Success
wasm-networking harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases44
Number of Successes44
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Networking Tests
accept4.cSuccessNone0.059851s0.138816s
Success
dns_resolve_test.cSuccessNone0.055199s0.123635s
Success
dnstest.cSuccessNone0.055878s0.126648s
Success
epoll_badfd.cSuccessNone0.051420s0.115162s
Success
epoll_edge_triggered.cSuccessNone0.212449s0.386084s
Success
epollcreate1.cSuccessNone0.056886s0.133319s
Success
error_handling_net.cSuccessNone0.062642s0.198329s
Success
getaddrinfo_test.cSuccessNone0.058926s0.160613s
Success
getaddrinfo_unspec.cSuccessNone0.060619s0.186202s
Success
gethostname.cSuccessNone0.051101s0.110186s
Success
getifaddrs.cSuccessNone0.057593s0.138147s
Success
getsockname.cSuccessNone0.057708s0.133577s
Success
getsockopt.cSuccessNone0.059680s0.166706s
Success
ipv6_basic.cSuccessNone0.060716s0.162106s
Success
makepipe.cSuccessNone0.048028s0.116002s
Success
nonblocking_eagain.cSuccessNone0.059025s0.171085s
Success
pipe.cSuccessNone0.056052s0.135414s
Success
pipe2.cSuccessNone0.058142s0.126829s
Success
pipeinput.cSuccessNone0.059010s0.162357s
Success
pipeinput2.cSuccessNone0.058139s0.163963s
Success
pipeonestring.cSuccessNone0.059132s0.164617s
Success
pipepong.cSuccessNone0.057137s0.167909s
Success
pipewrite.cSuccessNone0.052195s0.127985s
Success
poll.cSuccessNone0.055354s0.124798s
Success
recvfrom-sendto.cSuccessNone0.058211s0.143646s
Success
sendmsg_recvmsg_test.cSuccessNone0.057132s0.138319s
Success
serverclient.cSuccessNone0.056763s0.141484s
Success
shutdown.cSuccessNone0.058257s0.138006s
Success
shutdown_fork.cSuccessNone0.056953s0.157056s
Success
simple-select.cSuccessNone0.057058s0.160568s
Success
simple_epoll.cSuccessNone0.056237s0.135559s
Success
socket.cSuccessNone0.055618s0.126553s
Success
socket_cloexec.cSuccessNone0.055911s0.123050s
Success
socket_options_advanced.cSuccessNone0.061203s0.178849s
Success
socketepoll.cSuccessNone0.056012s0.127434s
Success
socketpair.cSuccessNone0.055765s0.152000s
Success
socketselect.cSuccessNone0.054867s0.129999s
Success
udp_send_recv.cSuccessNone0.161768s0.282749s
Success
uds-getsockname.cSuccessNone0.060479s0.122536s
Success
uds-nb-select.cSuccessNone2.064249s2.204076s
Success
uds-serverclient.cSuccessNone0.060442s0.172939s
Success
uds-socketselect.cSuccessNone0.055446s0.134144s
Success
uds_listen_poll.cSuccessNone1.062267s1.179645s
Success
writev_socket.cSuccessNone0.056496s0.168924s
Success

Fail Tests

Summary

MetricCount
Total Test Cases0
Number of Successes0
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0
wasm-dynamic-linking harness

Test Report

Deterministic Tests

Summary

MetricCount
Total Test Cases7
Number of Successes7
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Dylink Tests
basic.cSuccessNone0.051701s0.122801s
Success
dlopen_fork.cSuccessNone0.053695s0.151260s
Success
dlopen_thread.cSuccessNone0.055495s0.156771s
Success
double_fork_dlopen.cSuccessNone0.056029s0.199172s
Success
fork_dlopen.cSuccessNone0.053137s0.153286s
Success
longjmp_dlopen.cSuccessNone0.051319s0.143488s
Success
rdynamic_main.cSuccessNone0.053076s0.149030s
Success

Fail Tests

Summary

MetricCount
Total Test Cases1
Number of Successes1
Number of Failures0
Number of Compilation Failure Native0
Number of Runtime Failure Native0
Number of Segmentation Fault Native0
Number of Timeout During Native0
Number of Lind Wasm Compile Failure0
Number of Lind Wasm Runtime Failure0
Number of Lind Wasm Segmentation Failure0
Number of Timeout During Lind Wasm run0
Number of Unknown Failure0
Number of C Compiler and Wasm Output mismatch0
Number of Fail Test: Native Succeeded (Should Fail)0
Number of Fail Test: Wasm Succeeded (Should Fail)0
Number of Fail Test: Both Native and Wasm Succeeded (Should Fail)0
Number of Fail Test: Native Compilation Failure (Should Succeed)0
Number of Fail Test: Wasm Compilation Failure (Should Succeed)0

Test Results by Category

Test CaseStatusError TypeNative TimeWasm TimeOutput
Dylink Tests
dlerror.cSuccessNone0.045755s0.114861s
Success


// The slot starts PROT_NONE (see new_started_impl_with_lind); activate
// just this worker's own slot now. Leave the guard page before it
// PROT_NONE so stack overflow still traps.

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.

so stack overflow still traps

The 4K guard in front of each slot never enters the vmmap but our vmmap walks gaps in ascending order starting from address 0. This comment seems doesn't hold bc a worker stack overflow now silently clobbers whatever the user just mmapped there.


/// Tracks, per cage, whether a grate handler has ever been registered.
/// Lets `fork` skip rebuilding a worker pool for cages that never use grates.
pub static GRATE_HANDLER_REGISTERED: OnceLock<RwLock<Vec<bool>>> = OnceLock::new();

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.

Doesn't need to be pub

// initialize the grate pool for later use in grate calls and
// other syscalls that require re-entry into wasmtime runtime.
init_grate_pool();
unregister_grate_handler(cageid);

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.

We probably need to keep unregister_grate_handler(cageid) unconditional and clear the flag in the branch that does not register.

If a cage with a registered handler execs into a module that does not export pass_fptr_to_wt, the stale handler stays in GRATE_POOL. Its 32 worker Stores keep the old module and old linear memory alive, and a grate call targeting that cage id runs into the replaced image. GRATE_HANDLER_REGISTERED[cageid] is also never cleared, so later forks rebuild a pool for nothing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants