Uthreads need to be aligned when allocated
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 18 Apr 2013 22:45:24 +0000 (15:45 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 18 Apr 2013 22:45:24 +0000 (15:45 -0700)
All threading libraries need to force alignment with posix_memalign,
since the ancillary state requires greater than 8 byte alignment.

user/c3po/threads/ucontext.c
user/parlib/uthread.c
user/pthread/pthread.c

index ebc9870..b602c32 100644 (file)
@@ -14,6 +14,7 @@ struct u_context* create_context(thread_t *t, void *entry_pt, void *stack_top)
        uint32_t vcoreid = vcore_id();
 
        /* Allocate a new context struct */
        uint32_t vcoreid = vcore_id();
 
        /* Allocate a new context struct */
+       /* TODO: careful of alignment here */
        struct u_context *uc = malloc(sizeof(struct u_context));
        if(!uc) return NULL;
 
        struct u_context *uc = malloc(sizeof(struct u_context));
        if(!uc) return NULL;
 
index 2047c64..d3655f5 100644 (file)
@@ -4,6 +4,7 @@
 #include <vcore.h>
 #include <uthread.h>
 #include <event.h>
 #include <vcore.h>
 #include <uthread.h>
 #include <event.h>
+#include <stdlib.h>
 
 /* Which operations we'll call for the 2LS.  Will change a bit with Lithe.  For
  * now, there are no defaults.  2LSs can override sched_ops. */
 
 /* Which operations we'll call for the 2LS.  Will change a bit with Lithe.  For
  * now, there are no defaults.  2LSs can override sched_ops. */
@@ -109,7 +110,11 @@ static void scp_vcctx_ready(void)
  * vcore/2LS/uthread init. */
 void uthread_slim_init(void)
 {
  * vcore/2LS/uthread init. */
 void uthread_slim_init(void)
 {
-       struct uthread *uthread = malloc(sizeof(*uthread));
+       struct uthread *uthread;
+       int ret = posix_memalign((void**)&uthread, __alignof__(struct uthread),
+                                sizeof(struct uthread));
+       assert(!ret);
+       memset(uthread, 0, sizeof(struct uthread));     /* aggressively 0 for bugs */
        /* TODO: consider a vcore_init_vc0 call. */
        vcore_init();
        uthread_manage_thread0(uthread);
        /* TODO: consider a vcore_init_vc0 call. */
        vcore_init();
        uthread_manage_thread0(uthread);
index f7fa6e3..722636b 100644 (file)
@@ -327,6 +327,8 @@ int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize)
 void pthread_lib_init(void)
 {
        uintptr_t mmap_block;
 void pthread_lib_init(void)
 {
        uintptr_t mmap_block;
+       struct pthread_tcb *t;
+       int ret;
        /* Some testing code might call this more than once (once for a slimmed down
         * pth 2LS, and another from pthread_create().  Also, this is racy, but the
         * first time through we are an SCP. */
        /* Some testing code might call this more than once (once for a slimmed down
         * pth 2LS, and another from pthread_create().  Also, this is racy, but the
         * first time through we are an SCP. */
@@ -334,8 +336,10 @@ void pthread_lib_init(void)
        assert(!in_multi_mode());
        mcs_pdr_init(&queue_lock);
        /* Create a pthread_tcb for the main thread */
        assert(!in_multi_mode());
        mcs_pdr_init(&queue_lock);
        /* Create a pthread_tcb for the main thread */
-       pthread_t t = (pthread_t)calloc(1, sizeof(struct pthread_tcb));
-       assert(t);
+       ret = posix_memalign((void**)&t, __alignof__(struct pthread_tcb),
+                            sizeof(struct pthread_tcb));
+       assert(!ret);
+       memset(t, 0, sizeof(struct pthread_tcb));       /* aggressively 0 for bugs */
        t->id = get_next_pid();
        t->stacksize = USTACK_NUM_PAGES * PGSIZE;
        t->stacktop = (void*)USTACKTOP;
        t->id = get_next_pid();
        t->stacksize = USTACK_NUM_PAGES * PGSIZE;
        t->stacktop = (void*)USTACKTOP;
@@ -412,8 +416,10 @@ int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
        run_once(pthread_lib_init());
        /* Create the actual thread */
        struct pthread_tcb *pthread;
        run_once(pthread_lib_init());
        /* Create the actual thread */
        struct pthread_tcb *pthread;
-       pthread = (pthread_t)calloc(1, sizeof(struct pthread_tcb));
-       assert(pthread);
+       int ret = posix_memalign((void**)&pthread, __alignof__(struct pthread_tcb),
+                                sizeof(struct pthread_tcb));
+       assert(!ret);
+       memset(pthread, 0, sizeof(struct pthread_tcb)); /* aggressively 0 for bugs*/
        pthread->stacksize = PTHREAD_STACK_SIZE;        /* default */
        pthread->state = PTH_CREATED;
        pthread->id = get_next_pid();
        pthread->stacksize = PTHREAD_STACK_SIZE;        /* default */
        pthread->state = PTH_CREATED;
        pthread->id = get_next_pid();