Skip to content

Commit 4a7c43b

Browse files
hoshinolinaslp
authored andcommitted
Share /dev/shm as a separate mount with DAX
Create a new virtiofs filesystem and mount it separately with DAX unconditionally enabled. Signed-off-by: Asahi Lina <[email protected]>
1 parent 9b5e2db commit 4a7c43b

2 files changed

Lines changed: 32 additions & 5 deletions

File tree

crates/muvm/src/bin/muvm.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ use std::path::Path;
66

77
use anyhow::{anyhow, Context, Result};
88
use krun_sys::{
9-
krun_add_disk, krun_add_vsock_port, krun_create_ctx, krun_set_env, krun_set_gpu_options2,
10-
krun_set_log_level, krun_set_passt_fd, krun_set_root, krun_set_vm_config, krun_set_workdir,
11-
krun_start_enter, VIRGLRENDERER_DRM, VIRGLRENDERER_THREAD_SYNC,
12-
VIRGLRENDERER_USE_ASYNC_FENCE_CB, VIRGLRENDERER_USE_EGL,
9+
krun_add_disk, krun_add_virtiofs2, krun_add_vsock_port, krun_create_ctx, krun_set_env,
10+
krun_set_gpu_options2, krun_set_log_level, krun_set_passt_fd, krun_set_root,
11+
krun_set_vm_config, krun_set_workdir, krun_start_enter, VIRGLRENDERER_DRM,
12+
VIRGLRENDERER_THREAD_SYNC, VIRGLRENDERER_USE_ASYNC_FENCE_CB, VIRGLRENDERER_USE_EGL,
1313
};
1414
use log::debug;
1515
use muvm::cli_options::options;
@@ -231,6 +231,20 @@ fn main() -> Result<()> {
231231
let err = Errno::from_raw_os_error(-err);
232232
return Err(err).context("Failed to configure root path");
233233
}
234+
235+
// SAFETY: `c_path` and `c_path` are pointers to C-string literals.
236+
let err = unsafe {
237+
krun_add_virtiofs2(
238+
ctx_id,
239+
c"devshm".as_ptr(),
240+
c"/dev/shm/".as_ptr(),
241+
1u64 << 29, // 512MiB should be enough for /dev/shm
242+
)
243+
};
244+
if err < 0 {
245+
let err = Errno::from_raw_os_error(-err);
246+
return Err(err).context("Failed to configure /dev/shm filesystem");
247+
}
234248
}
235249

236250
{

crates/muvm/src/guest/mount.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ use std::path::Path;
77
use anyhow::{Context, Result};
88
use rustix::fs::{mkdir, symlink, Mode, CWD};
99
use rustix::mount::{
10-
mount2, mount_bind, move_mount, open_tree, MountFlags, MoveMountFlags, OpenTreeFlags,
10+
mount2, mount_bind, move_mount, open_tree, unmount, MountFlags, MoveMountFlags, OpenTreeFlags,
11+
UnmountFlags,
1112
};
1213

1314
fn make_tmpfs(dir: &str) -> Result<()> {
@@ -160,5 +161,17 @@ pub fn mount_filesystems() -> Result<()> {
160161
make_tmpfs("/tmp/.X11-unix")?;
161162
}
162163

164+
// Mount /dev/shm separately with DAX enabled, to allow cross-domain shared memory
165+
// /dev/shm is mounted by libkrunfw, so unmount it first
166+
unmount("/dev/shm", UnmountFlags::empty()).context("Failed to unmount /dev/shm")?;
167+
mount2(
168+
Some("devshm"),
169+
"/dev/shm",
170+
Some("virtiofs"),
171+
MountFlags::NOEXEC | MountFlags::NOSUID,
172+
Some(c"dax"),
173+
)
174+
.context("Failed to mount `/dev/shm`")?;
175+
163176
Ok(())
164177
}

0 commit comments

Comments
 (0)