Refine System-V shared memory
This commit is contained in:
		
							parent
							
								
									d49b3af0aa
								
							
						
					
					
						commit
						50e4653e12
					
				| @ -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; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user