[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Minios-devel] [UNIKRAFT PATCH 4/8] lib/uksched: Introduce thread info



Hi,


>Thread behaviors can be configured by using thread attributes. For
>keeping this information, we introduce the thread info abstraction.
>Schedulers should extend this abstraction when adding custom
>configuration features.

s/behaviors/behavior
s/For keeping/To keep

Perhaps add a sentence or two more to explain what “extend” means, e.g.,
should a scheduler use thread_info_base_create or thread_info_base_init?

>Signed-off-by: Costin Lupu <costin.lupu@xxxxxxxxx>
>---
> lib/uksched/Makefile.uk               |  1 +
> lib/uksched/exportsyms.uk             |  3 ++
> lib/uksched/include/uk/_thread_info.h | 57 +++++++++++++++++++++++++
> lib/uksched/include/uk/sched.h        |  6 +--
> lib/uksched/include/uk/thread.h       |  1 +
> lib/uksched/sched.c                   |  8 +++-
> lib/uksched/thread.c                  |  2 +
> lib/uksched/thread_info.c             | 79
>+++++++++++++++++++++++++++++++++++
> lib/ukschedcoop/schedcoop.c           | 13 +++++-
> 9 files changed, 164 insertions(+), 6 deletions(-)
> create mode 100644 lib/uksched/include/uk/_thread_info.h
> create mode 100644 lib/uksched/thread_info.c
>
>diff --git a/lib/uksched/Makefile.uk b/lib/uksched/Makefile.uk
>index 229d847..76fea97 100644
>--- a/lib/uksched/Makefile.uk
>+++ b/lib/uksched/Makefile.uk
>@@ -6,3 +6,4 @@ CXXINCLUDES-$(CONFIG_LIBUKSCHED)   +=
>-I$(LIBUKSCHED_BASE)/include
> LIBUKSCHED_SRCS-y += $(LIBUKSCHED_BASE)/sched.c
> LIBUKSCHED_SRCS-y += $(LIBUKSCHED_BASE)/thread.c
> LIBUKSCHED_SRCS-y += $(LIBUKSCHED_BASE)/thread_attr.c
>+LIBUKSCHED_SRCS-y += $(LIBUKSCHED_BASE)/thread_info.c
>diff --git a/lib/uksched/exportsyms.uk b/lib/uksched/exportsyms.uk
>index 7d8e102..951cd20 100644
>--- a/lib/uksched/exportsyms.uk
>+++ b/lib/uksched/exportsyms.uk
>@@ -26,3 +26,6 @@ uk_thread_attr_set_prio
> uk_thread_attr_get_prio
> uk_thread_attr_set_timeslice
> uk_thread_attr_get_timeslice
>+thread_info_base_create
>+thread_info_base_destroy
>+thread_info_base_init
>diff --git a/lib/uksched/include/uk/_thread_info.h
>b/lib/uksched/include/uk/_thread_info.h
>new file mode 100644
>index 0000000..d7050d7
>--- /dev/null
>+++ b/lib/uksched/include/uk/_thread_info.h
>@@ -0,0 +1,57 @@
>+/* SPDX-License-Identifier: BSD-3-Clause */
>+/*
>+ * Authors: Costin Lupu <costin.lupu@xxxxxxxxx>
>+ *
>+ * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights
>reserved.
>+ *
>+ * Redistribution and use in source and binary forms, with or without
>+ * modification, are permitted provided that the following conditions
>+ * are met:
>+ *
>+ * 1. Redistributions of source code must retain the above copyright
>+ *    notice, this list of conditions and the following disclaimer.
>+ * 2. Redistributions in binary form must reproduce the above copyright
>+ *    notice, this list of conditions and the following disclaimer in the
>+ *    documentation and/or other materials provided with the
>distribution.
>+ * 3. Neither the name of the copyright holder nor the names of its
>+ *    contributors may be used to endorse or promote products derived
>from
>+ *    this software without specific prior written permission.
>+ *
>+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
>"AS IS"
>+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
>THE
>+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
>PURPOSE
>+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
>CONTRIBUTORS BE
>+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
>BUSINESS
>+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
>IN
>+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
>OTHERWISE)
>+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
>OF THE
>+ * POSSIBILITY OF SUCH DAMAGE.
>+ *
>+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
>+ */
>+
>+#ifndef __UK_SCHED__THREAD_INFO_H__
>+#define __UK_SCHED__THREAD_INFO_H__
>+
>+#include <uk/alloc.h>
>+#include <uk/thread_attr.h>

Maybe you should #include <uk/thread.h> here? When running a dummy
application
I wrote that uses this code I had to add this include in it in order for
it 
to compile.

>+
>+struct thread_info_base {
>+      int is_detached;
>+};
>+
>+struct thread_info_base *
>+thread_info_base_create(struct uk_alloc *a,
>+              const uk_thread_attr_t *attr);
>+
>+void
>+thread_info_base_destroy(struct uk_alloc *a,
>+              struct thread_info_base *tib);
>+
>+void
>+thread_info_base_init(struct thread_info_base *tib,
>+              const uk_thread_attr_t *attr);
>+
>+#endif /* __UK_SCHED__THREAD_INFO_H__ */
>diff --git a/lib/uksched/include/uk/sched.h
>b/lib/uksched/include/uk/sched.h
>index b21d65c..443dbf3 100644
>--- a/lib/uksched/include/uk/sched.h
>+++ b/lib/uksched/include/uk/sched.h
>@@ -59,7 +59,7 @@ int uk_sched_set_default(struct uk_sched *s);
> typedef void  (*uk_sched_yield_func_t)
>               (struct uk_sched *s);
> 
>-typedef void  (*uk_sched_thread_add_func_t)
>+typedef int   (*uk_sched_thread_add_func_t)
>               (struct uk_sched *s, struct uk_thread *t,
>                       struct uk_thread_attr *attr);
> typedef void  (*uk_sched_thread_remove_func_t)
>@@ -106,13 +106,13 @@ static inline void uk_sched_yield(void)
>       s->yield(s);
> }
> 
>-static inline void uk_sched_thread_add(struct uk_sched *s,
>+static inline int uk_sched_thread_add(struct uk_sched *s,
>               struct uk_thread *t, struct uk_thread_attr *attr)
> {
>       UK_ASSERT(s);
>       UK_ASSERT(t);
>       t->sched = s;
>-      s->thread_add(s, t, attr);
>+      return s->thread_add(s, t, attr);
> }
> 
> static inline void uk_sched_thread_remove(struct uk_sched *s,
>diff --git a/lib/uksched/include/uk/thread.h
>b/lib/uksched/include/uk/thread.h
>index 5ff2dd6..d28c458 100644
>--- a/lib/uksched/include/uk/thread.h
>+++ b/lib/uksched/include/uk/thread.h
>@@ -53,6 +53,7 @@ struct uk_thread {
>       uint32_t flags;
>       __snsec wakeup_time;
>       struct uk_sched *sched;
>+      void *sched_info;
> #ifdef CONFIG_HAVE_LIBC
>       struct _reent reent;
> #endif
>diff --git a/lib/uksched/sched.c b/lib/uksched/sched.c
>index f2eca33..968723c 100644
>--- a/lib/uksched/sched.c
>+++ b/lib/uksched/sched.c
>@@ -196,7 +196,11 @@ struct uk_thread *uk_sched_thread_create(struct
>uk_sched *sched,
>       if (rc)
>               goto err;
> 
>-      uk_sched_thread_add(sched, thread, attr);
>+      rc = uk_sched_thread_add(sched, thread, attr);
>+      if (rc) {
>+              uk_thread_fini(thread, sched->allocator);
>+              goto err;
>+      }
> 
>       return thread;
> 
>@@ -213,6 +217,8 @@ void uk_sched_thread_destroy(struct uk_sched *sched,
>struct uk_thread *thread)
> {
>       UK_ASSERT(sched != NULL);
>       UK_ASSERT(thread != NULL);
>+
>+      uk_free(sched->allocator, thread->sched_info);
>       uk_thread_fini(thread, sched->allocator);
>       uk_pfree(sched->allocator, thread->stack, STACK_SIZE_PAGE_ORDER);
>       uk_free(sched->allocator, thread);
>diff --git a/lib/uksched/thread.c b/lib/uksched/thread.c
>index a6d90fc..3e69cfe 100644
>--- a/lib/uksched/thread.c
>+++ b/lib/uksched/thread.c
>@@ -34,6 +34,7 @@
> #include <uk/plat/config.h>
> #include <uk/plat/time.h>
> #include <uk/thread.h>
>+#include <uk/_thread_info.h>
> #include <uk/sched.h>
> #include <uk/print.h>
> #include <uk/assert.h>
>@@ -86,6 +87,7 @@ int uk_thread_init(struct uk_thread *thread,
>       /* Not runnable, not exited, not sleeping */
>       thread->flags = 0;
>       thread->wakeup_time = 0LL;
>+      thread->sched_info = NULL;
> 
> #ifdef CONFIG_HAVE_LIBC
>       //TODO _REENT_INIT_PTR(&thread->reent);
>diff --git a/lib/uksched/thread_info.c b/lib/uksched/thread_info.c
>new file mode 100644
>index 0000000..51d47ed
>--- /dev/null
>+++ b/lib/uksched/thread_info.c
>@@ -0,0 +1,79 @@
>+/* SPDX-License-Identifier: BSD-3-Clause */
>+/*
>+ * Authors: Costin Lupu <costin.lupu@xxxxxxxxx>
>+ *
>+ * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. All rights
>reserved.
>+ *
>+ * Redistribution and use in source and binary forms, with or without
>+ * modification, are permitted provided that the following conditions
>+ * are met:
>+ *
>+ * 1. Redistributions of source code must retain the above copyright
>+ *    notice, this list of conditions and the following disclaimer.
>+ * 2. Redistributions in binary form must reproduce the above copyright
>+ *    notice, this list of conditions and the following disclaimer in the
>+ *    documentation and/or other materials provided with the
>distribution.
>+ * 3. Neither the name of the copyright holder nor the names of its
>+ *    contributors may be used to endorse or promote products derived
>from
>+ *    this software without specific prior written permission.
>+ *
>+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
>"AS IS"
>+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
>THE
>+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
>PURPOSE
>+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
>CONTRIBUTORS BE
>+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
>+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
>+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
>BUSINESS
>+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
>IN
>+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
>OTHERWISE)
>+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
>OF THE
>+ * POSSIBILITY OF SUCH DAMAGE.
>+ *
>+ * THIS HEADER MAY NOT BE EXTRACTED OR MODIFIED IN ANY WAY.
>+ */
>+
>+#include <uk/_thread_info.h>
>+#include <uk/print.h>
>+
>+
>+struct thread_info_base *
>+thread_info_base_create(struct uk_alloc *a,
>+              const uk_thread_attr_t *attr)
>+{
>+      struct thread_info_base *tib;
>+
>+      UK_ASSERT(a != NULL);
>+
>+      tib = uk_malloc(a, sizeof(struct thread_info_base));
>+      if (tib == NULL) {
>+              uk_printd(DLVL_WARN, "Could not allocate thread info.");
>+              return NULL;
>+      }
>+
>+      thread_info_base_init(tib, attr);
>+
>+      return tib;
>+}
>+
>+void
>+thread_info_base_destroy(struct uk_alloc *a,
>+              struct thread_info_base *tib)
>+{
>+      UK_ASSERT(a != NULL);
>+      UK_ASSERT(tib != NULL);
>+
>+      uk_free(a, tib);
>+}
>+
>+void
>+thread_info_base_init(struct thread_info_base *tib,
>+              const uk_thread_attr_t *attr)
>+{
>+      UK_ASSERT(tib != NULL);
>+
>+      /* detach state */
>+      if (attr && attr->is_detached)
>+              tib->is_detached = 1;
>+      else
>+              tib->is_detached = 0;
>+}

Please use macros instead of 1, 0.

Thanks,

— Felipe

>diff --git a/lib/ukschedcoop/schedcoop.c b/lib/ukschedcoop/schedcoop.c
>index bc02d08..f616330 100644
>--- a/lib/ukschedcoop/schedcoop.c
>+++ b/lib/ukschedcoop/schedcoop.c
>@@ -32,6 +32,7 @@
> #include <uk/plat/lcpu.h>
> #include <uk/plat/time.h>
> #include <uk/sched.h>
>+#include <uk/_thread_info.h>
> #include <uk/schedcoop.h>
> 
> struct schedcoop_private {
>@@ -132,17 +133,25 @@ static void schedcoop_schedule(struct uk_sched *s)
>       }
> }
> 
>-static void schedcoop_thread_add(struct uk_sched *s, struct uk_thread *t,
>-              struct uk_thread_attr *attr __unused)
>+static int schedcoop_thread_add(struct uk_sched *s, struct uk_thread *t,
>+              struct uk_thread_attr *attr)
> {
>       unsigned long flags;
>       struct schedcoop_private *prv = s->prv;
> 
>+      t->sched_info = thread_info_base_create(s->allocator, attr);
>+      if (t->sched_info == NULL) {
>+              uk_printd(DLVL_WARN, "Could not create thread info.");
>+              return -1;
>+      }
>+
>       set_runnable(t);
> 
>       flags = ukplat_lcpu_save_irqf();
>       UK_TAILQ_INSERT_TAIL(&prv->thread_list, t, thread_list);
>       ukplat_lcpu_restore_irqf(flags);
>+
>+      return 0;
> }
> 
> static void schedcoop_thread_remove(struct uk_sched *s, struct uk_thread
>*t)
>-- 
>2.11.0
>
>
>_______________________________________________
>Minios-devel mailing list
>Minios-devel@xxxxxxxxxxxxxxxxxxxx
>https://lists.xenproject.org/mailman/listinfo/minios-devel

_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.