Add "kernel_heap_monitor" feature
This commit is contained in:
		
							parent
							
								
									e48cc13f79
								
							
						
					
					
						commit
						2198d9e395
					
				
							
								
								
									
										6
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										6
									
								
								.github/workflows/main.yml
									
									
									
									
										vendored
									
									
								
							| @ -68,6 +68,12 @@ jobs: | ||||
|       if: ${{ failure() }} | ||||
|       run: docker exec ${{ github.job }} bash -c "cat /root/occlum/build/test/.fail" | ||||
| 
 | ||||
|     - name: Integration test with optional Occlum features | ||||
|       run: | | ||||
|         docker exec ${{ github.job }} bash -c 'source /opt/intel/sgxsdk/environment; cd /root/occlum; make clean && LIBOS_FEATURES="kernel_heap_monitor" make install' | ||||
|         docker exec ${{ github.job }} bash -c "cd /root/occlum; SGX_MODE=SIM make test-glibc" | ||||
|       shell: bash | ||||
| 
 | ||||
|   # Make_test_on_centos: | ||||
|   #   runs-on: ubuntu-18.04 | ||||
| 
 | ||||
|  | ||||
| @ -50,6 +50,7 @@ dcap = []               # DCAP support. The compilation relies on DCAP package. | ||||
| cov = ["sgx_cov"]       # Enable coverage colletcion. | ||||
| hyper_mode = []         # For running in hyper mode. | ||||
| pku = []                # PKU Support | ||||
| kernel_heap_monitor = []# Kernel heap usage tracking. With overhead. | ||||
| 
 | ||||
| [target.'cfg(not(target_env = "sgx"))'.dependencies] | ||||
| sgx_types = { path = "../../deps/rust-sgx-sdk/sgx_types" } | ||||
|  | ||||
| @ -45,7 +45,7 @@ LIBOS_LOG ?= error | ||||
| 
 | ||||
| LIBOS_SONAME := libocclum-libos.so.$(MAJOR_VER_NUM) | ||||
| 
 | ||||
| LIBOS_FEATURES := | ||||
| LIBOS_FEATURES := $(LIBOS_FEATURES) | ||||
| 
 | ||||
| ifeq ($(SGX_MODE), HW) | ||||
| 	LIBOS_CORE_LIB_NAME := occlum-libos-core | ||||
|  | ||||
| @ -1,4 +1,5 @@ | ||||
| use super::*; | ||||
| use crate::util::kernel_alloc::KernelAlloc; | ||||
| use crate::vm::USER_SPACE_VM_MANAGER; | ||||
| 
 | ||||
| pub struct MemInfoINode; | ||||
| @ -15,13 +16,26 @@ impl ProcINode for MemInfoINode { | ||||
|     fn generate_data_in_bytes(&self) -> vfs::Result<Vec<u8>> { | ||||
|         let total_ram = USER_SPACE_VM_MANAGER.get_total_size(); | ||||
|         let free_ram = USER_SPACE_VM_MANAGER.get_precise_free_size(); | ||||
|         let kernel_heap_total = KernelAlloc::get_kernel_heap_config(); | ||||
|         let kernel_heap_peak_used = KernelAlloc::get_kernel_heap_peak_used(); | ||||
|         let kernel_heap_in_use = if let Some(bytes) = KernelAlloc::get_kernel_mem_size() { | ||||
|             format!("{} kB", bytes / KB) | ||||
|         } else { | ||||
|             "Feature not enabled".to_string() | ||||
|         }; | ||||
|         Ok(format!( | ||||
|             "MemTotal:       {} kB\n\ | ||||
|              MemFree:        {} kB\n\ | ||||
|              MemAvailable:   {} kB\n",
 | ||||
|             "MemTotal:              {} kB\n\ | ||||
|              MemFree:               {} kB\n\ | ||||
|              MemAvailable:          {} kB\n\ | ||||
|              KernelHeapTotal:       {} kB\n\ | ||||
|              KernelHeapPeakUsed:    {} kB\n\ | ||||
|              KernelHeapInUse:       {}\n",
 | ||||
|             total_ram / KB, | ||||
|             free_ram / KB, | ||||
|             free_ram / KB, | ||||
|             kernel_heap_total / KB, | ||||
|             kernel_heap_peak_used / KB, | ||||
|             kernel_heap_in_use, | ||||
|         ) | ||||
|         .into_bytes()) | ||||
|     } | ||||
|  | ||||
							
								
								
									
										81
									
								
								src/libos/src/util/kernel_alloc.rs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										81
									
								
								src/libos/src/util/kernel_alloc.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,81 @@ | ||||
| use std::alloc::{GlobalAlloc, Layout, System}; | ||||
| use std::sync::atomic::{AtomicUsize, Ordering}; | ||||
| 
 | ||||
| // This file provides "KernelAlloc", a wrapper for sgx_std "System" allocator, is used as
 | ||||
| // the global allocator for Occlum kernel. Currently, this can provides the ability to
 | ||||
| // monitor the kernel heap usage.
 | ||||
| 
 | ||||
| pub struct KernelAlloc { | ||||
|     size: AtomicUsize, | ||||
| } | ||||
| 
 | ||||
| impl KernelAlloc { | ||||
|     pub fn get_kernel_mem_size() -> Option<usize> { | ||||
|         cfg_if! { | ||||
|             if #[cfg(feature = "kernel_heap_monitor")] { | ||||
|                 Some(ALLOC.size.load(Ordering::Relaxed)) | ||||
|             } else { | ||||
|                 None | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn get_kernel_heap_config() -> usize { | ||||
|         std::enclave::get_heap_size() | ||||
|     } | ||||
| 
 | ||||
|     pub fn get_kernel_heap_peak_used() -> usize { | ||||
|         sgx_trts::enclave::rsgx_get_peak_heap_used() | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| unsafe impl GlobalAlloc for KernelAlloc { | ||||
|     #[inline] | ||||
|     unsafe fn alloc(&self, layout: Layout) -> *mut u8 { | ||||
|         let ptr = System.alloc(layout); | ||||
|         if !ptr.is_null() { | ||||
|             self.size.fetch_add(layout.size(), Ordering::Relaxed); | ||||
|         } | ||||
| 
 | ||||
|         ptr | ||||
|     } | ||||
| 
 | ||||
|     #[inline] | ||||
|     unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { | ||||
|         let ptr = System.alloc_zeroed(layout); | ||||
|         if !ptr.is_null() { | ||||
|             self.size.fetch_add(layout.size(), Ordering::Relaxed); | ||||
|         } | ||||
| 
 | ||||
|         ptr | ||||
|     } | ||||
| 
 | ||||
|     #[inline] | ||||
|     unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { | ||||
|         System.dealloc(ptr, layout); | ||||
|         self.size.fetch_sub(layout.size(), Ordering::Relaxed); | ||||
|     } | ||||
| 
 | ||||
|     #[inline] | ||||
|     unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { | ||||
|         let ptr = System.realloc(ptr, layout, new_size); | ||||
|         if !ptr.is_null() { | ||||
|             let old_size = layout.size(); | ||||
|             if new_size > old_size { | ||||
|                 // grow
 | ||||
|                 self.size.fetch_add(new_size - old_size, Ordering::Relaxed); | ||||
|             } else if new_size < old_size { | ||||
|                 // shrink
 | ||||
|                 self.size.fetch_sub(old_size - new_size, Ordering::Relaxed); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         ptr | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[cfg(feature = "kernel_heap_monitor")] | ||||
| #[global_allocator] | ||||
| static ALLOC: KernelAlloc = KernelAlloc { | ||||
|     size: AtomicUsize::new(0), | ||||
| }; | ||||
| @ -3,6 +3,7 @@ use super::*; | ||||
| pub mod dirty; | ||||
| pub mod host_file_util; | ||||
| pub mod hosts_parser_util; | ||||
| pub mod kernel_alloc; | ||||
| pub mod log; | ||||
| pub mod mem_util; | ||||
| pub mod mpx_util; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user