You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This PR replaces the unsynchronized mutable slot with ArcSwapOption<Cage>, so each cage table entry can be atomically loaded, replaced, or cleared. This removes the data race between concurrent lookup and removal while preserving O(1) indexed lookup by cage ID.
This change does introduce measurable overhead on lightweight metadata syscall paths where cage lookup dominates the operation cost. The overhead is most visible in very lightweight syscalls such as getpid(), getppid(), getuid(), and geteuid(), because these calls do little work besides runtime metadata lookup.
The fork + waitpid lifecycle benchmark does not show a measurable regression.
Future Optimization
There is still room to optimize cage lookup after the remaining exit-handling issues #1072 are resolved. In particular, once we can guarantee cage lifetime through 3i. For example, by ensuring that a cage cannot be removed while a grate dispatch or syscall path is still using it, we may be able to optimize hot-path lookup further.
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.c
Success
STDOUT:
pass
STDERR:
concurrent-request/thread_race_grate.c
Success
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.c
Success
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.c
Success
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.c
Success
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.c
Success
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.c
Success
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.c
Success
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.c
Success
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.c
Success
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.c
Success
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/diff-cage-args_grate.c
Success
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.c
Success
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
Metric
Count
Total Test Cases
3
Number of Successes
3
Number of Failures
0
Number of Compilation Failure Native
0
Number of Runtime Failure Native
0
Number of Segmentation Fault Native
0
Number of Timeout During Native
0
Number of Lind Wasm Compile Failure
0
Number of Lind Wasm Runtime Failure
0
Number of Lind Wasm Segmentation Failure
0
Number of Timeout During Lind Wasm run
0
Number of Unknown Failure
0
Number of C Compiler and Wasm Output mismatch
0
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 Case
Status
Error Type
Native Time
Wasm Time
Output
Static Tests
fork_simple.c
Success
None
0.055241s
4.546966s
Success
thread.c
Success
None
0.046255s
4.499574s
Success
tls_test.c
Success
None
0.058531s
4.484596s
Success
Fail Tests
Summary
Metric
Count
Total Test Cases
0
Number of Successes
0
Number of Failures
0
Number of Compilation Failure Native
0
Number of Runtime Failure Native
0
Number of Segmentation Fault Native
0
Number of Timeout During Native
0
Number of Lind Wasm Compile Failure
0
Number of Lind Wasm Runtime Failure
0
Number of Lind Wasm Segmentation Failure
0
Number of Timeout During Lind Wasm run
0
Number of Unknown Failure
0
Number of C Compiler and Wasm Output mismatch
0
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 harness
Test Report
Deterministic Tests
Summary
Metric
Count
Total Test Cases
211
Number of Successes
211
Number of Failures
0
Number of Compilation Failure Native
0
Number of Runtime Failure Native
0
Number of Segmentation Fault Native
0
Number of Timeout During Native
0
Number of Lind Wasm Compile Failure
0
Number of Lind Wasm Runtime Failure
0
Number of Lind Wasm Segmentation Failure
0
Number of Timeout During Lind Wasm run
0
Number of Unknown Failure
0
Number of C Compiler and Wasm Output mismatch
0
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 Case
Status
Error Type
Native Time
Wasm Time
Output
File Tests
chartests.c
Success
None
0.050029s
0.141101s
Success
chdir_getcwd.c
Success
None
0.048334s
0.111192s
Success
chmod.c
Success
None
0.055836s
0.126032s
Success
clock_gettime_highlevel.c
Success
None
0.118337s
0.156996s
Success
clock_gettime_simple.c
Success
None
0.043951s
0.098528s
Success
cloexec.c
Success
None
0.052724s
0.125400s
Success
close.c
Success
None
0.059705s
0.131810s
Success
creat_access.c
Success
None
0.051490s
0.112479s
Success
doubleclose.c
Success
None
0.043653s
0.093917s
Success
dup.c
Success
None
0.043573s
0.112730s
Success
dup2.c
Success
None
0.049404s
0.108565s
Success
dup3.c
Success
None
0.052057s
0.111667s
Success
dupwrite.c
Success
None
0.050361s
0.107248s
Success
etc_conf.c
Success
None
0.047882s
0.116375s
Success
fchdir.c
Success
None
0.056212s
0.127590s
Success
fchmod.c
Success
None
0.052856s
0.121690s
Success
fcntl.c
Success
None
0.049733s
0.126245s
Success
fdatasync.c
Success
None
0.049854s
0.106055s
Success
filetest.c
Success
None
0.050803s
0.105853s
Success
filetest1000.c
Success
None
0.059820s
0.121595s
Success
flock.c
Success
None
0.060454s
0.146883s
Success
fstat.c
Success
None
0.054385s
0.128077s
Success
fstatfs.c
Success
None
0.045793s
0.100641s
Success
fsync.c
Success
None
0.048901s
0.105863s
Success
ftruncate.c
Success
None
0.053536s
0.202811s
Success
getcwd.c
Success
None
0.046766s
0.102350s
Success
getcwd_null.c
Success
None
0.050731s
0.115340s
Success
getpgid.c
Success
None
0.046716s
0.101038s
Success
getrandom.c
Success
None
0.050712s
0.122804s
Success
ioctl.c
Success
None
0.055334s
0.119564s
Success
link.c
Success
None
0.057244s
0.156154s
Success
locale_test.c
Success
None
0.067357s
0.317062s
Success
lseek.c
Success
None
0.058092s
0.194547s
Success
lstat.c
Success
None
0.055390s
0.130081s
Success
mkdir_rmdir.c
Success
None
0.052369s
0.113499s
Success
mkfifo_test.c
Success
None
0.057095s
0.155536s
Success
mknod.c
Success
None
0.049846s
0.119633s
Success
nocancel_io.c
Success
None
0.057691s
0.139197s
Success
open.c
Success
None
0.044892s
0.098511s
Success
openat.c
Success
None
0.047299s
0.109122s
Success
path_conversion_safety.c
Success
None
0.053623s
0.128846s
Success
ppoll.c
Success
None
0.054501s
0.121627s
Success
pread_pwrite.c
Success
None
0.048343s
0.113332s
Success
preadv_pwritev.c
Success
None
0.052977s
0.127401s
Success
printf.c
Success
None
0.042017s
0.093918s
Success
prlimit64.c
Success
None
0.045378s
0.104132s
Success
read.c
Success
None
0.053997s
0.126572s
Success
readbytes.c
Success
None
0.047554s
0.103176s
Success
readdir_basic.c
Success
None
0.054286s
0.142998s
Success
readlink.c
Success
None
0.054074s
0.121199s
Success
readlinkat.c
Success
None
0.054525s
0.125272s
Success
readv_writev_test.c
Success
None
0.052561s
0.123102s
Success
rename.c
Success
None
0.055766s
0.117924s
Success
sc-writev.c
Success
None
0.048614s
0.109752s
Success
stat.c
Success
None
0.051182s
0.119458s
Success
symlink.c
Success
None
0.055640s
0.145750s
Success
sync_file_range.c
Success
None
0.049728s
0.109910s
Success
timespec_time_t_compat.c
Success
None
0.049296s
0.106314s
Success
truncate.c
Success
None
0.053128s
0.130264s
Success
unlink.c
Success
None
0.055534s
0.150324s
Success
unlinkat.c
Success
None
0.052275s
0.128716s
Success
write.c
Success
None
0.044802s
0.095677s
Success
writeloop.c
Success
None
0.055647s
0.116240s
Success
writepartial.c
Success
None
0.050776s
0.105286s
Success
writev.c
Success
None
0.054553s
0.121149s
Success
Math Tests
math_link_smoke.c
Success
None
0.056040s
0.106429s
Success
math_tests.c
Success
None
0.061510s
0.134795s
Success
printf_float.c
Success
None
0.056276s
0.127206s
Success
Memory Tests
brk.c
Success
None
0.051021s
0.111843s
Success
fork_large_memory.c
Success
None
0.086666s
0.391765s
Success
malloc.c
Success
None
0.048348s
0.100320s
Success
malloc_large.c
Success
None
0.049835s
0.100412s
Success
memcpy.c
Success
None
0.048385s
0.104424s
Success
memory_error_test.c
Success
None
0.056532s
0.132865s
Success
mmap.c
Success
None
0.046590s
0.103420s
Success
mmap_aligned.c
Success
None
0.045599s
0.112321s
Success
mmap_complicated.c
Success
None
0.054244s
0.127188s
Success
mmap_file.c
Success
None
0.054705s
0.119062s
Success
mmap_shared.c
Success
None
0.053506s
0.123483s
Success
mmaptest.c
Success
None
0.049453s
0.109739s
Success
mprotect.c
Success
None
0.046246s
0.101808s
Success
mprotect_boundary.c
Success
None
0.048733s
0.114533s
Success
mprotect_end_region.c
Success
None
0.047224s
0.111410s
Success
mprotect_middle_region.c
Success
None
0.046245s
0.108783s
Success
mprotect_multiple_times.c
Success
None
0.047904s
0.111838s
Success
mprotect_same_value.c
Success
None
0.047487s
0.105866s
Success
mprotect_spanning_regions.c
Success
None
0.047211s
0.125887s
Success
munmap_adjacent_shm.c
Success
None
0.049694s
0.125012s
Success
sbrk.c
Success
None
0.048537s
0.106192s
Success
segfault.c
Success
None
0.055382s
0.138588s
Success
shm.c
Success
None
0.054319s
0.128492s
Success
shmtest.c
Success
None
0.045854s
0.107813s
Success
thread_malloc_sequential.c
Success
None
0.053795s
0.152905s
Success
vtable.c
Success
None
0.058822s
0.122924s
Success
Networking Tests
accept4.c
Success
None
0.059108s
0.128738s
Success
dns_resolve_test.c
Success
None
0.051243s
0.115787s
Success
dnstest.c
Success
None
0.055130s
0.113771s
Success
epoll_badfd.c
Success
None
0.044560s
0.099676s
Success
epoll_edge_triggered.c
Success
None
0.211051s
0.378033s
Success
epollcreate1.c
Success
None
0.055756s
0.127510s
Success
error_handling_net.c
Success
None
0.060735s
0.187078s
Success
getaddrinfo_test.c
Success
None
0.054472s
0.149033s
Success
getaddrinfo_unspec.c
Success
None
0.063807s
0.121686s
Success
gethostname.c
Success
None
0.045275s
0.096152s
Success
getifaddrs.c
Success
None
0.053979s
0.117395s
Success
getsockname.c
Success
None
0.058954s
0.119759s
Success
getsockopt.c
Success
None
0.056040s
0.153846s
Success
ipv6_basic.c
Success
None
0.057174s
0.150650s
Success
makepipe.c
Success
None
0.045969s
0.098707s
Success
nonblocking_eagain.c
Success
None
0.057975s
0.160609s
Success
pipe.c
Success
None
0.054689s
0.126441s
Success
pipe2.c
Success
None
0.054424s
0.113914s
Success
pipeinput.c
Success
None
0.054416s
0.136053s
Success
pipeinput2.c
Success
None
0.055475s
0.141233s
Success
pipeonestring.c
Success
None
0.056085s
0.143358s
Success
pipepong.c
Success
None
0.054081s
0.144599s
Success
pipewrite.c
Success
None
0.048729s
0.112265s
Success
poll.c
Success
None
0.053557s
0.114275s
Success
recvfrom-sendto.c
Success
None
0.055376s
0.123570s
Success
sendmsg_recvmsg_test.c
Success
None
0.055754s
0.128149s
Success
serverclient.c
Success
None
0.053691s
0.129381s
Success
shutdown.c
Success
None
0.055135s
0.124866s
Success
shutdown_fork.c
Success
None
0.053666s
0.127257s
Success
simple-select.c
Success
None
0.057352s
0.142359s
Success
simple_epoll.c
Success
None
0.052767s
0.117835s
Success
socket.c
Success
None
0.051713s
0.114095s
Success
socket_cloexec.c
Success
None
0.051979s
0.113033s
Success
socket_options_advanced.c
Success
None
0.058666s
0.170087s
Success
socketepoll.c
Success
None
0.052958s
0.114404s
Success
socketpair.c
Success
None
0.050270s
0.122253s
Success
socketselect.c
Success
None
0.052709s
0.120732s
Success
udp_send_recv.c
Success
None
0.162007s
0.263096s
Success
uds-getsockname.c
Success
None
0.053164s
0.111842s
Success
uds-nb-select.c
Success
None
2.061106s
2.176102s
Success
uds-serverclient.c
Success
None
0.056526s
0.146435s
Success
uds-socketselect.c
Success
None
0.052650s
0.123218s
Success
writev_socket.c
Success
None
0.056611s
0.150716s
Success
Process Tests
barrier_test.c
Success
None
0.051695s
0.118058s
Success
chain_thread.c
Success
None
1.055245s
1.122569s
Success
ctor_syscall_test.c
Success
None
0.041743s
0.096364s
Success
cxa_atexit_test.c
Success
None
0.048717s
0.102505s
Success
exec_non_utf8.c
Success
None
0.052241s
0.111305s
Success
execve_shebang.c
Success
None
0.053996s
0.113107s
Success
exit.c
Success
None
0.050122s
0.103661s
Success
exit_failure.c
Success
None
0.053357s
0.115075s
Success
exit_group_thread.c
Success
None
0.053770s
0.126560s
Success
flockfile_test.c
Success
None
0.054213s
0.130182s
Success
fork2malloc.c
Success
None
0.053894s
0.123765s
Success
fork_select.c
Success
None
0.052517s
0.127258s
Success
fork_simple.c
Success
None
0.050861s
0.116876s
Success
fork_syscall.c
Success
None
0.059833s
0.346090s
Success
fork_tls_ctype.c
Success
None
0.056270s
0.139872s
Success
forkandopen.c
Success
None
0.055013s
0.132402s
Success
forkdup.c
Success
None
0.055666s
0.121814s
Success
forkexecuid.c
Success
None
0.053330s
0.135675s
Success
forkexecv-arg.c
Success
None
0.055067s
0.124633s
Success
forkexecv.c
Success
None
0.050573s
0.120120s
Success
forkfiles.c
Success
None
0.054475s
0.127452s
Success
forkmalloc.c
Success
None
0.052238s
0.113605s
Success
forknodup.c
Success
None
0.053162s
0.127693s
Success
function-ptr.c
Success
None
0.046367s
0.099338s
Success
getegid_syscall.c
Success
None
0.053534s
0.274143s
Success
getgid_syscall.c
Success
None
0.052103s
0.268161s
Success
getpid.c
Success
None
0.045570s
0.097482s
Success
getpid_syscall.c
Success
None
0.054967s
0.277131s
Success
getppid.c
Success
None
0.054271s
0.117616s
Success
getppid_syscall.c
Success
None
0.055370s
0.242279s
Success
getuid.c
Success
None
0.053394s
0.109295s
Success
getuid_syscall.c
Success
None
0.052434s
0.173974s
Success
hello-arg.c
Success
None
0.042991s
0.097304s
Success
hello.c
Success
None
0.042296s
0.093042s
Success
longjmp.c
Success
None
0.045087s
0.103959s
Success
mutex.c
Success
None
2.054939s
2.117965s
Success
printf_deadlock_smoke.c
Success
None
0.063317s
0.150962s
Success
printf_thread_test.c
Success
None
0.052811s
0.128105s
Success
sem_forks.c
Success
None
0.053724s
0.138781s
Success
setsid.c
Success
None
0.047136s
0.100166s
Success
template.c
Success
None
0.054579s
0.146098s
Success
test_exec_nofork.c
Success
None
0.052710s
0.118606s
Success
test_unlink_open_file.c
Success
None
0.047553s
0.099815s
Success
thread-guard.c
Success
None
0.051065s
0.119887s
Success
thread-test.c
Success
None
0.047139s
0.114224s
Success
thread.c
Success
None
0.047822s
0.107842s
Success
thread_cageid_race.c
Success
None
0.047165s
0.154633s
Success
tls_test.c
Success
None
0.050988s
0.123176s
Success
uname.c
Success
None
0.045003s
0.096125s
Success
wait.c
Success
None
0.050391s
0.128708s
Success
waitpid_anychild.c
Success
None
0.053269s
0.120981s
Success
waitpid_syscall.c
Success
None
1.053932s
1.171599s
Success
waitpid_wnohang.c
Success
None
0.054127s
0.125729s
Success
Signal Tests
alarm.c
Success
None
7.050921s
7.143233s
Success
eintr_fork_signal.c
Success
None
1.054178s
1.132993s
Success
kill.c
Success
None
1.052265s
1.124768s
Success
setitimer.c
Success
None
7.054338s
7.147315s
Success
sigalrm.c
Success
None
2.052167s
2.124531s
Success
sigaltstack.c
Success
None
0.053355s
0.121049s
Success
sigchld.c
Success
None
1.053673s
1.118238s
Success
signal-fork.c
Success
None
4.055305s
4.119156s
Success
signal-simple.c
Success
None
0.051861s
0.111463s
Success
signal_SIGCHLD.c
Success
None
0.051239s
0.122458s
Success
signal_fork.c
Success
None
0.049297s
0.124222s
Success
signal_int_ignored.c
Success
None
2.051417s
2.124419s
Success
signal_kill_cleanup.c
Success
None
1.051981s
1.115549s
Success
signal_procmask.c
Success
None
0.046348s
0.107607s
Success
signal_read_interrupt.c
Success
None
0.557828s
0.628737s
Success
signal_recursive.c
Success
None
0.047307s
0.112161s
Success
signal_sa_mask.c
Success
None
0.045715s
0.105695s
Success
signal_select_interrupt.c
Success
None
0.556640s
0.630370s
Success
signal_write_interrupt.c
Success
None
1.054212s
1.127700s
Success
sigpipe.c
Success
None
1.056561s
1.127263s
Success
sigprocmask.c
Success
None
1.051242s
1.114754s
Success
Fail Tests
Summary
Metric
Count
Total Test Cases
4
Number of Successes
4
Number of Failures
0
Number of Compilation Failure Native
0
Number of Runtime Failure Native
0
Number of Segmentation Fault Native
0
Number of Timeout During Native
0
Number of Lind Wasm Compile Failure
0
Number of Lind Wasm Runtime Failure
0
Number of Lind Wasm Segmentation Failure
0
Number of Timeout During Lind Wasm run
0
Number of Unknown Failure
0
Number of C Compiler and Wasm Output mismatch
0
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Resolves #1050
This PR replaces the unsynchronized mutable slot with
ArcSwapOption<Cage>, so each cage table entry can be atomically loaded, replaced, or cleared. This removes the data race between concurrent lookup and removal while preserving O(1) indexed lookup by cage ID.Performance Impact
Raw implementation:
lind@de860ae5950e:~/lind-wasm$ ./scripts/lind_run cage_stress.cwasm 1000000 2000 4 pid=1 iters=1000000 forks=2000 threads=4 getpid loop ops=10000 time=0.001481 sec ns/op=148.13 ops/sec=6750640.13 getppid loop ops=10000 time=0.001490 sec ns/op=148.98 ops/sec=6712522.14 mixed lookup syscalls ops=10000 time=0.002143 sec ns/op=214.30 ops/sec=4666312.03 --- measured --- getpid loop ops=1000000 time=0.228167 sec ns/op=228.17 ops/sec=4382761.08 getppid loop ops=1000000 time=0.145727 sec ns/op=145.73 ops/sec=6862161.60 mixed lookup syscalls ops=1000000 time=0.203926 sec ns/op=203.93 ops/sec=4903746.16 pthread mixed lookup ops=1000000 time=0.180652 sec ns/op=180.65 ops/sec=5535506.87 fork + waitpid ops=2000 time=18.764816 sec ns/op=9382408.15 ops/sec=106.58ArcSwap implementation:
lind@de860ae5950e:~/lind-wasm$ ./scripts/lind_run cage_stress.cwasm 1000000 2000 4 pid=1 iters=1000000 forks=2000 threads=4 getpid loop ops=10000 time=0.008866 sec ns/op=886.60 ops/sec=1127902.57 getppid loop ops=10000 time=0.001904 sec ns/op=190.36 ops/sec=5253301.04 mixed lookup syscalls ops=10000 time=0.009859 sec ns/op=985.93 ops/sec=1014268.32 --- measured --- getpid loop ops=1000000 time=0.280564 sec ns/op=280.56 ops/sec=3564254.95 getppid loop ops=1000000 time=0.189801 sec ns/op=189.80 ops/sec=5268670.14 mixed lookup syscalls ops=1000000 time=0.270599 sec ns/op=270.60 ops/sec=3695504.31 pthread mixed lookup ops=1000000 time=0.193474 sec ns/op=193.47 ops/sec=5168659.70 fork + waitpid ops=2000 time=18.503752 sec ns/op=9251875.85 ops/sec=108.09This change does introduce measurable overhead on lightweight metadata syscall paths where cage lookup dominates the operation cost. The overhead is most visible in very lightweight syscalls such as getpid(), getppid(), getuid(), and geteuid(), because these calls do little work besides runtime metadata lookup.
The fork + waitpid lifecycle benchmark does not show a measurable regression.
Future Optimization
There is still room to optimize cage lookup after the remaining exit-handling issues #1072 are resolved. In particular, once we can guarantee cage lifetime through 3i. For example, by ensuring that a cage cannot be removed while a grate dispatch or syscall path is still using it, we may be able to optimize hot-path lookup further.