From 56569e2b8eccc0605803a24b901f8f63d5376899 Mon Sep 17 00:00:00 2001 From: "Hui, Chunyang" Date: Wed, 3 Nov 2021 11:14:06 +0000 Subject: [PATCH] Fix running user application with too many arguments Also fix the VM drop process when creating process failure --- src/libos/src/process/do_spawn/mod.rs | 7 ++++++- src/libos/src/vm/process_vm.rs | 13 +++++-------- src/libos/src/vm/vm_manager.rs | 4 ++-- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/libos/src/process/do_spawn/mod.rs b/src/libos/src/process/do_spawn/mod.rs index 5bea9812..000a2ef8 100644 --- a/src/libos/src/process/do_spawn/mod.rs +++ b/src/libos/src/process/do_spawn/mod.rs @@ -233,7 +233,12 @@ fn new_process_common( }; let user_stack_base = vm.get_stack_base(); let user_stack_limit = vm.get_stack_limit(); - let user_rsp = init_stack::do_init(user_stack_base, 4096, &argv, envp, &mut auxvec)?; + let init_stack_size = min( + max(vm.get_stack_range().size() >> 8, 4096), + vm.get_stack_range().size(), + ); // size in [4096, stack_range], by default 1/256 of stack range + let user_rsp = + init_stack::do_init(user_stack_base, init_stack_size, &argv, envp, &mut auxvec)?; unsafe { Task::new( ldso_entry, diff --git a/src/libos/src/vm/process_vm.rs b/src/libos/src/vm/process_vm.rs index 5988cfc5..6dbe4eca 100644 --- a/src/libos/src/vm/process_vm.rs +++ b/src/libos/src/vm/process_vm.rs @@ -269,15 +269,12 @@ impl Drop for ProcessVM { // // For the first case, the process VM is cleaned in the exit procedure and nothing is needed. For the second cases, mem_chunks is not empty and should // be cleaned here. + mem_chunks + .drain_filter(|chunk| chunk.is_single_vma()) + .for_each(|chunk| { + USER_SPACE_VM_MANAGER.internal().munmap_chunk(&chunk, None); + }); - // In the first case, the current is reset to idle thread - // In the second case, the current thread belongs to parent process - let current = current!(); - if current.tid() != 0 { - mem_chunks - .drain_filter(|chunk| chunk.is_single_vma()) - .for_each(|chunk| USER_SPACE_VM_MANAGER.free_chunk(&chunk)) - } assert!(mem_chunks.len() == 0); info!("Process VM dropped"); } diff --git a/src/libos/src/vm/vm_manager.rs b/src/libos/src/vm/vm_manager.rs index ecaca4b3..fb412fc8 100644 --- a/src/libos/src/vm/vm_manager.rs +++ b/src/libos/src/vm/vm_manager.rs @@ -38,7 +38,7 @@ impl VMManager { &self.range } - fn internal(&self) -> SgxMutexGuard { + pub fn internal(&self) -> SgxMutexGuard { self.internal.lock().unwrap() } @@ -505,7 +505,7 @@ impl VMManager { }); mem_chunks.clear(); - debug_assert!(mem_chunks.len() == 0); + assert!(mem_chunks.len() == 0); } }