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