UPDATE ports/plan9/plan9port MAP_STACK patch

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

UPDATE ports/plan9/plan9port MAP_STACK patch

Aaron Poffenberger
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 -0000
+++ patches/patch-src_libthread_thread_c 9 Mar 2018 22:14:13 -0000
@@ -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 -0000
+++ patches/patch-src_libthread_threadimpl_h 9 Mar 2018 21:41:25 -0000
@@ -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 <ucontext.h>
++#elif defined(__OpenBSD__)
++# include <sys/mman.h>
+ #endif
+ #include <sys/utsname.h>
+ #include "libc.h"

Reply | Threaded
Open this post in threaded view
|

Re: UPDATE ports/plan9/plan9port MAP_STACK patch

Gleydson Soares-3
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
--- Makefile 20 Jan 2018 03:29:56 -0000 1.24
+++ Makefile 10 Mar 2018 16:34:49 -0000
@@ -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 -0000
+++ patches/patch-src_libthread_thread_c 10 Mar 2018 16:34:49 -0000
@@ -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 -0000
+++ patches/patch-src_libthread_threadimpl_h 10 Mar 2018 16:34:49 -0000
@@ -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 <ucontext.h>
++#elif defined(__OpenBSD__)
++# include <sys/mman.h>
+ #endif
+ #include <sys/utsname.h>
+ #include "libc.h"
Reply | Threaded
Open this post in threaded view
|

Re: UPDATE ports/plan9/plan9port MAP_STACK patch

rob-3
In reply to this post by Aaron Poffenberger
> 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

Reply | Threaded
Open this post in threaded view
|

Re: UPDATE ports/plan9/plan9port MAP_STACK patch

Aaron Poffenberger
In reply to this post by Gleydson Soares-3
* Gleydson Soares <[hidden email]> [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


plan9port_map_stack.diff (2K) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: UPDATE ports/plan9/plan9port MAP_STACK patch

Gleydson Soares-5
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
--- Makefile 20 Jan 2018 03:29:56 -0000 1.24
+++ Makefile 21 Mar 2018 02:02:26 -0000
@@ -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 -0000
+++ patches/patch-src_libthread_thread_c 21 Mar 2018 02:02:26 -0000
@@ -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(&threadidref);
+ //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 -0000
+++ patches/patch-src_libthread_threadimpl_h 21 Mar 2018 02:02:26 -0000
@@ -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 <ucontext.h>
++#elif defined(__OpenBSD__)
++# include <sys/mman.h>
+ #endif
+ #include <sys/utsname.h>
+ #include "libc.h"