[v6,4/7] linux-gen: schedule, queue: select scheduler/queue via environment

Message ID 1519761641-21081-5-git-send-email-odpbot@yandex.ru
State New
Headers show
Series
  • Select scheduler+queue in runtime, basing on environment
Related show

Commit Message

Github ODP bot Feb. 27, 2018, 8 p.m.
From: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>


Use ODP_SCHEDULER environment variable to select scheduler/queue
implementation.

Signed-off-by: Dmitry Eremin-Solenikov <dmitry.ereminsolenikov@linaro.org>

---
/** Email created from pull request 467 (lumag:sched-env)
 ** https://github.com/Linaro/odp/pull/467
 ** Patch: https://github.com/Linaro/odp/pull/467.patch
 ** Base sha: 3984ba4cd16a02e3fa98ccd432a06663de3fa993
 ** Merge commit sha: 62438643661dee1350bce73f90120c824538df8b
 **/
 platform/linux-generic/m4/odp_schedule.m4 | 29 +++++----------------
 platform/linux-generic/odp_queue_if.c     | 31 +++++++++++++++++-----
 platform/linux-generic/odp_schedule_if.c  | 43 +++++++++++++++++++++----------
 3 files changed, 60 insertions(+), 43 deletions(-)

Patch

diff --git a/platform/linux-generic/m4/odp_schedule.m4 b/platform/linux-generic/m4/odp_schedule.m4
index 087cff87f..70be5a7d6 100644
--- a/platform/linux-generic/m4/odp_schedule.m4
+++ b/platform/linux-generic/m4/odp_schedule.m4
@@ -1,23 +1,6 @@ 
-AC_ARG_ENABLE([schedule-sp],
-    [  --enable-schedule-sp    enable strict priority scheduler],
-    [if test x$enableval = xyes; then
-	schedule_sp_enabled=yes
-	AC_DEFINE([ODP_SCHEDULE_SP], [1],
-		  [Define to 1 to enable strict priority scheduler])
-    fi])
-
-AC_ARG_ENABLE([schedule-iquery],
-    [  --enable-schedule-iquery    enable interests query (sparse bitmap) scheduler],
-    [if test x$enableval = xyes; then
-	schedule_iquery_enabled=yes
-	AC_DEFINE([ODP_SCHEDULE_IQUERY], [1],
-		  [Define to 1 to enable interests query scheduler])
-    fi])
-
-AC_ARG_ENABLE([schedule_scalable],
-    [  --enable-schedule-scalable   enable scalable scheduler],
-    [if test x$enableval = xyes; then
-	schedule_scalable_enabled=yes
-	AC_DEFINE([ODP_SCHEDULE_SCALABLE], [1],
-		  [Define to 1 to enable scalable scheduler])
-    fi])
+AC_ARG_ENABLE([scheduler-default],
+	      [AS_HELP_STRING([enable-scheduler-default],
+			      [Choose default scheduler (default is basic)])],
+	      [], [enable_scheduler_default=basic])
+AC_DEFINE_UNQUOTED([ODP_SCHEDULE_DEFAULT], ["$enable_scheduler_default"],
+		   [Define to name default scheduler])
diff --git a/platform/linux-generic/odp_queue_if.c b/platform/linux-generic/odp_queue_if.c
index d1c468485..08076ab3a 100644
--- a/platform/linux-generic/odp_queue_if.c
+++ b/platform/linux-generic/odp_queue_if.c
@@ -8,6 +8,10 @@ 
 
 #include <odp_queue_if.h>
 #include <odp_internal.h>
+#include <odp_debug_internal.h>
+
+#include <stdlib.h>
+#include <string.h>
 
 extern const queue_api_t queue_scalable_api;
 extern const queue_fn_t queue_scalable_fn;
@@ -15,13 +19,8 @@  extern const queue_fn_t queue_scalable_fn;
 extern const queue_api_t queue_basic_api;
 extern const queue_fn_t queue_basic_fn;
 
-#ifdef ODP_SCHEDULE_SCALABLE
-const queue_api_t *queue_api = &queue_scalable_api;
-const queue_fn_t *queue_fn = &queue_scalable_fn;
-#else
-const queue_api_t *queue_api = &queue_basic_api;
-const queue_fn_t *queue_fn = &queue_basic_fn;
-#endif
+const queue_api_t *queue_api;
+const queue_fn_t *queue_fn;
 
 odp_queue_t odp_queue_create(const char *name, const odp_queue_param_t *param)
 {
@@ -115,6 +114,24 @@  int odp_queue_info(odp_queue_t queue, odp_queue_info_t *info)
 
 int _odp_queue_init_global(void)
 {
+	const char *sched = getenv("ODP_SCHEDULER");
+
+	if (sched == NULL || !strcmp(sched, "default"))
+		sched = ODP_SCHEDULE_DEFAULT;
+
+	if (!strcmp(sched, "basic") ||
+	    !strcmp(sched, "sp") ||
+	    !strcmp(sched, "iquery")) {
+		queue_fn = &queue_basic_fn;
+		queue_api = &queue_basic_api;
+	} else if (!strcmp(sched, "scalable")) {
+		queue_fn = &queue_scalable_fn;
+		queue_api = &queue_scalable_api;
+	} else {
+		ODP_ABORT("Unknown scheduler specified via ODP_SCHEDULER\n");
+		return -1;
+	}
+
 	return queue_fn->init_global();
 }
 
diff --git a/platform/linux-generic/odp_schedule_if.c b/platform/linux-generic/odp_schedule_if.c
index 4639ad737..085208525 100644
--- a/platform/linux-generic/odp_schedule_if.c
+++ b/platform/linux-generic/odp_schedule_if.c
@@ -8,6 +8,10 @@ 
 
 #include <odp_schedule_if.h>
 #include <odp_internal.h>
+#include <odp_debug_internal.h>
+
+#include <stdlib.h>
+#include <string.h>
 
 extern const schedule_fn_t schedule_sp_fn;
 extern const schedule_api_t schedule_sp_api;
@@ -21,19 +25,8 @@  extern const schedule_api_t schedule_iquery_api;
 extern const schedule_fn_t  schedule_scalable_fn;
 extern const schedule_api_t schedule_scalable_api;
 
-#ifdef ODP_SCHEDULE_SP
-const schedule_fn_t *sched_fn   = &schedule_sp_fn;
-const schedule_api_t *sched_api = &schedule_sp_api;
-#elif defined(ODP_SCHEDULE_IQUERY)
-const schedule_fn_t *sched_fn   = &schedule_iquery_fn;
-const schedule_api_t *sched_api = &schedule_iquery_api;
-#elif defined(ODP_SCHEDULE_SCALABLE)
-const schedule_fn_t  *sched_fn  = &schedule_scalable_fn;
-const schedule_api_t *sched_api = &schedule_scalable_api;
-#else
-const schedule_fn_t  *sched_fn  = &schedule_basic_fn;
-const schedule_api_t *sched_api = &schedule_basic_api;
-#endif
+const schedule_fn_t *sched_fn;
+const schedule_api_t *sched_api;
 
 uint64_t odp_schedule_wait_time(uint64_t ns)
 {
@@ -148,6 +141,30 @@  void odp_schedule_order_lock_wait(uint32_t lock_index)
 
 int _odp_schedule_init_global(void)
 {
+	const char *sched = getenv("ODP_SCHEDULER");
+
+	if (sched == NULL || !strcmp(sched, "default"))
+		sched = ODP_SCHEDULE_DEFAULT;
+
+	ODP_PRINT("Using scheduler '%s'\n", sched);
+
+	if (!strcmp(sched, "basic")) {
+		sched_fn = &schedule_basic_fn;
+		sched_api = &schedule_basic_api;
+	} else if (!strcmp(sched, "sp")) {
+		sched_fn = &schedule_sp_fn;
+		sched_api = &schedule_sp_api;
+	} else if (!strcmp(sched, "iquery")) {
+		sched_fn = &schedule_iquery_fn;
+		sched_api = &schedule_iquery_api;
+	} else if (!strcmp(sched, "scalable")) {
+		sched_fn = &schedule_scalable_fn;
+		sched_api = &schedule_scalable_api;
+	} else {
+		ODP_ABORT("Unknown scheduler specified via ODP_SCHEDULER\n");
+		return -1;
+	}
+
 	return sched_fn->init_global();
 }