Refine System-V shared memory
This commit is contained in:
parent
d49b3af0aa
commit
50e4653e12
@ -3,5 +3,5 @@ use super::*;
|
|||||||
mod shm;
|
mod shm;
|
||||||
mod syscalls;
|
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};
|
pub use self::syscalls::{do_shmat, do_shmctl, do_shmdt, do_shmget};
|
||||||
|
@ -144,7 +144,6 @@ impl ShmSegment {
|
|||||||
.size(size)
|
.size(size)
|
||||||
// Currently, Occlum only support shared memory segment with rw permission
|
// Currently, Occlum only support shared memory segment with rw permission
|
||||||
.perms(VMPerms::READ | VMPerms::WRITE)
|
.perms(VMPerms::READ | VMPerms::WRITE)
|
||||||
.initializer(VMInitializer::FillZeros())
|
|
||||||
.build()?;
|
.build()?;
|
||||||
let chunk = USER_SPACE_VM_MANAGER.internal().mmap_chunk(&vm_option)?;
|
let chunk = USER_SPACE_VM_MANAGER.internal().mmap_chunk(&vm_option)?;
|
||||||
|
|
||||||
@ -204,6 +203,14 @@ impl ShmSegment {
|
|||||||
self.process_set.remove(&pid);
|
self.process_set.remove(&pid);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn chunk(&self) -> &ChunkRef {
|
||||||
|
&self.chunk
|
||||||
|
}
|
||||||
|
|
||||||
|
fn process_set(&self) -> &HashSet<pid_t> {
|
||||||
|
&self.process_set
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for ShmSegment {
|
impl Drop for ShmSegment {
|
||||||
@ -265,7 +272,7 @@ impl ShmIdManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
pub static ref SHM_MANAGER: ShmManager = ShmManager::new();
|
pub static ref SYSTEM_V_SHM_MANAGER: ShmManager = ShmManager::new();
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[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 {
|
fn current_time() -> time_t {
|
||||||
do_gettimeofday().sec()
|
do_gettimeofday().sec()
|
||||||
}
|
}
|
||||||
|
@ -2,24 +2,24 @@ use super::*;
|
|||||||
|
|
||||||
use util::mem_util::from_user;
|
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> {
|
pub fn do_shmget(key: key_t, size: size_t, shmflg: i32) -> Result<isize> {
|
||||||
let shmflg =
|
let shmflg =
|
||||||
ShmFlags::from_bits(shmflg as u32).ok_or_else(|| errno!(EINVAL, "invalid flags"))?;
|
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)
|
Ok(shmid as isize)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn do_shmat(shmid: i32, shmaddr: usize, shmflg: i32) -> Result<isize> {
|
pub fn do_shmat(shmid: i32, shmaddr: usize, shmflg: i32) -> Result<isize> {
|
||||||
let shmflg =
|
let shmflg =
|
||||||
ShmFlags::from_bits(shmflg as u32).ok_or_else(|| errno!(EINVAL, "invalid flags"))?;
|
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)
|
Ok(addr as isize)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn do_shmdt(shmaddr: usize) -> Result<isize> {
|
pub fn do_shmdt(shmaddr: usize) -> Result<isize> {
|
||||||
SHM_MANAGER.do_shmdt(shmaddr)?;
|
SYSTEM_V_SHM_MANAGER.do_shmdt(shmaddr)?;
|
||||||
Ok(0)
|
Ok(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,6 +31,6 @@ pub fn do_shmctl(shmid: i32, cmd: i32, buf_u: *mut shmids_t) -> Result<isize> {
|
|||||||
} else {
|
} else {
|
||||||
None
|
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)
|
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::pgrp::clean_pgrp_when_exit;
|
||||||
use super::process::{Process, ProcessFilter};
|
use super::process::{Process, ProcessFilter};
|
||||||
use super::{table, ProcessRef, TermStatus, ThreadRef, ThreadStatus};
|
use super::{table, ProcessRef, TermStatus, ThreadRef, ThreadStatus};
|
||||||
use crate::ipc::SHM_MANAGER;
|
use crate::ipc::SYSTEM_V_SHM_MANAGER;
|
||||||
use crate::prelude::*;
|
use crate::prelude::*;
|
||||||
use crate::signal::{KernelSignal, SigNum};
|
use crate::signal::{KernelSignal, SigNum};
|
||||||
use crate::syscall::CpuContext;
|
use crate::syscall::CpuContext;
|
||||||
@ -120,7 +120,7 @@ fn exit_process(thread: &ThreadRef, term_status: TermStatus) {
|
|||||||
let mut process_inner = process.inner();
|
let mut process_inner = process.inner();
|
||||||
// Clean used VM
|
// Clean used VM
|
||||||
USER_SPACE_VM_MANAGER.free_chunks_when_exit(thread);
|
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
|
// The parent is the idle process
|
||||||
if parent_inner.is_none() {
|
if parent_inner.is_none() {
|
||||||
|
@ -10,7 +10,6 @@ use super::vm_util::{
|
|||||||
VMRemapOptions,
|
VMRemapOptions,
|
||||||
};
|
};
|
||||||
use crate::config;
|
use crate::config;
|
||||||
use crate::ipc::SHM_MANAGER;
|
|
||||||
use crate::process::elf_file::{ElfFile, ProgramHeaderExt};
|
use crate::process::elf_file::{ElfFile, ProgramHeaderExt};
|
||||||
use crate::util::sync::rw_lock::RwLockWriteGuard;
|
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_chunk_manager::ChunkManager;
|
||||||
use super::vm_perms::VMPerms;
|
use super::vm_perms::VMPerms;
|
||||||
use super::vm_util::*;
|
use super::vm_util::*;
|
||||||
|
use crate::ipc::SYSTEM_V_SHM_MANAGER;
|
||||||
use crate::process::{ThreadRef, ThreadStatus};
|
use crate::process::{ThreadRef, ThreadStatus};
|
||||||
|
|
||||||
use std::collections::BTreeSet;
|
use std::collections::BTreeSet;
|
||||||
|
Loading…
Reference in New Issue
Block a user