Re: UPDATE ports/plan9/plan9port MAP_STACK patch
rather than allocating memory for _Thread struct and stack together, this diff[1] changes the allocation by pulling apart the stack of the thread_t struct, so now only the stack segment has the MAP_STACK flag for passing stack-register checking. tested on amd64(MAP_STACK bits in). acme(1)/sam(1) works fine! [1] http://shutpandhack.org/~gsoares/plan9port_map_stack.diff Index: Makefile === RCS file: /cvs/ports/plan9/plan9port/Makefile,v retrieving revision 1.24 diff -u -p -r1.24 Makefile --- Makefile20 Jan 2018 03:29:56 - 1.24 +++ Makefile21 Mar 2018 02:02:26 - @@ -4,6 +4,7 @@ ONLY_FOR_ARCHS =amd64 i386 powerpc BROKEN-powerpc = threading issues COMMENT = Plan 9 from user space +REVISION = 0 DISTNAME = plan9port-20180117 Index: patches/patch-src_libthread_thread_c === RCS file: patches/patch-src_libthread_thread_c diff -N patches/patch-src_libthread_thread_c --- /dev/null 1 Jan 1970 00:00:00 - +++ patches/patch-src_libthread_thread_c21 Mar 2018 02:02:26 - @@ -0,0 +1,46 @@ +$OpenBSD$ + +Index: src/libthread/thread.c +--- src/libthread/thread.c.orig src/libthread/thread.c +@@ -107,12 +107,18 @@ threadalloc(void (*fn)(void*), void *arg, uint stack) + uint x, y; + ulong z; + +- /* allocate the task and stack together */ +- t = malloc(sizeof *t+stack); ++ /* allocate the task */ ++ t = malloc(sizeof *t); + if(t == nil) + sysfatal("threadalloc malloc: %r"); + memset(t, 0, sizeof *t); +- t->stk = (uchar*)(t+1); ++ /* allocate the real stack */ ++ t->stk = mmap(NULL, stack, PROT_READ | PROT_WRITE, ++ MAP_PRIVATE | MAP_ANON | MAP_STACK, -1, 0); ++ if (t->stk == MAP_FAILED) { ++ free(t); ++ sysfatal("threadalloc malloc: %r"); ++ } + t->stksize = stack; + t->id = incref(); + //print("fn=%p arg=%p\n", fn, arg); +@@ -133,8 +139,8 @@ threadalloc(void (*fn)(void*), void *arg, uint stack) + + /* call makecontext to do the real work. */ + /* leave a few words open on both ends */ +- t->context.uc.uc_stack.ss_sp = (void*)(t->stk+8); +- t->context.uc.uc_stack.ss_size = t->stksize-64; ++ t->context.uc.uc_stack.ss_sp = t->stk; ++ t->context.uc.uc_stack.ss_size = t->stksize; + #if defined(__sun__) && !defined(__MAKECONTEXT_V2_SOURCE) /* sigh */ + /* can avoid this with __MAKECONTEXT_V2_SOURCE but only on SunOS 5.9 */ + t->context.uc.uc_stack.ss_sp = +@@ -364,6 +370,7 @@ procscheduler(Proc *p) + delthreadinproc(p, t); + p->nthread--; + /*print("nthread %d\n", p->nthread); */ ++ munmap(t->stk, t->stksize); + free(t); + } + } Index: patches/patch-src_libthread_threadimpl_h === RCS file: patches/patch-src_libthread_threadimpl_h diff -N patches/patch-src_libthread_threadimpl_h --- /dev/null 1 Jan 1970 00:00:00 - +++ patches/patch-src_libthread_threadimpl_h21 Mar 2018 02:02:26 - @@ -0,0 +1,14 @@ +$OpenBSD$ + +Index: src/libthread/threadimpl.h +--- src/libthread/threadimpl.h.orig src/libthread/threadimpl.h +@@ -10,6 +10,8 @@ + # define _XOPEN_SOURCE/* for Snow Leopard */ + # endif + # include ++#elif defined(__OpenBSD__) ++# include + #endif + #include + #include "libc.h"
Re: UPDATE ports/plan9/plan9port MAP_STACK patch
* Gleydson Soares[2018-03-10 13:45:08 -0300]: > On Fri, Mar 09, 2018 at 06:42:25PM -0600, Aaron Poffenberger wrote: > > This patch updates libthread in plan9port to be MAP_STACK compliant, > > replacing calls to malloc/free with mmap and munmap when allocating > > thread stacks. > > > > The most obvious effect was sam(1), acme(1), and 9term(1) would > > core when executed. All three run now with seemingly no issues. > > > > There maybe other problems I haven't noticed yet. > > it's missing a revision bump, apart from that, your diff looks good for > me. thanks for looking into this, Looks like I implemented a memory leak. I meant to put sizeof *t, but left it off. Thanks to Bryan for pinging me on it. Revised patch follows. --Aaron Index: Makefile === RCS file: /cvs/ports/plan9/plan9port/Makefile,v retrieving revision 1.24 diff -u -p -r1.24 Makefile --- Makefile20 Jan 2018 03:29:56 - 1.24 +++ Makefile10 Mar 2018 16:34:49 - @@ -6,6 +6,7 @@ BROKEN-powerpc =threading issues COMMENT = Plan 9 from user space DISTNAME = plan9port-20180117 +REVISION = 0 GH_ACCOUNT = 9fans GH_PROJECT = plan9port Index: patches/patch-src_libthread_thread_c === RCS file: patches/patch-src_libthread_thread_c diff -N patches/patch-src_libthread_thread_c --- /dev/null 1 Jan 1970 00:00:00 - +++ patches/patch-src_libthread_thread_c10 Mar 2018 16:34:49 - @@ -0,0 +1,26 @@ +$OpenBSD$ + +Index: src/libthread/thread.c +--- src/libthread/thread.c.orig src/libthread/thread.c +@@ -108,8 +108,9 @@ threadalloc(void (*fn)(void*), void *arg, uint stack) + ulong z; + + /* allocate the task and stack together */ +- t = malloc(sizeof *t+stack); +- if(t == nil) ++ t = mmap(0, sizeof *t+stack, PROT_READ|PROT_WRITE, ++ MAP_PRIVATE|MAP_ANON|MAP_STACK, -1, 0); ++ if(t == MAP_FAILED) + sysfatal("threadalloc malloc: %r"); + memset(t, 0, sizeof *t); + t->stk = (uchar*)(t+1); +@@ -364,7 +365,7 @@ procscheduler(Proc *p) + delthreadinproc(p, t); + p->nthread--; + /*print("nthread %d\n", p->nthread); */ +- free(t); ++ munmap(t, sizeof *t+t->stksize); + } + } + Index: patches/patch-src_libthread_threadimpl_h === RCS file: patches/patch-src_libthread_threadimpl_h diff -N patches/patch-src_libthread_threadimpl_h --- /dev/null 1 Jan 1970 00:00:00 - +++ patches/patch-src_libthread_threadimpl_h10 Mar 2018 16:34:49 - @@ -0,0 +1,14 @@ +$OpenBSD$ + +Index: src/libthread/threadimpl.h +--- src/libthread/threadimpl.h.orig src/libthread/threadimpl.h +@@ -10,6 +10,8 @@ + # define _XOPEN_SOURCE/* for Snow Leopard */ + # endif + # include ++#elif defined(__OpenBSD__) ++# include + #endif + #include + #include "libc.h"
Re: UPDATE ports/plan9/plan9port MAP_STACK patch
> This patch updates libthread in plan9port to be MAP_STACK compliant, > replacing calls to malloc/free with mmap and munmap when allocating > thread stacks. Thanks for this, Aaron! It got those programs from plan9port working again for me here. Best, Rob
Re: UPDATE ports/plan9/plan9port MAP_STACK patch
On Fri, Mar 09, 2018 at 06:42:25PM -0600, Aaron Poffenberger wrote: > This patch updates libthread in plan9port to be MAP_STACK compliant, > replacing calls to malloc/free with mmap and munmap when allocating > thread stacks. > > The most obvious effect was sam(1), acme(1), and 9term(1) would > core when executed. All three run now with seemingly no issues. > > There maybe other problems I haven't noticed yet. it's missing a revision bump, apart from that, your diff looks good for me. thanks for looking into this, Index: Makefile === RCS file: /cvs/ports/plan9/plan9port/Makefile,v retrieving revision 1.24 diff -u -p -r1.24 Makefile --- Makefile20 Jan 2018 03:29:56 - 1.24 +++ Makefile10 Mar 2018 16:34:49 - @@ -6,6 +6,7 @@ BROKEN-powerpc =threading issues COMMENT = Plan 9 from user space DISTNAME = plan9port-20180117 +REVISION = 0 GH_ACCOUNT = 9fans GH_PROJECT = plan9port Index: patches/patch-src_libthread_thread_c === RCS file: patches/patch-src_libthread_thread_c diff -N patches/patch-src_libthread_thread_c --- /dev/null 1 Jan 1970 00:00:00 - +++ patches/patch-src_libthread_thread_c10 Mar 2018 16:34:49 - @@ -0,0 +1,26 @@ +$OpenBSD$ + +Index: src/libthread/thread.c +--- src/libthread/thread.c.orig src/libthread/thread.c +@@ -108,8 +108,9 @@ threadalloc(void (*fn)(void*), void *arg, uint stack) + ulong z; + + /* allocate the task and stack together */ +- t = malloc(sizeof *t+stack); +- if(t == nil) ++ t = mmap(0, sizeof *t+stack, PROT_READ|PROT_WRITE, ++ MAP_PRIVATE|MAP_ANON|MAP_STACK, -1, 0); ++ if(t == MAP_FAILED) + sysfatal("threadalloc malloc: %r"); + memset(t, 0, sizeof *t); + t->stk = (uchar*)(t+1); +@@ -364,7 +365,7 @@ procscheduler(Proc *p) + delthreadinproc(p, t); + p->nthread--; + /*print("nthread %d\n", p->nthread); */ +- free(t); ++ munmap(t, t->stksize); + } + } + Index: patches/patch-src_libthread_threadimpl_h === RCS file: patches/patch-src_libthread_threadimpl_h diff -N patches/patch-src_libthread_threadimpl_h --- /dev/null 1 Jan 1970 00:00:00 - +++ patches/patch-src_libthread_threadimpl_h10 Mar 2018 16:34:49 - @@ -0,0 +1,14 @@ +$OpenBSD$ + +Index: src/libthread/threadimpl.h +--- src/libthread/threadimpl.h.orig src/libthread/threadimpl.h +@@ -10,6 +10,8 @@ + # define _XOPEN_SOURCE/* for Snow Leopard */ + # endif + # include ++#elif defined(__OpenBSD__) ++# include + #endif + #include + #include "libc.h"
UPDATE ports/plan9/plan9port MAP_STACK patch
This patch updates libthread in plan9port to be MAP_STACK compliant, replacing calls to malloc/free with mmap and munmap when allocating thread stacks. The most obvious effect was sam(1), acme(1), and 9term(1) would core when executed. All three run now with seemingly no issues. There maybe other problems I haven't noticed yet. --Aaron Index: patches/patch-src_libthread_thread_c === RCS file: patches/patch-src_libthread_thread_c diff -N patches/patch-src_libthread_thread_c --- /dev/null 1 Jan 1970 00:00:00 - +++ patches/patch-src_libthread_thread_c9 Mar 2018 22:14:13 - @@ -0,0 +1,26 @@ +$OpenBSD$ + +Index: src/libthread/thread.c +--- src/libthread/thread.c.orig src/libthread/thread.c +@@ -108,8 +108,9 @@ threadalloc(void (*fn)(void*), void *arg, uint stack) + ulong z; + + /* allocate the task and stack together */ +- t = malloc(sizeof *t+stack); +- if(t == nil) ++ t = mmap(0, sizeof *t+stack, PROT_READ|PROT_WRITE, ++ MAP_PRIVATE|MAP_ANON|MAP_STACK, -1, 0); ++ if(t == MAP_FAILED) + sysfatal("threadalloc malloc: %r"); + memset(t, 0, sizeof *t); + t->stk = (uchar*)(t+1); +@@ -364,7 +365,7 @@ procscheduler(Proc *p) + delthreadinproc(p, t); + p->nthread--; + /*print("nthread %d\n", p->nthread); */ +- free(t); ++ munmap(t, t->stksize); + } + } + Index: patches/patch-src_libthread_threadimpl_h === RCS file: patches/patch-src_libthread_threadimpl_h diff -N patches/patch-src_libthread_threadimpl_h --- /dev/null 1 Jan 1970 00:00:00 - +++ patches/patch-src_libthread_threadimpl_h9 Mar 2018 21:41:25 - @@ -0,0 +1,14 @@ +$OpenBSD$ + +Index: src/libthread/threadimpl.h +--- src/libthread/threadimpl.h.orig src/libthread/threadimpl.h +@@ -10,6 +10,8 @@ + # define _XOPEN_SOURCE/* for Snow Leopard */ + # endif + # include ++#elif defined(__OpenBSD__) ++# include + #endif + #include + #include "libc.h"