From 50e4653e123d28c4f21422e41e3326426578d9d5 Mon Sep 17 00:00:00 2001 From: "Hui, Chunyang" Date: Mon, 18 Sep 2023 11:37:41 +0000 Subject: [PATCH] Refine System-V shared memory --- src/libos/src/ipc/mod.rs | 2 +- src/libos/src/ipc/shm.rs | 21 +++++++++++++++++++-- src/libos/src/ipc/syscalls.rs | 10 +++++----- src/libos/src/process/do_exit.rs | 4 ++-- src/libos/src/vm/process_vm.rs | 1 - src/libos/src/vm/vm_manager.rs | 1 + 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/libos/src/ipc/mod.rs b/src/libos/src/ipc/mod.rs index 0a00f5a9..596cc9b0 100644 --- a/src/libos/src/ipc/mod.rs +++ b/src/libos/src/ipc/mod.rs @@ -3,5 +3,5 @@ use super::*; mod shm; mod syscalls; -pub use self::shm::{key_t, shmids_t, SHM_MANAGER}; +pub use self::shm::{key_t, shmids_t, SYSTEM_V_SHM_MANAGER}; pub use self::syscalls::{do_shmat, do_shmctl, do_shmdt, do_shmget}; diff --git a/src/libos/src/ipc/shm.rs b/src/libos/src/ipc/shm.rs index 35bfab9e..b8974ea4 100644 --- a/src/libos/src/ipc/shm.rs +++ b/src/libos/src/ipc/shm.rs @@ -144,7 +144,6 @@ impl ShmSegment { .size(size) // Currently, Occlum only support shared memory segment with rw permission .perms(VMPerms::READ | VMPerms::WRITE) - .initializer(VMInitializer::FillZeros()) .build()?; let chunk = USER_SPACE_VM_MANAGER.internal().mmap_chunk(&vm_option)?; @@ -204,6 +203,14 @@ impl ShmSegment { self.process_set.remove(&pid); Ok(()) } + + fn chunk(&self) -> &ChunkRef { + &self.chunk + } + + fn process_set(&self) -> &HashSet { + &self.process_set + } } impl Drop for ShmSegment { @@ -265,7 +272,7 @@ impl ShmIdManager { } lazy_static! { - pub static ref SHM_MANAGER: ShmManager = ShmManager::new(); + pub static ref SYSTEM_V_SHM_MANAGER: ShmManager = ShmManager::new(); } #[derive(Debug)] @@ -282,6 +289,16 @@ impl ShmManager { } } + pub fn get_shm_chunk_containing_addr(&self, addr: usize, pid: pid_t) -> Option { + let shm_segments = self.shm_segments.read().unwrap(); + shm_segments + .iter() + .find(|(_, shm_segment)| { + shm_segment.chunk().range().contains(addr) && shm_segment.process_set.contains(&pid) + }) + .map(|(_, shm_segment)| shm_segment.chunk().clone()) + } + fn current_time() -> time_t { do_gettimeofday().sec() } diff --git a/src/libos/src/ipc/syscalls.rs b/src/libos/src/ipc/syscalls.rs index c8cfbb44..2d3f4ec8 100644 --- a/src/libos/src/ipc/syscalls.rs +++ b/src/libos/src/ipc/syscalls.rs @@ -2,24 +2,24 @@ use super::*; use util::mem_util::from_user; -use super::shm::{shmids_t, CmdId, ShmFlags, ShmId, SHM_MANAGER}; +use super::shm::{shmids_t, CmdId, ShmFlags, ShmId, SYSTEM_V_SHM_MANAGER}; pub fn do_shmget(key: key_t, size: size_t, shmflg: i32) -> Result { let shmflg = ShmFlags::from_bits(shmflg as u32).ok_or_else(|| errno!(EINVAL, "invalid flags"))?; - let shmid = SHM_MANAGER.do_shmget(key, size, shmflg)?; + let shmid = SYSTEM_V_SHM_MANAGER.do_shmget(key, size, shmflg)?; Ok(shmid as isize) } pub fn do_shmat(shmid: i32, shmaddr: usize, shmflg: i32) -> Result { let shmflg = ShmFlags::from_bits(shmflg as u32).ok_or_else(|| errno!(EINVAL, "invalid flags"))?; - let addr = SHM_MANAGER.do_shmat(shmid as ShmId, shmaddr, shmflg)?; + let addr = SYSTEM_V_SHM_MANAGER.do_shmat(shmid as ShmId, shmaddr, shmflg)?; Ok(addr as isize) } pub fn do_shmdt(shmaddr: usize) -> Result { - SHM_MANAGER.do_shmdt(shmaddr)?; + SYSTEM_V_SHM_MANAGER.do_shmdt(shmaddr)?; Ok(0) } @@ -31,6 +31,6 @@ pub fn do_shmctl(shmid: i32, cmd: i32, buf_u: *mut shmids_t) -> Result { } else { None }; - SHM_MANAGER.do_shmctl(shmid as ShmId, cmd as CmdId, buf)?; + SYSTEM_V_SHM_MANAGER.do_shmctl(shmid as ShmId, cmd as CmdId, buf)?; Ok(0) } diff --git a/src/libos/src/process/do_exit.rs b/src/libos/src/process/do_exit.rs index 43f12827..e20c2744 100644 --- a/src/libos/src/process/do_exit.rs +++ b/src/libos/src/process/do_exit.rs @@ -7,7 +7,7 @@ use super::do_vfork::{is_vforked_child_process, vfork_return_to_parent}; use super::pgrp::clean_pgrp_when_exit; use super::process::{Process, ProcessFilter}; use super::{table, ProcessRef, TermStatus, ThreadRef, ThreadStatus}; -use crate::ipc::SHM_MANAGER; +use crate::ipc::SYSTEM_V_SHM_MANAGER; use crate::prelude::*; use crate::signal::{KernelSignal, SigNum}; use crate::syscall::CpuContext; @@ -120,7 +120,7 @@ fn exit_process(thread: &ThreadRef, term_status: TermStatus) { let mut process_inner = process.inner(); // Clean used VM USER_SPACE_VM_MANAGER.free_chunks_when_exit(thread); - SHM_MANAGER.detach_shm_when_process_exit(thread); + SYSTEM_V_SHM_MANAGER.detach_shm_when_process_exit(thread); // The parent is the idle process if parent_inner.is_none() { diff --git a/src/libos/src/vm/process_vm.rs b/src/libos/src/vm/process_vm.rs index b7d32974..06d4125a 100644 --- a/src/libos/src/vm/process_vm.rs +++ b/src/libos/src/vm/process_vm.rs @@ -10,7 +10,6 @@ use super::vm_util::{ VMRemapOptions, }; use crate::config; -use crate::ipc::SHM_MANAGER; use crate::process::elf_file::{ElfFile, ProgramHeaderExt}; use crate::util::sync::rw_lock::RwLockWriteGuard; diff --git a/src/libos/src/vm/vm_manager.rs b/src/libos/src/vm/vm_manager.rs index e1a644e0..38ee6e4d 100644 --- a/src/libos/src/vm/vm_manager.rs +++ b/src/libos/src/vm/vm_manager.rs @@ -9,6 +9,7 @@ use super::vm_area::{VMAccess, VMArea}; use super::vm_chunk_manager::ChunkManager; use super::vm_perms::VMPerms; use super::vm_util::*; +use crate::ipc::SYSTEM_V_SHM_MANAGER; use crate::process::{ThreadRef, ThreadStatus}; use std::collections::BTreeSet;