560 lines
21 KiB
Diff
560 lines
21 KiB
Diff
From 5b5caa5bc583c4a7dec5e3050dae619fa00d8424 Mon Sep 17 00:00:00 2001
|
|
From: modric <wangyu283@huawei.com>
|
|
Date: Tue, 18 Oct 2022 21:54:45 +0800
|
|
Subject: [PATCH 1/4] switchless schedule policy
|
|
|
|
Signed-off-by: modric <wangyu283@huawei.com>
|
|
---
|
|
inc/common_inc/bit_operation.h | 9 ++
|
|
inc/common_inc/switchless_defs.h | 49 ++++---
|
|
inc/host_inc/secgear_defs.h | 1 +
|
|
inc/host_inc/secgear_uswitchless.h | 12 +-
|
|
.../gp/itrustee/itrustee_tswitchless.c | 134 ++++++++++++++++--
|
|
src/host_src/gp/gp_enclave.c | 18 +--
|
|
src/host_src/gp/gp_enclave.h | 2 +
|
|
src/host_src/gp/gp_uswitchless.c | 19 +--
|
|
src/host_src/gp/gp_uswitchless.h | 7 +-
|
|
9 files changed, 205 insertions(+), 46 deletions(-)
|
|
|
|
diff --git a/inc/common_inc/bit_operation.h b/inc/common_inc/bit_operation.h
|
|
index baa6a1b..ab20121 100644
|
|
--- a/inc/common_inc/bit_operation.h
|
|
+++ b/inc/common_inc/bit_operation.h
|
|
@@ -37,6 +37,15 @@ static inline uint32_t count_tailing_zeroes(uint64_t value)
|
|
return (uint32_t)__builtin_ctzll(value);
|
|
}
|
|
|
|
+/*
|
|
+ * Returns the number of 1-bits in value.
|
|
+ */
|
|
+static inline uint32_t count_ones(uint64_t value)
|
|
+{
|
|
+ ASSERT(value != 0);
|
|
+ return (uint32_t)__builtin_popcountll(value);
|
|
+}
|
|
+
|
|
/*
|
|
* Returns the number of leading 0-bits in x, starting at the most significant bit position.
|
|
* If x is 0, the result is undefined.
|
|
diff --git a/inc/common_inc/switchless_defs.h b/inc/common_inc/switchless_defs.h
|
|
index c7e9dfc..84629c3 100644
|
|
--- a/inc/common_inc/switchless_defs.h
|
|
+++ b/inc/common_inc/switchless_defs.h
|
|
@@ -16,28 +16,45 @@
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
+#include "secgear_uswitchless.h"
|
|
+
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#define SWITCHLESS_BITS_IN_QWORD 64
|
|
|
|
-typedef struct {
|
|
- uint32_t num_uworkers; // number of untrusted (for ocalls) worker threads
|
|
- uint32_t num_tworkers; // number of trusted (for ecalls) worker threads
|
|
- uint32_t call_pool_size_qwords; // number of switchless calls pool size (actual number is x 64)
|
|
- uint32_t num_max_params; // max number of parameters
|
|
-} sl_task_pool_config_t;
|
|
+/*
|
|
+ * sl_task_pool_t free_bit_buf
|
|
+ * | |
|
|
+ * v v
|
|
+ * +-------------------+-+-+--------+-+----------------+-+
|
|
+ * +---- | task_buf | | | | | | |
|
|
+ * | +-- | pool_buf |0|1| ... |1| ... |1| normal memory
|
|
+ * | | +-------------------+-+-+--------+-+----------------+-+
|
|
+ * | |
|
|
+ * | | signal_bit_buf
|
|
+ * | | |
|
|
+ * | | v
|
|
+ * | +-> +-------------------+-+-+--------+-+----------------+-+
|
|
+ * | | | | | | | | |
|
|
+ * | | cc_sl_config_t |1|0| ... |0| ... |0|
|
|
+ * +---> +--------+---------++-+-+---+----+-+--+--------+----+-+
|
|
+ * task[0] | status | func id | retval | params1 | prams2 | ... | shared memory
|
|
+ * +--------+---------+--------+---------+--------+------+
|
|
+ * task[n] | ... |
|
|
+ * +-----------------------------------------------------+
|
|
+ */
|
|
|
|
typedef struct {
|
|
- char *pool_buf; // switchless task pool control area
|
|
+ char *pool_buf; // switchless task pool control area, includes configuration area, signal bit area, and task area
|
|
char *task_buf; // part of pool_buf, stores invoking tasks
|
|
- uint64_t *free_bit_buf; // idle task flag
|
|
- uint64_t *signal_bit_buf; // to-be-processed task flag
|
|
- uint32_t bit_buf_size; // size of each task flag area
|
|
- uint32_t per_task_size; // size of each task
|
|
+ uint64_t *free_bit_buf; // length is bit_buf_size, the task indicated by the bit subscript is idle
|
|
+ uint64_t *signal_bit_buf; // length is bit_buf_size, the task indicated by the bit subscript is to be processed
|
|
+ uint32_t bit_buf_size; // size of each bit buf in bytes, determined by sl_call_pool_size_qwords in cc_sl_config_t
|
|
+ uint32_t per_task_size; // size of each task in bytes, for details, see task[0]
|
|
volatile bool need_stop_tworkers; // indicates whether to stop the trusted proxy thread
|
|
- sl_task_pool_config_t pool_cfg;
|
|
+ cc_sl_config_t pool_cfg;
|
|
} sl_task_pool_t;
|
|
|
|
typedef struct {
|
|
@@ -65,12 +82,12 @@ typedef enum {
|
|
* Return:
|
|
* pool size in bytes
|
|
*/
|
|
-inline size_t sl_get_pool_buf_len_by_config(sl_task_pool_config_t *pool_cfg)
|
|
+inline size_t sl_get_pool_buf_len_by_config(cc_sl_config_t *pool_cfg)
|
|
{
|
|
- size_t signal_bit_buf_size = pool_cfg->call_pool_size_qwords * sizeof(uint64_t);
|
|
+ size_t signal_bit_buf_size = pool_cfg->sl_call_pool_size_qwords * sizeof(uint64_t);
|
|
size_t each_task_size = SL_CALCULATE_PER_TASK_SIZE(pool_cfg);
|
|
- size_t task_buf_size = each_task_size * pool_cfg->call_pool_size_qwords * SWITCHLESS_BITS_IN_QWORD;
|
|
- return sizeof(sl_task_pool_config_t) + signal_bit_buf_size + task_buf_size;
|
|
+ size_t task_buf_size = each_task_size * pool_cfg->sl_call_pool_size_qwords * SWITCHLESS_BITS_IN_QWORD;
|
|
+ return sizeof(cc_sl_config_t) + signal_bit_buf_size + task_buf_size;
|
|
}
|
|
|
|
/*
|
|
diff --git a/inc/host_inc/secgear_defs.h b/inc/host_inc/secgear_defs.h
|
|
index 4ca11a8..183646d 100644
|
|
--- a/inc/host_inc/secgear_defs.h
|
|
+++ b/inc/host_inc/secgear_defs.h
|
|
@@ -32,6 +32,7 @@ extern "C" {
|
|
#define CC_MUTEX_UNLOCK(lock) CC_IGNORE(pthread_mutex_unlock(lock))
|
|
#define CC_COND_INIT(cond, attr) CC_IGNORE(pthread_cond_init(cond, attr))
|
|
#define CC_COND_SIGNAL(cond) CC_IGNORE(pthread_cond_signal(cond))
|
|
+#define CC_COND_BROADCAST(cond) CC_IGNORE(pthread_cond_broadcast(cond))
|
|
#define CC_COND_WAIT(cond, mtx_lock) CC_IGNORE(pthread_cond_wait(cond, mtx_lock))
|
|
#define CC_COND_DESTROY(cond) CC_IGNORE(pthread_cond_destroy(cond))
|
|
#define CC_THREAD_ATTR_INIT(attr) CC_IGNORE(pthread_attr_init(attr))
|
|
diff --git a/inc/host_inc/secgear_uswitchless.h b/inc/host_inc/secgear_uswitchless.h
|
|
index bff563c..8e21fd9 100644
|
|
--- a/inc/host_inc/secgear_uswitchless.h
|
|
+++ b/inc/host_inc/secgear_uswitchless.h
|
|
@@ -47,6 +47,13 @@
|
|
extern "C" {
|
|
#endif
|
|
|
|
+typedef enum {
|
|
+ /* Worker threads work all the time. */
|
|
+ WORKERS_POLICY_BUSY,
|
|
+ /* The worker thread is only woken up when the task arrives and goes to sleep after the task is processed. */
|
|
+ WORKERS_POLICY_WAKEUP,
|
|
+ WORKERS_POLICY_MAX
|
|
+} cc_workers_policy_t;
|
|
|
|
typedef struct {
|
|
/* number of untrusted (for ocalls) worker threads */
|
|
@@ -72,9 +79,12 @@ typedef struct {
|
|
* before going to sleep, only for SGX
|
|
*/
|
|
uint32_t retries_before_sleep;
|
|
+
|
|
+ /* Worker thread scheduling policy, refer to cc_workers_policy_t, only for GP */
|
|
+ uint64_t workers_policy;
|
|
} cc_sl_config_t;
|
|
|
|
-#define CC_USWITCHLESS_CONFIG_INITIALIZER {1, 1, 1, 16, 0, 0}
|
|
+#define CC_USWITCHLESS_CONFIG_INITIALIZER {1, 1, 1, 16, 0, 0, WORKERS_POLICY_BUSY}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
diff --git a/src/enclave_src/gp/itrustee/itrustee_tswitchless.c b/src/enclave_src/gp/itrustee/itrustee_tswitchless.c
|
|
index 5ccb519..3955ff9 100644
|
|
--- a/src/enclave_src/gp/itrustee/itrustee_tswitchless.c
|
|
+++ b/src/enclave_src/gp/itrustee/itrustee_tswitchless.c
|
|
@@ -16,6 +16,7 @@
|
|
#include <stdarg.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
+#include <sys/time.h>
|
|
#include "secgear_defs.h"
|
|
#include "switchless_defs.h"
|
|
#include "bit_operation.h"
|
|
@@ -55,6 +56,9 @@
|
|
#define TEESMP_THREAD_ATTR_TASK_ID TEESMP_THREAD_ATTR_TASK_ID_INHERIT
|
|
#endif
|
|
|
|
+static pthread_mutex_t g_sched_lock = PTHREAD_MUTEX_INITIALIZER;
|
|
+static pthread_cond_t g_sched_cond = PTHREAD_COND_INITIALIZER;
|
|
+
|
|
static sl_task_pool_t *tswitchless_init_pool(void *pool_buf)
|
|
{
|
|
sl_task_pool_t *pool = (sl_task_pool_t *)calloc(1, sizeof(sl_task_pool_t));
|
|
@@ -63,25 +67,39 @@ static sl_task_pool_t *tswitchless_init_pool(void *pool_buf)
|
|
return NULL;
|
|
}
|
|
|
|
- sl_task_pool_config_t *pool_cfg = (sl_task_pool_config_t *)pool_buf;
|
|
+ cc_sl_config_t *pool_cfg = (cc_sl_config_t *)pool_buf;
|
|
|
|
pool->pool_cfg = *pool_cfg;
|
|
- pool->bit_buf_size = pool_cfg->call_pool_size_qwords * sizeof(uint64_t);
|
|
+ pool->bit_buf_size = pool_cfg->sl_call_pool_size_qwords * sizeof(uint64_t);
|
|
pool->per_task_size = SL_CALCULATE_PER_TASK_SIZE(pool_cfg);
|
|
|
|
pool->pool_buf = (char *)pool_buf;
|
|
- pool->signal_bit_buf = (uint64_t *)(pool->pool_buf + sizeof(sl_task_pool_config_t));
|
|
+ pool->signal_bit_buf = (uint64_t *)(pool->pool_buf + sizeof(cc_sl_config_t));
|
|
pool->task_buf = (char *)pool->signal_bit_buf + pool->bit_buf_size;
|
|
|
|
return pool;
|
|
}
|
|
|
|
+static bool tswitchless_is_workers_policy_wakeup(cc_sl_config_t *cfg)
|
|
+{
|
|
+ return cfg->workers_policy == WORKERS_POLICY_WAKEUP;
|
|
+}
|
|
+
|
|
static void tswitchless_fini_workers(sl_task_pool_t *pool, pthread_t *tids)
|
|
{
|
|
int ret;
|
|
uint32_t thread_num = pool->pool_cfg.num_tworkers;
|
|
pool->need_stop_tworkers = true;
|
|
|
|
+ if (tswitchless_is_workers_policy_wakeup(&(pool->pool_cfg))) {
|
|
+ thread_num += 1;
|
|
+
|
|
+ // Wakes all dormant worker threads and informs it to exit
|
|
+ CC_MUTEX_LOCK(&g_sched_lock);
|
|
+ CC_COND_BROADCAST(&g_sched_cond);
|
|
+ CC_MUTEX_UNLOCK(&g_sched_lock);
|
|
+ }
|
|
+
|
|
for (uint32_t i = 0; i < thread_num; ++i) {
|
|
if (tids[i] != NULL) {
|
|
ret = pthread_join(tids[i], NULL);
|
|
@@ -99,7 +117,7 @@ static inline sl_task_t *tswitchless_get_task_by_index(sl_task_pool_t *pool, int
|
|
|
|
static int tswitchless_get_pending_task(sl_task_pool_t *pool)
|
|
{
|
|
- int call_pool_size_qwords = (int)pool->pool_cfg.call_pool_size_qwords;
|
|
+ int call_pool_size_qwords = (int)pool->pool_cfg.sl_call_pool_size_qwords;
|
|
uint64_t *signal_bit_buf = pool->signal_bit_buf;
|
|
int start_bit = 0;
|
|
int end_bit = 0;
|
|
@@ -156,6 +174,10 @@ static void tswitchless_proc_task(sl_task_t *task)
|
|
|
|
static int thread_num = 0;
|
|
|
|
+#define TSWITCHLESS_TIMEOUT_IN_USEC 500000
|
|
+#define TSWITCHLESS_USEC_PER_SEC 1000000
|
|
+#define TSWITCHLESS_GETTIME_PER_CNT 10000000
|
|
+
|
|
static void *tswitchless_thread_routine(void *data)
|
|
{
|
|
int thread_index = __atomic_add_fetch(&thread_num, 1, __ATOMIC_ACQ_REL);
|
|
@@ -165,14 +187,45 @@ static void *tswitchless_thread_routine(void *data)
|
|
sl_task_t *task_buf = NULL;
|
|
sl_task_pool_t *pool = (sl_task_pool_t *)data;
|
|
int processed_count = 0;
|
|
+ bool is_workers_policy_wakeup = tswitchless_is_workers_policy_wakeup(&(pool->pool_cfg));
|
|
+ struct timeval tval_before;
|
|
+ struct timeval tval_after;
|
|
+ struct timeval duration;
|
|
+ int count = 0;
|
|
+ bool timeout = true;
|
|
|
|
while (true) {
|
|
if (pool->need_stop_tworkers) {
|
|
break;
|
|
}
|
|
|
|
+ count++;
|
|
task_index = tswitchless_get_pending_task(pool);
|
|
if (task_index == -1) {
|
|
+ /*
|
|
+ * If the scheduling policy is WORKERS_POLICY_WAKEUP, After the task is processed,
|
|
+ * wait for a period of time before exiting. A new task may arrive immediately.
|
|
+ * This reduces the performance loss caused by frequent sleep and wakeup between threads.
|
|
+ */
|
|
+ if (is_workers_policy_wakeup && count > TSWITCHLESS_GETTIME_PER_CNT) {
|
|
+ gettimeofday(&tval_after, NULL);
|
|
+ timersub(&tval_after, &tval_before, &duration);
|
|
+ timeout =
|
|
+ (duration.tv_sec * TSWITCHLESS_USEC_PER_SEC + duration.tv_usec) >= TSWITCHLESS_TIMEOUT_IN_USEC;
|
|
+
|
|
+ count = 0;
|
|
+ }
|
|
+
|
|
+ if (is_workers_policy_wakeup && timeout) {
|
|
+ CC_MUTEX_LOCK(&g_sched_lock);
|
|
+ CC_COND_WAIT(&g_sched_cond, &g_sched_lock);
|
|
+ CC_MUTEX_UNLOCK(&g_sched_lock);
|
|
+
|
|
+ gettimeofday(&tval_before, NULL);
|
|
+ count = 0;
|
|
+ timeout = false;
|
|
+ }
|
|
+
|
|
continue;
|
|
}
|
|
|
|
@@ -189,12 +242,76 @@ static void *tswitchless_thread_routine(void *data)
|
|
return NULL;
|
|
}
|
|
|
|
+static inline int tswitchless_get_total_pending_task(sl_task_pool_t *pool)
|
|
+{
|
|
+ int count = 0;
|
|
+ int call_pool_size_qwords = (int)pool->pool_cfg.sl_call_pool_size_qwords;
|
|
+ uint64_t *signal_bit_buf = pool->signal_bit_buf;
|
|
+ uint64_t element_val = 0;
|
|
+
|
|
+ for (int i = 0; i < call_pool_size_qwords; ++i) {
|
|
+ element_val = *(signal_bit_buf + i);
|
|
+
|
|
+ if (element_val == 0) {
|
|
+ continue;
|
|
+ }
|
|
+
|
|
+ count += count_ones(element_val);
|
|
+ }
|
|
+
|
|
+ return count;
|
|
+}
|
|
+
|
|
+static void *tswitchless_thread_scheduler(void *data)
|
|
+{
|
|
+ SLogTrace("Enter scheduler tworker.");
|
|
+
|
|
+ int task_num;
|
|
+ sl_task_pool_t *pool = (sl_task_pool_t *)data;
|
|
+
|
|
+ while (true) {
|
|
+ if (pool->need_stop_tworkers) {
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ task_num = tswitchless_get_total_pending_task(pool);
|
|
+ if (task_num == 0) {
|
|
+ continue;
|
|
+ } else {
|
|
+ CC_MUTEX_LOCK(&g_sched_lock);
|
|
+ CC_COND_BROADCAST(&g_sched_cond);
|
|
+ CC_MUTEX_UNLOCK(&g_sched_lock);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ SLogTrace("Exit scheduler tworker.");
|
|
+
|
|
+ return NULL;
|
|
+}
|
|
+
|
|
+typedef void *(*TSWITCHLESS_THREAD_FUNC)(void *data);
|
|
+
|
|
+TSWITCHLESS_THREAD_FUNC tswitchless_get_thread_func(bool is_sched)
|
|
+{
|
|
+ if (is_sched) {
|
|
+ return tswitchless_thread_scheduler;
|
|
+ }
|
|
+
|
|
+ return tswitchless_thread_routine;
|
|
+}
|
|
+
|
|
static pthread_t *tswitchless_init_workers(sl_task_pool_t *pool)
|
|
{
|
|
int ret;
|
|
- sl_task_pool_config_t *pool_cfg = &pool->pool_cfg;
|
|
+ cc_sl_config_t *pool_cfg = &pool->pool_cfg;
|
|
+ uint32_t thread_count = pool_cfg->num_tworkers;
|
|
+ bool is_workers_policy_wakeup = tswitchless_is_workers_policy_wakeup(pool_cfg);
|
|
+
|
|
+ if (is_workers_policy_wakeup) {
|
|
+ thread_count += 1;
|
|
+ }
|
|
|
|
- pthread_t *tids = (pthread_t *)calloc(pool_cfg->num_tworkers, sizeof(pthread_t));
|
|
+ pthread_t *tids = (pthread_t *)calloc(thread_count, sizeof(pthread_t));
|
|
if (tids == NULL) {
|
|
SLogError("Malloc memory for tworkers failed.");
|
|
return NULL;
|
|
@@ -214,8 +331,9 @@ static pthread_t *tswitchless_init_workers(sl_task_pool_t *pool)
|
|
return NULL;
|
|
}
|
|
|
|
- for (uint32_t i = 0; i < pool_cfg->num_tworkers; ++i) {
|
|
- ret = pthread_create(tids + i, &attr, tswitchless_thread_routine, pool);
|
|
+ for (uint32_t i = 0; i < thread_count; ++i) {
|
|
+ // If the policy is WORKERS_POLICY_WAKEUP, the first is the scheduling thread.
|
|
+ ret = pthread_create(tids + i, &attr, tswitchless_get_thread_func(is_workers_policy_wakeup && i == 0), pool);
|
|
if (ret != 0) {
|
|
tswitchless_fini_workers(pool, tids);
|
|
free(tids);
|
|
diff --git a/src/host_src/gp/gp_enclave.c b/src/host_src/gp/gp_enclave.c
|
|
index 27952e7..f77cdd8 100644
|
|
--- a/src/host_src/gp/gp_enclave.c
|
|
+++ b/src/host_src/gp/gp_enclave.c
|
|
@@ -10,6 +10,8 @@
|
|
* See the Mulan PSL v2 for more details.
|
|
*/
|
|
|
|
+#include "gp_enclave.h"
|
|
+
|
|
#include <stdint.h>
|
|
#include <malloc.h>
|
|
#include <string.h>
|
|
@@ -20,10 +22,8 @@
|
|
#include <tee_client_type.h>
|
|
|
|
#include "secgear_defs.h"
|
|
-#include "enclave.h"
|
|
-#include "enclave_internal.h"
|
|
#include "enclave_log.h"
|
|
-#include "gp_enclave.h"
|
|
+#include "secgear_uswitchless.h"
|
|
#include "register_agent.h"
|
|
#include "gp_uswitchless.h"
|
|
#include "gp_shared_memory_defs.h"
|
|
@@ -370,13 +370,13 @@ cc_enclave_result_t init_uswitchless(cc_enclave_t *enclave, const enclave_featur
|
|
return CC_ERROR_SWITCHLESS_REINIT;
|
|
}
|
|
|
|
- sl_task_pool_config_t *cfg = (sl_task_pool_config_t *)feature->feature_desc;
|
|
- if (!uswitchless_is_valid_config(cfg)) {
|
|
+ cc_sl_config_t cfg = *((cc_sl_config_t *)feature->feature_desc);
|
|
+ if (!uswitchless_is_valid_config(&cfg)) {
|
|
return CC_ERROR_BAD_PARAMETERS;
|
|
}
|
|
- uswitchless_adjust_config(cfg);
|
|
+ uswitchless_adjust_config(&cfg);
|
|
|
|
- size_t pool_buf_len = sl_get_pool_buf_len_by_config(cfg);
|
|
+ size_t pool_buf_len = sl_get_pool_buf_len_by_config(&cfg);
|
|
void *pool_buf = gp_malloc_shared_memory(enclave, pool_buf_len, true);
|
|
if (pool_buf == NULL) {
|
|
return CC_ERROR_OUT_OF_MEMORY;
|
|
@@ -384,10 +384,10 @@ cc_enclave_result_t init_uswitchless(cc_enclave_t *enclave, const enclave_featur
|
|
(void)memset(pool_buf, 0, pool_buf_len);
|
|
|
|
// Fill config
|
|
- (void)memcpy(pool_buf, cfg, sizeof(sl_task_pool_config_t));
|
|
+ (void)memcpy(pool_buf, &cfg, sizeof(cc_sl_config_t));
|
|
|
|
// Layout task pool
|
|
- sl_task_pool_t *pool = uswitchless_create_task_pool(pool_buf, cfg);
|
|
+ sl_task_pool_t *pool = uswitchless_create_task_pool(pool_buf, &cfg);
|
|
if (pool == NULL) {
|
|
(void)gp_free_shared_memory(enclave, pool_buf);
|
|
return CC_ERROR_OUT_OF_MEMORY;
|
|
diff --git a/src/host_src/gp/gp_enclave.h b/src/host_src/gp/gp_enclave.h
|
|
index e788ed3..2fdfc99 100644
|
|
--- a/src/host_src/gp/gp_enclave.h
|
|
+++ b/src/host_src/gp/gp_enclave.h
|
|
@@ -15,6 +15,8 @@
|
|
|
|
#include "tee_client_api.h"
|
|
#include "switchless_defs.h"
|
|
+#include "enclave.h"
|
|
+#include "enclave_internal.h"
|
|
|
|
enum
|
|
{
|
|
diff --git a/src/host_src/gp/gp_uswitchless.c b/src/host_src/gp/gp_uswitchless.c
|
|
index 8db756e..f1288c2 100644
|
|
--- a/src/host_src/gp/gp_uswitchless.c
|
|
+++ b/src/host_src/gp/gp_uswitchless.c
|
|
@@ -34,19 +34,20 @@
|
|
#define SWITCHLESS_DEFAULT_TWORKERS 8
|
|
#define SWITCHLESS_DEFAULT_POOL_SIZE_QWORDS 1
|
|
|
|
-bool uswitchless_is_valid_config(sl_task_pool_config_t *cfg)
|
|
+bool uswitchless_is_valid_config(cc_sl_config_t *cfg)
|
|
{
|
|
if ((cfg->num_uworkers > SWITCHLESS_MAX_UWORKERS) ||
|
|
(cfg->num_tworkers > SWITCHLESS_MAX_TWORKERS) ||
|
|
(cfg->num_max_params > SWITCHLESS_MAX_PARAMETER_NUM) ||
|
|
- (cfg->call_pool_size_qwords > SWITCHLESS_MAX_POOL_SIZE_QWORDS)) {
|
|
+ (cfg->sl_call_pool_size_qwords > SWITCHLESS_MAX_POOL_SIZE_QWORDS) ||
|
|
+ (cfg->workers_policy >= WORKERS_POLICY_MAX)) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
-void uswitchless_adjust_config(sl_task_pool_config_t *cfg)
|
|
+void uswitchless_adjust_config(cc_sl_config_t *cfg)
|
|
{
|
|
if (cfg->num_uworkers == 0) {
|
|
cfg->num_uworkers = SWITCHLESS_DEFAULT_UWORKERS;
|
|
@@ -56,14 +57,14 @@ void uswitchless_adjust_config(sl_task_pool_config_t *cfg)
|
|
cfg->num_tworkers = SWITCHLESS_DEFAULT_TWORKERS;
|
|
}
|
|
|
|
- if (cfg->call_pool_size_qwords == 0) {
|
|
- cfg->call_pool_size_qwords = SWITCHLESS_DEFAULT_POOL_SIZE_QWORDS;
|
|
+ if (cfg->sl_call_pool_size_qwords == 0) {
|
|
+ cfg->sl_call_pool_size_qwords = SWITCHLESS_DEFAULT_POOL_SIZE_QWORDS;
|
|
}
|
|
}
|
|
|
|
-sl_task_pool_t *uswitchless_create_task_pool(void *pool_buf, sl_task_pool_config_t *pool_cfg)
|
|
+sl_task_pool_t *uswitchless_create_task_pool(void *pool_buf, cc_sl_config_t *pool_cfg)
|
|
{
|
|
- size_t bit_buf_size = pool_cfg->call_pool_size_qwords * sizeof(uint64_t);
|
|
+ size_t bit_buf_size = pool_cfg->sl_call_pool_size_qwords * sizeof(uint64_t);
|
|
sl_task_pool_t *pool = (sl_task_pool_t *)calloc(sizeof(sl_task_pool_t) + bit_buf_size, sizeof(char));
|
|
if (pool == NULL) {
|
|
return NULL;
|
|
@@ -76,7 +77,7 @@ sl_task_pool_t *uswitchless_create_task_pool(void *pool_buf, sl_task_pool_config
|
|
pool->pool_buf = (char *)pool_buf;
|
|
pool->free_bit_buf = (uint64_t *)((char *)pool + sizeof(sl_task_pool_t));
|
|
(void)memset(pool->free_bit_buf, 0xFF, bit_buf_size);
|
|
- pool->signal_bit_buf = (uint64_t *)(pool->pool_buf + sizeof(sl_task_pool_config_t));
|
|
+ pool->signal_bit_buf = (uint64_t *)(pool->pool_buf + sizeof(cc_sl_config_t));
|
|
pool->task_buf = (char *)pool->signal_bit_buf + pool->bit_buf_size;
|
|
|
|
return pool;
|
|
@@ -99,7 +100,7 @@ bool uswitchless_is_valid_param_num(cc_enclave_t *enclave, uint32_t argc)
|
|
int uswitchless_get_idle_task_index(cc_enclave_t *enclave)
|
|
{
|
|
sl_task_pool_t *pool = USWITCHLESS_TASK_POOL(enclave);
|
|
- int call_pool_size_qwords = (int)pool->pool_cfg.call_pool_size_qwords;
|
|
+ int call_pool_size_qwords = (int)pool->pool_cfg.sl_call_pool_size_qwords;
|
|
uint64_t *free_bit_buf = pool->free_bit_buf;
|
|
int start_bit = 0;
|
|
int end_bit = 0;
|
|
diff --git a/src/host_src/gp/gp_uswitchless.h b/src/host_src/gp/gp_uswitchless.h
|
|
index e435ad1..4d957ce 100644
|
|
--- a/src/host_src/gp/gp_uswitchless.h
|
|
+++ b/src/host_src/gp/gp_uswitchless.h
|
|
@@ -19,6 +19,7 @@
|
|
#include <stdbool.h>
|
|
#include "enclave.h"
|
|
#include "switchless_defs.h"
|
|
+#include "secgear_uswitchless.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
@@ -32,7 +33,7 @@ extern "C" {
|
|
* true: valid
|
|
* false: invalid
|
|
*/
|
|
-bool uswitchless_is_valid_config(sl_task_pool_config_t *cfg);
|
|
+bool uswitchless_is_valid_config(cc_sl_config_t *cfg);
|
|
|
|
/*
|
|
* Summary: Adjusting default configurations
|
|
@@ -40,7 +41,7 @@ bool uswitchless_is_valid_config(sl_task_pool_config_t *cfg);
|
|
* cfg: configuration information of the task pool
|
|
* Return: NA
|
|
*/
|
|
-void uswitchless_adjust_config(sl_task_pool_config_t *cfg);
|
|
+void uswitchless_adjust_config(cc_sl_config_t *cfg);
|
|
|
|
/*
|
|
* Summary: initializing the switchless invoking task pool
|
|
@@ -49,7 +50,7 @@ void uswitchless_adjust_config(sl_task_pool_config_t *cfg);
|
|
* pool_cfg: configuration information of the task pool
|
|
* Return: NA
|
|
*/
|
|
-sl_task_pool_t *uswitchless_create_task_pool(void *pool_buf, sl_task_pool_config_t *pool_cfg);
|
|
+sl_task_pool_t *uswitchless_create_task_pool(void *pool_buf, cc_sl_config_t *pool_cfg);
|
|
|
|
/*
|
|
* Summary: obtains the index of an idle task area from specified enclave
|
|
--
|
|
2.27.0
|
|
|