diff --git a/include/osv/mmu-defs.hh b/include/osv/mmu-defs.hh index fd6a85a612..0fc69afc34 100644 --- a/include/osv/mmu-defs.hh +++ b/include/osv/mmu-defs.hh @@ -84,6 +84,7 @@ enum { mmap_small = 1ul << 5, mmap_jvm_balloon = 1ul << 6, mmap_file = 1ul << 7, + mmap_stack = 1ul << 8, }; enum { diff --git a/libc/mman.cc b/libc/mman.cc index 75a94eb0b4..115b031334 100644 --- a/libc/mman.cc +++ b/libc/mman.cc @@ -43,12 +43,7 @@ unsigned libc_flags_to_mmap(int flags) mmap_flags |= mmu::mmap_populate; } if (flags & MAP_STACK) { - // OSv currently requires that stacks be pinned (see issue #143). So - // if an application wants to mmap() a stack for pthread_attr_setstack - // and did us the courtesy of telling this to ue (via MAP_STACK), - // let's return the courtesy by returning pre-faulted memory. - // FIXME: If issue #143 is fixed, this workaround should be removed. - mmap_flags |= mmu::mmap_populate; + mmap_flags |= mmu::mmap_stack; } if (flags & MAP_SHARED) { mmap_flags |= mmu::mmap_shared; diff --git a/libc/pthread.cc b/libc/pthread.cc index cda6cf90e4..de5979e88d 100644 --- a/libc/pthread.cc +++ b/libc/pthread.cc @@ -141,7 +141,12 @@ namespace pthread_private { return {attr.stack_begin, attr.stack_size}; } size_t size = attr.stack_size; - void *addr = mmu::map_anon(nullptr, size, mmu::mmap_populate, mmu::perm_rw); +#if CONF_lazy_stack + unsigned stack_flags = mmu::mmap_stack; +#else + unsigned stack_flags = mmu::mmap_populate; +#endif + void *addr = mmu::map_anon(nullptr, size, stack_flags, mmu::perm_rw); mmu::mprotect(addr, attr.guard_size, 0); sched::thread::stack_info si{addr, size}; si.deleter = free_stack;