From 541fd952e81a3ee0dce6ae79d4e6d0a584d384bb Mon Sep 17 00:00:00 2001 From: Asahi Lina Date: Sun, 27 Oct 2024 01:40:16 +0900 Subject: [PATCH] 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 --- crates/muvm/src/bin/muvm.rs | 22 ++++++++++++++++++---- crates/muvm/src/guest/mount.rs | 15 ++++++++++++++- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/crates/muvm/src/bin/muvm.rs b/crates/muvm/src/bin/muvm.rs index 5ea4959..1c2d9f7 100644 --- a/crates/muvm/src/bin/muvm.rs +++ b/crates/muvm/src/bin/muvm.rs @@ -6,10 +6,10 @@ use std::path::Path; use anyhow::{anyhow, Context, Result}; use krun_sys::{ - krun_add_disk, krun_add_vsock_port, krun_create_ctx, krun_set_env, krun_set_gpu_options2, - krun_set_log_level, krun_set_passt_fd, krun_set_root, krun_set_vm_config, krun_set_workdir, - krun_start_enter, VIRGLRENDERER_DRM, VIRGLRENDERER_THREAD_SYNC, - VIRGLRENDERER_USE_ASYNC_FENCE_CB, VIRGLRENDERER_USE_EGL, + krun_add_disk, krun_add_virtiofs2, krun_add_vsock_port, krun_create_ctx, krun_set_env, + krun_set_gpu_options2, krun_set_log_level, krun_set_passt_fd, krun_set_root, + krun_set_vm_config, krun_set_workdir, krun_start_enter, VIRGLRENDERER_DRM, + VIRGLRENDERER_THREAD_SYNC, VIRGLRENDERER_USE_ASYNC_FENCE_CB, VIRGLRENDERER_USE_EGL, }; use log::debug; use muvm::cli_options::options; @@ -231,6 +231,20 @@ fn main() -> Result<()> { let err = Errno::from_raw_os_error(-err); return Err(err).context("Failed to configure root path"); } + + // SAFETY: `c_path` and `c_path` are pointers to C-string literals. + let err = unsafe { + krun_add_virtiofs2( + ctx_id, + c"devshm".as_ptr(), + c"/dev/shm/".as_ptr(), + 1u64 << 29, // 512MiB should be enough for /dev/shm + ) + }; + if err < 0 { + let err = Errno::from_raw_os_error(-err); + return Err(err).context("Failed to configure /dev/shm filesystem"); + } } { diff --git a/crates/muvm/src/guest/mount.rs b/crates/muvm/src/guest/mount.rs index a816b3c..3126ca0 100644 --- a/crates/muvm/src/guest/mount.rs +++ b/crates/muvm/src/guest/mount.rs @@ -7,7 +7,8 @@ use std::path::Path; use anyhow::{Context, Result}; use rustix::fs::{mkdir, symlink, Mode, CWD}; use rustix::mount::{ - mount2, mount_bind, move_mount, open_tree, MountFlags, MoveMountFlags, OpenTreeFlags, + mount2, mount_bind, move_mount, open_tree, unmount, MountFlags, MoveMountFlags, OpenTreeFlags, + UnmountFlags, }; fn make_tmpfs(dir: &str) -> Result<()> { @@ -160,5 +161,17 @@ pub fn mount_filesystems() -> Result<()> { make_tmpfs("/tmp/.X11-unix")?; } + // Mount /dev/shm separately with DAX enabled, to allow cross-domain shared memory + // /dev/shm is mounted by libkrunfw, so unmount it first + unmount("/dev/shm", UnmountFlags::empty()).context("Failed to unmount /dev/shm")?; + mount2( + Some("devshm"), + "/dev/shm", + Some("virtiofs"), + MountFlags::NOEXEC | MountFlags::NOSUID, + Some(c"dax"), + ) + .context("Failed to mount `/dev/shm`")?; + Ok(()) }