Refine System-V shared memory

This commit is contained in:
Hui, Chunyang 2023-09-18 11:37:41 +00:00 committed by volcano
parent d49b3af0aa
commit 50e4653e12
6 changed files with 28 additions and 11 deletions

@ -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};

@ -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<pid_t> {
&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<ChunkRef> {
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()
}

@ -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<isize> {
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<isize> {
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<isize> {
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<isize> {
} 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)
}

@ -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() {

@ -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;

@ -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;