[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH 5/8] lib/uksched: Revisit thread exiting logic
Hi Florian, Please see my comments inline. On 1/2/19 4:45 PM, Florian Schmidt wrote: > Hi Costin, > > On 9/18/18 5:27 PM, Costin Lupu wrote: >> We use a list for terminated threads on all schedulers because it >> keeps references to those threads until wait will be called for >> them. > > Just to make sure: your point is that since every scheduler will have to > keep track of terminated threads, we might as well put it into the main > uk_sched information instead of the private one, right? > That's right. >> >> Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx> >> --- >> lib/uksched/include/uk/sched.h | 1 + >> lib/uksched/include/uk/thread.h | 4 ++++ >> lib/uksched/sched.c | 7 ++++--- >> lib/ukschedcoop/schedcoop.c | 11 +++-------- >> 4 files changed, 12 insertions(+), 11 deletions(-) >> >> diff --git a/lib/uksched/include/uk/sched.h >> b/lib/uksched/include/uk/sched.h >> index 443dbf3..c3e2866 100644 >> --- a/lib/uksched/include/uk/sched.h >> +++ b/lib/uksched/include/uk/sched.h >> @@ -87,6 +87,7 @@ struct uk_sched { >> /* internal */ >> struct uk_thread idle; >> + struct uk_thread_list exited_threads; >> struct ukplat_ctx_callbacks plat_ctx_cbs; >> struct uk_alloc *allocator; >> struct uk_sched *next; >> diff --git a/lib/uksched/include/uk/thread.h >> b/lib/uksched/include/uk/thread.h >> index d28c458..7a1b630 100644 >> --- a/lib/uksched/include/uk/thread.h >> +++ b/lib/uksched/include/uk/thread.h >> @@ -87,11 +87,15 @@ struct uk_thread *uk_thread_current(void) >> } >> #define RUNNABLE_FLAG 0x00000001 >> +#define EXITED_FLAG 0x00000002 >> #define is_runnable(_thread) ((_thread)->flags & RUNNABLE_FLAG) >> #define set_runnable(_thread) ((_thread)->flags |= RUNNABLE_FLAG) >> #define clear_runnable(_thread) ((_thread)->flags &= ~RUNNABLE_FLAG) >> +#define is_exited(_thread) ((_thread)->flags & EXITED_FLAG) >> +#define set_exited(_thread) ((_thread)->flags |= EXITED_FLAG) >> + >> int uk_thread_init(struct uk_thread *thread, >> struct ukplat_ctx_callbacks *cbs, struct uk_alloc *allocator, >> const char *name, void *stack, >> diff --git a/lib/uksched/sched.c b/lib/uksched/sched.c >> index 968723c..c5b7c9f 100644 >> --- a/lib/uksched/sched.c >> +++ b/lib/uksched/sched.c >> @@ -122,6 +122,7 @@ struct uk_sched *uk_sched_create(struct uk_alloc >> *a, size_t prv_size) >> } >> sched->allocator = a; >> + UK_TAILQ_INIT(&sched->exited_threads); >> sched->prv = (void *) sched + sizeof(struct uk_sched); >> return sched; >> @@ -217,6 +218,9 @@ void uk_sched_thread_destroy(struct uk_sched >> *sched, struct uk_thread *thread) >> { >> UK_ASSERT(sched != NULL); >> UK_ASSERT(thread != NULL); >> + UK_ASSERT(is_exited(thread)); > > I don't like that this patch introduces an assertion on is_exited, but > never calls set_exited. This means that at this revision, any call to > uk_sched_thread_destroy will immediately crash with an assertion error. > That might be really nasty if we ever end up tracking a bug during > bisecting and end up with this revision. > > Instead, I suggest you introduce this UK_ASSERT when you introduce more > of the scheduling logic in the next patch ("Add support for waiting > threads"), because in general, it makes a lot of sense as an assertion. > You're right. Now if I think it over again, it would also make sense to swap these 2 commits ("Add support for waiting..." before "Revisit..."), in addition to your suggestions. >> + >> + UK_TAILQ_REMOVE(&sched->exited_threads, thread, thread_list); >> uk_free(sched->allocator, thread->sched_info); >> uk_thread_fini(thread, sched->allocator); >> @@ -238,9 +242,6 @@ void uk_sched_thread_exit(void) >> struct uk_thread *thread; >> thread = uk_thread_current(); >> - >> - uk_printd(DLVL_INFO, "Thread \"%s\" exited.\n", thread->name); >> - >> UK_ASSERT(thread->sched); >> uk_sched_thread_remove(thread->sched, thread); >> UK_CRASH("Error stopping thread."); >> diff --git a/lib/ukschedcoop/schedcoop.c b/lib/ukschedcoop/schedcoop.c >> index f616330..a2bf2ad 100644 >> --- a/lib/ukschedcoop/schedcoop.c >> +++ b/lib/ukschedcoop/schedcoop.c >> @@ -37,7 +37,6 @@ >> struct schedcoop_private { >> struct uk_thread_list thread_list; >> - struct uk_thread_list exited_threads; >> int threads_started; >> }; >> @@ -124,12 +123,9 @@ static void schedcoop_schedule(struct uk_sched *s) >> if (prev != next) >> uk_sched_thread_switch(s, prev, next); >> - UK_TAILQ_FOREACH_SAFE(thread, &prv->exited_threads, >> thread_list, tmp) { >> - if (thread != prev) { >> - UK_TAILQ_REMOVE(&prv->exited_threads, >> - thread, thread_list); >> + UK_TAILQ_FOREACH_SAFE(thread, &s->exited_threads, thread_list, >> tmp) { >> + if (thread != prev) >> uk_thread_destroy(thread); >> - } >> } >> } >> @@ -166,7 +162,7 @@ static void schedcoop_thread_remove(struct >> uk_sched *s, struct uk_thread *t) >> clear_runnable(t); >> /* Put onto exited list */ >> - UK_TAILQ_INSERT_HEAD(&prv->exited_threads, t, thread_list); >> + UK_TAILQ_INSERT_HEAD(&s->exited_threads, t, thread_list); >> ukplat_lcpu_restore_irqf(flags); >> @@ -211,7 +207,6 @@ struct uk_sched *uk_schedcoop_init(struct >> uk_alloc *a) >> ukplat_ctx_callbacks_init(&sched->plat_ctx_cbs, ukplat_ctx_sw); >> prv = sched->prv; >> - UK_TAILQ_INIT(&prv->exited_threads); >> UK_TAILQ_INIT(&prv->thread_list); >> prv->threads_started = 0; >> > _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |