1. Add the function of setting the uadk log level, include error,
info, debug by syslog.
2. The number of packets in a queue can be read through the
'uadk_tool'.
3. The 'uadk_tool' supports displaying the library build date. supports
displaying the environment variables.
Signed-off-by: Kai Ye <yekai13(a)huawei.com>
---
0 | 0
Makefile.am | 7 +-
include/drv/wd_aead_drv.h | 1 +
include/drv/wd_cipher_drv.h | 1 +
include/drv/wd_dh_drv.h | 1 +
include/drv/wd_digest_drv.h | 1 +
include/drv/wd_ecc_drv.h | 1 +
include/drv/wd_rsa_drv.h | 1 +
include/wd.h | 69 +++--
include/wd_util.h | 25 +-
test/hisi_zip_test/test_lib.c | 2 +
uadk_tool/Makefile.am | 11 +-
.../{ => benchmark}/sec_soft_benchmark.c | 0
.../{ => benchmark}/sec_soft_benchmark.h | 0
.../{ => benchmark}/sec_uadk_benchmark.c | 0
.../{ => benchmark}/sec_uadk_benchmark.h | 0
uadk_tool/{ => benchmark}/sec_wd_benchmark.c | 0
uadk_tool/{ => benchmark}/sec_wd_benchmark.h | 0
uadk_tool/{ => benchmark}/uadk_benchmark.c | 3 +-
uadk_tool/{ => benchmark}/uadk_benchmark.h | 2 +-
uadk_tool/dfx/uadk_dfx.c | 253 ++++++++++++++++++
uadk_tool/{ => dfx}/uadk_dfx.h | 3 -
uadk_tool/uadk_dfx.c | 79 ------
uadk_tool/uadk_tool.c | 21 +-
wd.c | 79 +++++-
wd_aead.c | 9 +-
wd_cipher.c | 8 +
wd_comp.c | 2 +
wd_dh.c | 7 +
wd_digest.c | 7 +
wd_ecc.c | 11 +-
wd_rsa.c | 7 +
wd_util.c | 91 ++++++-
33 files changed, 564 insertions(+), 138 deletions(-)
create mode 100644 0
rename uadk_tool/{ => benchmark}/sec_soft_benchmark.c (100%)
rename uadk_tool/{ => benchmark}/sec_soft_benchmark.h (100%)
rename uadk_tool/{ => benchmark}/sec_uadk_benchmark.c (100%)
rename uadk_tool/{ => benchmark}/sec_uadk_benchmark.h (100%)
rename uadk_tool/{ => benchmark}/sec_wd_benchmark.c (100%)
rename uadk_tool/{ => benchmark}/sec_wd_benchmark.h (100%)
rename uadk_tool/{ => benchmark}/uadk_benchmark.c (99%)
rename uadk_tool/{ => benchmark}/uadk_benchmark.h (97%)
create mode 100644 uadk_tool/dfx/uadk_dfx.c
rename uadk_tool/{ => dfx}/uadk_dfx.h (59%)
delete mode 100644 uadk_tool/uadk_dfx.c
diff --git a/0 b/0
new file mode 100644
index 0000000..e69de29
diff --git a/Makefile.am b/Makefile.am
index 0bda2f7..05d6bc7 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -23,7 +23,11 @@ MINOR = 3
REVISION = 34
UADK_VERSION = -version-number ${MAJOR}:${MINOR}:${REVISION}
-AM_CFLAGS+= -DUADK_VERSION_NUMBER="\"libwd version: ${MAJOR}.${MINOR}.${REVISION}\""
+DAY = 11
+MONTH = Jun
+YEAR = 2022
+AM_CFLAGS+= -DUADK_VERSION_NUMBER="\"UADK version: ${MAJOR}.${MINOR}.${REVISION}\""
+AM_CFLAGS+= -DUADK_RELEASED_TIME="\"Released ${MONTH} ${DAY}, ${YEAR}\""
include_HEADERS = include/wd.h include/wd_cipher.h include/wd_aead.h \
include/wd_comp.h include/wd_dh.h include/wd_digest.h \
@@ -78,6 +82,7 @@ libhisi_hpre_la_SOURCES=drv/hisi_hpre.c drv/hisi_qm_udrv.c \
hisi_qm_udrv.h wd_hpre_drv.h
if WD_STATIC_DRV
AM_CFLAGS += -DWD_STATIC_DRV
+AM_CFLAGS += -DWD_NO_LOG
libwd_la_LIBADD = $(libwd_la_OBJECTS) -lnuma
diff --git a/include/drv/wd_aead_drv.h b/include/drv/wd_aead_drv.h
index cca28ba..de4a7d7 100644
--- a/include/drv/wd_aead_drv.h
+++ b/include/drv/wd_aead_drv.h
@@ -76,6 +76,7 @@ struct wd_aead_driver {
void wd_aead_set_driver(struct wd_aead_driver *drv);
struct wd_aead_driver *wd_aead_get_driver(void);
+struct wd_aead_msg *wd_aead_get_msg(__u32 idx, __u32 tag);
#ifdef WD_STATIC_DRV
#define WD_AEAD_SET_DRIVER(drv) \
diff --git a/include/drv/wd_cipher_drv.h b/include/drv/wd_cipher_drv.h
index 84c9844..a8da8cc 100644
--- a/include/drv/wd_cipher_drv.h
+++ b/include/drv/wd_cipher_drv.h
@@ -62,6 +62,7 @@ struct wd_cipher_driver {
void wd_cipher_set_driver(struct wd_cipher_driver *drv);
struct wd_cipher_driver *wd_cipher_get_driver(void);
+struct wd_cipher_msg *wd_cipher_get_msg(__u32 idx, __u32 tag);
#ifdef WD_STATIC_DRV
#define WD_CIPHER_SET_DRIVER(drv) \
diff --git a/include/drv/wd_dh_drv.h b/include/drv/wd_dh_drv.h
index f8e3065..57f774d 100644
--- a/include/drv/wd_dh_drv.h
+++ b/include/drv/wd_dh_drv.h
@@ -36,6 +36,7 @@ struct wd_dh_driver {
void wd_dh_set_driver(struct wd_dh_driver *drv);
struct wd_dh_driver *wd_dh_get_driver(void);
+struct wd_dh_msg *wd_dh_get_msg(__u32 idx, __u32 tag);
#ifdef WD_STATIC_DRV
#define WD_DH_SET_DRIVER(drv) \
diff --git a/include/drv/wd_digest_drv.h b/include/drv/wd_digest_drv.h
index 10ce6e1..39839f6 100644
--- a/include/drv/wd_digest_drv.h
+++ b/include/drv/wd_digest_drv.h
@@ -64,6 +64,7 @@ struct wd_digest_driver {
void wd_digest_set_driver(struct wd_digest_driver *drv);
struct wd_digest_driver *wd_digest_get_driver(void);
+struct wd_digest_msg *wd_digest_get_msg(__u32 idx, __u32 tag);
#ifdef WD_STATIC_DRV
#define WD_DIGEST_SET_DRIVER(drv) \
diff --git a/include/drv/wd_ecc_drv.h b/include/drv/wd_ecc_drv.h
index ef98606..c72cd8f 100644
--- a/include/drv/wd_ecc_drv.h
+++ b/include/drv/wd_ecc_drv.h
@@ -190,6 +190,7 @@ struct wd_ecc_driver {
void wd_ecc_set_driver(struct wd_ecc_driver *drv);
struct wd_ecc_driver *wd_ecc_get_driver(void);
+struct wd_ecc_msg *wd_ecc_get_msg(__u32 idx, __u32 tag);
#ifdef WD_STATIC_DRV
#define WD_ECC_SET_DRIVER(drv) \
diff --git a/include/drv/wd_rsa_drv.h b/include/drv/wd_rsa_drv.h
index 28c3337..22aa159 100644
--- a/include/drv/wd_rsa_drv.h
+++ b/include/drv/wd_rsa_drv.h
@@ -59,6 +59,7 @@ struct wd_rsa_driver {
void wd_rsa_set_driver(struct wd_rsa_driver *drv);
struct wd_rsa_driver *wd_rsa_get_driver(void);
+struct wd_rsa_msg *wd_rsa_get_msg(__u32 idx, __u32 tag);
#ifdef WD_STATIC_DRV
#define WD_RSA_SET_DRIVER(drv) \
diff --git a/include/wd.h b/include/wd.h
index 56c4109..8c45522 100644
--- a/include/wd.h
+++ b/include/wd.h
@@ -8,9 +8,11 @@
#define __WD_H
#include <errno.h>
#include <fcntl.h>
+#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
+#include <syslog.h>
#include <unistd.h>
#include <asm/types.h>
#include "uacce.h"
@@ -25,39 +27,37 @@ extern "C" {
#define MAX_DEV_NAME_LEN 256
#define LINUX_CRTDIR_SIZE 1
#define LINUX_PRTDIR_SIZE 2
+#define WD_CTX_CNT_NUM 1024
+#define WD_IPC_KEY 0x500011
typedef void (*wd_log)(const char *format, ...);
-#ifndef WD_ERR
-#ifndef WITH_LOG_FILE
-extern wd_log log_out;
-
-#define __WD_FILENAME__ (strrchr(__FILE__, '/') ? \
- ((char *)((uintptr_t)strrchr(__FILE__, '/') + 1)) : __FILE__)
-
-#define WD_ERR(format, args...) \
- (log_out ? log_out("[%s, %d, %s]:"format, \
- __WD_FILENAME__, __LINE__, __func__, ##args) : \
- fprintf(stderr, format, ##args))
+#ifndef WD_NO_LOG
+#define WD_DEBUG(fmt, args...) \
+ do {\
+ openlog("uadk-debug", LOG_CONS | LOG_PID, LOG_LOCAL5);\
+ syslog(LOG_DEBUG, fmt, ##args);\
+ } while (0)
+
+#define WD_INFO(fmt, args...) \
+ do {\
+ openlog("uadk-info", LOG_CONS | LOG_PID, LOG_LOCAL5);\
+ syslog(LOG_INFO, fmt, ##args);\
+ } while (0)
+
+#define WD_ERR(fmt, args...) \
+ do {\
+ openlog("uadk-err", LOG_CONS | LOG_PID, LOG_LOCAL5);\
+ syslog(LOG_ERR, fmt, ##args);\
+ } while (0)
#else
-extern FILE *flog_fd;
-#define WD_ERR(format, args...) do { \
- if (!flog_fd) \
- flog_fd = fopen(WITH_LOG_FILE, "a+"); \
- if (flog_fd) \
- fprintf(flog_fd, format, ##args); \
- else \
- fprintf(stderr, "log %s not exists!", \
- WITH_LOG_FILE); \
-} while (0)
-#endif
+#define OPEN_LOG(s)
+#define WD_DEBUG(fmt, args...) fprintf(stderr, fmt, ##args)
+#define WD_INFO(fmt, args...) fprintf(stderr, fmt, ##args)
+#define WD_ERR(fmt, args...) fprintf(stderr, fmt, ##args)
#endif
-#ifdef DEBUG_LOG
-#define dbg(msg, ...) fprintf(stderr, msg, ##__VA_ARGS__)
-#else
-#define dbg(msg, ...)
-#endif
+#define WD_CONSOLE printf
/* WD error code */
#define WD_SUCCESS 0
@@ -488,6 +488,21 @@ void wd_mempool_stats(handle_t mempool, struct wd_mempool_stats *stats);
*/
void wd_blockpool_stats(handle_t blkpool, struct wd_blockpool_stats *stats);
+/**
+ * wd_get_version() - Get the libwd version number and released time.
+ */
+void wd_get_version(void);
+
+/**
+ * wd_need_debug() - Get the debug flag from rsyslog.cnf
+ */
+bool wd_need_debug(void);
+
+/**
+ * wd_need_info() - Get the info flag from rsyslog.cnf
+ */
+bool wd_need_info(void);
+
#ifdef __cplusplus
}
#endif
diff --git a/include/wd_util.h b/include/wd_util.h
index eb250f0..83a9684 100644
--- a/include/wd_util.h
+++ b/include/wd_util.h
@@ -8,6 +8,8 @@
#define __WD_UTIL_H
#include <stdbool.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
#include <asm/types.h>
#include "wd_alg_common.h"
@@ -292,7 +294,7 @@ int wd_add_task_to_async_queue(struct wd_env_config *config, __u32 idx);
*/
void dump_env_info(struct wd_env_config *config);
-/*
+/**
* wd_alg_get_env_param() - get specific ctx number.
* @config: Pointer of wd_env_config which is used to store environment
* variable information.
@@ -304,7 +306,7 @@ int wd_alg_get_env_param(struct wd_env_config *env_config,
struct wd_ctx_attr attr,
__u32 *num, __u8 *is_enable);
-/*
+/**
* wd_set_ctx_attr() - set node type and mode for ctx
* @ctx_attr: ctx attributes pointer.
* @node: numa id.
@@ -315,7 +317,7 @@ int wd_alg_get_env_param(struct wd_env_config *env_config,
int wd_set_ctx_attr(struct wd_ctx_attr *ctx_attr,
__u32 node, __u32 type, __u8 mode, __u32 num);
-/*
+/**
* wd_check_ctx() - check ctx mode and index
* @config: ctx config pointer.
* @mode: synchronous or asynchronous mode.
@@ -354,6 +356,23 @@ int wd_handle_msg_sync(struct wd_msg_handle *msg_handle, handle_t ctx,
*/
int wd_init_param_check(struct wd_ctx_config *config, struct wd_sched *sched);
+/**
+ * wd_dfx_msg_cnt() - Message counter interface for ctx
+ * @msg: Shared memory addr.
+ * @numSize: Number of elements.
+ * @index: Indicates the CTX index.
+ */
+static inline void wd_dfx_msg_cnt(unsigned long *msg, __u32 numsize, __u32 idx)
+{
+ bool ret;
+
+ ret = wd_need_info();
+ if (idx > numsize || !ret)
+ return;
+
+ msg[idx]++;
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/test/hisi_zip_test/test_lib.c b/test/hisi_zip_test/test_lib.c
index 374244a..5918699 100644
--- a/test/hisi_zip_test/test_lib.c
+++ b/test/hisi_zip_test/test_lib.c
@@ -22,6 +22,8 @@ struct check_rand_ctx {
unsigned short state[3];
};
+#define dbg(msg, ...) fprintf(stderr, msg, ##__VA_ARGS__)
+
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_spinlock_t lock;
static int count = 0;
diff --git a/uadk_tool/Makefile.am b/uadk_tool/Makefile.am
index da5b229..f04b2f0 100644
--- a/uadk_tool/Makefile.am
+++ b/uadk_tool/Makefile.am
@@ -1,13 +1,16 @@
ACLOCAL_AMFLAGS = -I m4 -I./include
-AM_CFLAGS=-Wall -fno-strict-aliasing -I$(top_srcdir) -I$(top_srcdir)/include \
+AUTOMAKE_OPTIONS = foreign subdir-objects
+AM_CFLAGS=-Wall -fno-strict-aliasing -I$(top_srcdir) -I$(top_srcdir)/benchmark/include \
-pthread
#AUTOMAKE_OPTIONS = subdir-objects
bin_PROGRAMS=uadk_tool
-uadk_tool_SOURCES=uadk_tool.c uadk_dfx.c uadk_benchmark.c \
- sec_uadk_benchmark.c sec_wd_benchmark.c
+uadk_tool_SOURCES=uadk_tool.c dfx/uadk_dfx.c dfx/uadk_dfx.h \
+ benchmark/uadk_benchmark.c benchmark/uadk_benchmark.h \
+ benchmark/sec_uadk_benchmark.c benchmark/sec_uadk_benchmark.h \
+ benchmark/sec_wd_benchmark.c benchmark/sec_wd_benchmark.h
if WD_STATIC_DRV
AM_CFLAGS+=-Bstatic
@@ -27,7 +30,7 @@ uadk_tool_LDFLAGS=-Wl,-rpath,'/usr/local/lib'
if WITH_OPENSSL_DIR
AM_CFLAGS+= -DWITH_OPENSSL_DIR -I$(with_openssl_dir)/include
-uadk_tool_SOURCES+=sec_soft_benchmark.c
+uadk_tool_SOURCES+=benchmark/sec_soft_benchmark.c benchmark/sec_soft_benchmark.h
if WD_STATIC_DRV
uadk_tool_LDADD+= $(with_openssl_dir)/libcrypto.a
diff --git a/uadk_tool/sec_soft_benchmark.c b/uadk_tool/benchmark/sec_soft_benchmark.c
similarity index 100%
rename from uadk_tool/sec_soft_benchmark.c
rename to uadk_tool/benchmark/sec_soft_benchmark.c
diff --git a/uadk_tool/sec_soft_benchmark.h b/uadk_tool/benchmark/sec_soft_benchmark.h
similarity index 100%
rename from uadk_tool/sec_soft_benchmark.h
rename to uadk_tool/benchmark/sec_soft_benchmark.h
diff --git a/uadk_tool/sec_uadk_benchmark.c b/uadk_tool/benchmark/sec_uadk_benchmark.c
similarity index 100%
rename from uadk_tool/sec_uadk_benchmark.c
rename to uadk_tool/benchmark/sec_uadk_benchmark.c
diff --git a/uadk_tool/sec_uadk_benchmark.h b/uadk_tool/benchmark/sec_uadk_benchmark.h
similarity index 100%
rename from uadk_tool/sec_uadk_benchmark.h
rename to uadk_tool/benchmark/sec_uadk_benchmark.h
diff --git a/uadk_tool/sec_wd_benchmark.c b/uadk_tool/benchmark/sec_wd_benchmark.c
similarity index 100%
rename from uadk_tool/sec_wd_benchmark.c
rename to uadk_tool/benchmark/sec_wd_benchmark.c
diff --git a/uadk_tool/sec_wd_benchmark.h b/uadk_tool/benchmark/sec_wd_benchmark.h
similarity index 100%
rename from uadk_tool/sec_wd_benchmark.h
rename to uadk_tool/benchmark/sec_wd_benchmark.h
diff --git a/uadk_tool/uadk_benchmark.c b/uadk_tool/benchmark/uadk_benchmark.c
similarity index 99%
rename from uadk_tool/uadk_benchmark.c
rename to uadk_tool/benchmark/uadk_benchmark.c
index 8c3c96f..84941d5 100644
--- a/uadk_tool/uadk_benchmark.c
+++ b/uadk_tool/benchmark/uadk_benchmark.c
@@ -567,7 +567,7 @@ static void print_help(void)
ACC_TST_PRT("UPDATE:2021-7-28\n");
}
-void benchmark_cmd_parse(int argc, char *argv[], struct acc_option *option)
+int acc_cmd_parse(int argc, char *argv[], struct acc_option *option)
{
int option_index = 0;
int c;
@@ -638,6 +638,7 @@ void benchmark_cmd_parse(int argc, char *argv[], struct acc_option *option)
exit(-1);
}
}
+ return 0;
}
int acc_option_convert(struct acc_option *option)
diff --git a/uadk_tool/uadk_benchmark.h b/uadk_tool/benchmark/uadk_benchmark.h
similarity index 97%
rename from uadk_tool/uadk_benchmark.h
rename to uadk_tool/benchmark/uadk_benchmark.h
index 7ce0426..2cb3dc0 100644
--- a/uadk_tool/uadk_benchmark.h
+++ b/uadk_tool/benchmark/uadk_benchmark.h
@@ -170,7 +170,7 @@ extern void add_recv_data(u32 cnt);
extern void add_send_complete(void);
extern u32 get_recv_time(void);
-void benchmark_cmd_parse(int argc, char *argv[], struct acc_option *option);
+int acc_cmd_parse(int argc, char *argv[], struct acc_option *option);
int acc_default_case(struct acc_option *option);
int acc_option_convert(struct acc_option *option);
int acc_benchmark_run(struct acc_option *option);
diff --git a/uadk_tool/dfx/uadk_dfx.c b/uadk_tool/dfx/uadk_dfx.c
new file mode 100644
index 0000000..796135a
--- /dev/null
+++ b/uadk_tool/dfx/uadk_dfx.c
@@ -0,0 +1,253 @@
+/* SPDX-License-Identifier: Apache-2.0 */
+
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <getopt.h>
+#include <unistd.h>
+#include <limits.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+#include "include/wd.h"
+#include "uadk_dfx.h"
+
+#define uadk_build_date() printf("built on: %s %s\n", __DATE__, __TIME__)
+#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+#define PRIVILEGE_FLAG 666
+
+struct uadk_env_var {
+ const char *module;
+ const char *alg;
+ const char *ctx_num_var;
+ const char *epoll_en_var;
+};
+
+struct uadk_env_table {
+ int sync_ctx_num;
+ int sync_numa;
+ int async_ctx_num;
+ int async_numa;
+ int poll_en;
+};
+
+enum dfx_op_type {
+ DISPLAY_VERSION = 2,
+ DISPLAY_DATE,
+ DISPLAY_DIR,
+ DISPLAY_ENV,
+ DISPLAY_COUNT,
+ DISPLAY_HELP,
+};
+
+const char *uadk_modules[] = {"sec", "hpre", "zip"};
+
+const struct uadk_env_var env_vars[] = {
+ {.module = "sec", .alg = "CIPHER", .ctx_num_var = "WD_CIPHER_CTX_NUM",
+ .epoll_en_var = "WD_CIPHER_EPOLL_EN"},
+ {.module = "sec", .alg = "AEAD", .ctx_num_var = "WD_AEAD_CTX_NUM",
+ .epoll_en_var = "WD_AEAD_EPOLL_EN"},
+ {.module = "sec", .alg = "DIGEST", .ctx_num_var = "WD_DIGEST_CTX_NUM",
+ .epoll_en_var = "WD_DIGEST_EPOLL_EN"},
+ {.module = "hpre", .alg = "DH", .ctx_num_var = "WD_DH_CTX_NUM",
+ .epoll_en_var = "WD_DH_EPOLL_EN"},
+ {.module = "hpre", .alg = "RSA", .ctx_num_var = "WD_RSA_CTX_NUM",
+ .epoll_en_var = "WD_RSA_EPOLL_EN"},
+ {.module = "hpre", .alg = "ECC", .ctx_num_var = "WD_ECC_CTX_NUM",
+ .epoll_en_var = "WD_ECC_EPOLL_EN"},
+ {.module = "zip", .alg = "COMP", .ctx_num_var = "WD_COMP_CTX_NUM",
+ .epoll_en_var = "WD_COMP_EPOLL_EN"},
+};
+
+static void dump_ctx_count(unsigned long *count)
+{
+ __u32 idx = 0;
+ int i;
+
+ if (!count)
+ return;
+
+ printf("displays the ctx counter value...\n");
+ for (i = 0; i < WD_CTX_CNT_NUM; i++) {
+ if (count[i]) {
+ printf("ctx-[%d]:%lu \t", i, count[i]);
+ idx++;
+ } else {
+ continue;
+ }
+
+ if ((idx & 0x3) == 0)
+ printf("\n");
+ }
+ printf("\n");
+}
+
+static int get_shared_id(void)
+{
+ int shm;
+
+ shm = shmget(WD_IPC_KEY, sizeof(unsigned long) * WD_CTX_CNT_NUM,
+ IPC_CREAT | PRIVILEGE_FLAG);
+ if (shm < 0) {
+ printf("failed to get the shared memory id.\n");
+ return -EINVAL;
+ }
+
+ return shm;
+}
+
+static int uadk_shared_read(void)
+{
+ unsigned long *shared;
+ void *ptr;
+ int shm;
+
+ shm = get_shared_id();
+ if (shm < 0)
+ return -EINVAL;
+
+ ptr = (int *)shmat(shm, NULL, 0);
+ if (ptr < 0) {
+ printf("failed to get the shared memory addr.\n");
+ return -EINVAL;
+ }
+
+ shared = (unsigned long *)ptr;
+
+ printf("get the shared memory addr successful.\n");
+ dump_ctx_count(shared);
+
+ shmdt(ptr);
+
+ return 0;
+}
+
+bool uadk_check_module(const char *module)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(uadk_modules); i++) {
+ if (!strncmp(module, uadk_modules[i], strlen(module)))
+ return true;
+ }
+
+ return false;
+}
+
+static void uadk_ctx_env_config(const char *s)
+{
+ char *env_setion;
+
+ if (!s) {
+ printf("input ctx env config is NULL.\n");
+ return;
+ }
+
+ env_setion = getenv(s);
+ if (!env_setion) {
+ printf("not found the %s env config!\n", s);
+ return;
+ }
+
+ printf("%s=%s\n", s, env_setion);
+}
+
+static void uadk_parse_env_config(const char *module)
+{
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(env_vars); i++) {
+ if (!strncmp(module, env_vars[i].module, strlen(module))) {
+ uadk_ctx_env_config(env_vars[i].ctx_num_var);
+ uadk_ctx_env_config(env_vars[i].epoll_en_var);
+ }
+ }
+}
+
+static void uadk_exe_path(void)
+{
+ char dir[PATH_MAX] = {0};
+ int n;
+
+ n = readlink("/proc/self/exe", dir, PATH_MAX);
+ if (n < 0 || n >= PATH_MAX)
+ printf("uadk tool failed to get the exe path.\n");
+
+ dir[PATH_MAX - 1] = '\0';
+ printf("exe path: %s\n", dir);
+}
+
+void print_dfx_help(void)
+{
+ printf("NAME\n");
+ printf(" uadk_tool dfx : uadk library dfx function, etc\n");
+ printf("USAGE\n");
+ printf(" uadk_tool dfx [--version] = Show library version\n");
+ printf(" uadk_tool dfx [--date] = Show build date\n");
+ printf(" uadk_tool dfx [--dir] = Show library dir\n");
+ printf(" uadk_tool dfx [--env] = Show environment variables\n");
+ printf(" uadk_tool dfx [--count] = Show the ctx message count\n");
+ printf(" uadk_tool dfx [--help] = usage\n");
+ printf("Example\n");
+ printf(" uadk_tool dfx --version\n");
+ printf(" uadk_tool dfx --env sec\n");
+ printf(" uadk_tool dfx --count\n");
+}
+
+void dfx_cmd_parse(int argc, char *argv[])
+{
+ bool check_module = false;
+ char *input_module = NULL;
+ int option_index = 0;
+ int opt;
+
+ static struct option long_options[] = {
+ {"version", no_argument, 0, 2},
+ {"date", no_argument, 0, 3},
+ {"dir", no_argument, 0, 4},
+ {"env", required_argument, 0, 5},
+ {"count", no_argument, 0, 6},
+ {"help", no_argument, 0, 7},
+ {0, 0, 0, 0}
+ };
+
+ while (1) {
+ opt = getopt_long(argc, argv, "", long_options, &option_index);
+ if (opt == -1)
+ break;
+
+ switch (opt) {
+ case DISPLAY_VERSION:
+ wd_get_version();
+ break;
+ case DISPLAY_DATE:
+ uadk_build_date();
+ break;
+ case DISPLAY_DIR:
+ uadk_exe_path();
+ break;
+ case DISPLAY_ENV:
+ input_module = optarg;
+ check_module = uadk_check_module(input_module);
+ if (check_module) {
+ uadk_parse_env_config(input_module);
+ } else {
+ print_dfx_help();
+ printf("failed to parse module parameter!\n");
+ }
+ break;
+ case DISPLAY_COUNT:
+ uadk_shared_read();
+ break;
+ case DISPLAY_HELP:
+ print_dfx_help();
+ break;
+ default:
+ printf("bad input parameter, exit!\n");
+ print_dfx_help();
+ break;
+ }
+ }
+}
diff --git a/uadk_tool/uadk_dfx.h b/uadk_tool/dfx/uadk_dfx.h
similarity index 59%
rename from uadk_tool/uadk_dfx.h
rename to uadk_tool/dfx/uadk_dfx.h
index 5f5d9e7..8dc1da1 100644
--- a/uadk_tool/uadk_dfx.h
+++ b/uadk_tool/dfx/uadk_dfx.h
@@ -2,9 +2,6 @@
#ifndef UADK_DFX_H
#define UADK_DFX_H
-#define UADK_VERSION_TEXT "UADK 2.3.22, Released Dec 20th, 2021"
-#define UADK_VERSION_TAG "4b9c69d"
-
void print_dfx_help(void);
void dfx_cmd_parse(int argc, char *argv[]);
#endif
diff --git a/uadk_tool/uadk_dfx.c b/uadk_tool/uadk_dfx.c
deleted file mode 100644
index 96c4919..0000000
--- a/uadk_tool/uadk_dfx.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/* SPDX-License-Identifier: Apache-2.0 */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <getopt.h>
-#include <unistd.h>
-#include <limits.h>
-#include "uadk_dfx.h"
-
-#define print_date() printf("built on: %s %s\n", __DATE__, __TIME__)
-
-static void print_version(void)
-{
- printf("%s\n", UADK_VERSION_TEXT);
- printf("%s\n", UADK_VERSION_TAG);
-}
-
-static void print_exe_path(void)
-{
- char dir[PATH_MAX] = {0};
- int n;
-
- n = readlink("/proc/self/exe", dir, PATH_MAX);
- if (n < 0 || n >= PATH_MAX)
- printf("uadk tool failed to get the exe path.\n");
-
- printf("exe path: %s\n", dir);
-}
-
-void print_dfx_help(void)
-{
- printf("NAME\n");
- printf(" uadk_tool --dfx : uadk library dfx function, etc\n");
- printf("USAGE\n");
- printf(" uadk_tool --dfx [--version] = Show library version\n");
- printf(" uadk_tool --dfx [--date] = Show build date\n");
- printf(" uadk_tool --dfx [--dir] = Show library dir\n");
- printf(" uadk_tool --dfx [--help] = usage\n");
-}
-
-void dfx_cmd_parse(int argc, char *argv[])
-{
- int option_index = 0;
- int c;
-
- static struct option long_options[] = {
- {"version", no_argument, 0, 2},
- {"date", no_argument, 0, 3},
- {"dir", no_argument, 0, 4},
- {"help", no_argument, 0, 5},
- {0, 0, 0, 0}
- };
-
- while (1) {
- c = getopt_long(argc, argv, "", long_options, &option_index);
- if (c == -1)
- break;
-
- switch (c) {
- case 2:
- print_version();
- break;
- case 3:
- print_date();
- break;
- case 4:
- print_exe_path();
- break;
- case 5:
- print_dfx_help();
- break;
- default:
- printf("bad input parameter, exit\n");
- exit(-1);
- }
- }
-}
diff --git a/uadk_tool/uadk_tool.c b/uadk_tool/uadk_tool.c
index 88beeba..ce83d7a 100644
--- a/uadk_tool/uadk_tool.c
+++ b/uadk_tool/uadk_tool.c
@@ -1,12 +1,9 @@
/* SPDX-License-Identifier: Apache-2.0 */
#include <stdio.h>
-#include <stdlib.h>
#include <string.h>
-#include <time.h>
-#include <limits.h>
-#include "uadk_dfx.h"
-#include "uadk_benchmark.h"
+#include "dfx/uadk_dfx.h"
+#include "benchmark/uadk_benchmark.h"
static void print_tool_help(void)
{
@@ -18,17 +15,21 @@ static void print_tool_help(void)
int main(int argc, char **argv)
{
struct acc_option option = {0};
+ int index = 1;
int ret;
- if (argc > 1) {
- if (!strcmp("dfx", argv[1])) {
+ if (argc > index) {
+ if (!strcmp("dfx", argv[index])) {
dfx_cmd_parse(argc, argv);
- } else if (!strcmp("benchmark", argv[1])) {
+ } else if (!strcmp("benchmark", argv[index])) {
printf("start UADK benchmark test.\n");
- if (!argv[2])
+ if (!argv[++index])
acc_default_case(&option);
- benchmark_cmd_parse(argc, argv, &option);
+ ret = acc_cmd_parse(argc, argv, &option);
+ if (ret)
+ return ret;
+
ret = acc_option_convert(&option);
if (ret)
return ret;
diff --git a/wd.c b/wd.c
index 3ce9c1e..2dbb2ab 100644
--- a/wd.c
+++ b/wd.c
@@ -14,6 +14,7 @@
#include <string.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
+#include <sys/stat.h>
#include <numa.h>
#include <sched.h>
@@ -22,7 +23,14 @@
#define SYS_CLASS_DIR "/sys/class/uacce"
-const char *WD_VERSION = UADK_VERSION_NUMBER;
+enum UADK_LOG_LEVEL {
+ LOG_NONE = 0,
+ WD_LOG_ERROR,
+ WD_LOG_INFO,
+ WD_LOG_DEBUG,
+};
+
+static int uadk_log_level;
struct wd_ctx_h {
int fd;
@@ -35,6 +43,54 @@ struct wd_ctx_h {
void *priv;
};
+static void wd_parse_log_level(void)
+{
+ const char *syslog_file = "/etc/rsyslog.conf";
+ const char *log_dir = "/var/log/uadk.log";
+ bool log_debug = false;
+ bool log_info = false;
+ struct stat file_info;
+ char *file_contents;
+ FILE *in_file;
+
+ in_file = fopen(syslog_file, "r");
+ if (!in_file) {
+ WD_ERR("failed to open the rsyslog.conf file.\n");
+ return;
+ }
+
+ if (stat(syslog_file, &file_info) == -1) {
+ WD_ERR("failed to get file information.\n");
+ goto close_file;
+ }
+
+ file_contents = malloc(file_info.st_size);
+ if (!file_contents) {
+ WD_ERR("failed to get file contents memory.\n");
+ goto close_file;
+ }
+
+ while (fscanf(in_file, "%[^\n ] ", file_contents) != EOF) {
+ if (!strcmp("local5.debug", file_contents))
+ log_debug = true;
+ else if (!strcmp("local5.info", file_contents))
+ log_info = true;
+
+ if (log_debug && !strcmp(log_dir, file_contents)) {
+ uadk_log_level = WD_LOG_DEBUG;
+ break;
+ } else if (log_info && !strcmp(log_dir, file_contents)) {
+ uadk_log_level = WD_LOG_INFO;
+ break;
+ }
+ }
+
+ free(file_contents);
+
+close_file:
+ fclose(in_file);
+}
+
static int get_raw_attr(const char *dev_root, const char *attr, char *buf,
size_t sz)
{
@@ -189,6 +245,8 @@ static struct uacce_dev *read_uacce_sysfs(const char *dev_name)
if (!dev_name)
return NULL;
+ wd_parse_log_level();
+
dev = calloc(1, sizeof(struct uacce_dev));
if (!dev)
return NULL;
@@ -731,3 +789,22 @@ int wd_ctx_set_io_cmd(handle_t h_ctx, unsigned long cmd, void *arg)
return ioctl(ctx->fd, cmd, arg);
}
+
+void wd_get_version(void)
+{
+ const char *wd_released_time = UADK_RELEASED_TIME;
+ const char *wd_version = UADK_VERSION_NUMBER;
+
+ WD_CONSOLE("%s\n", wd_version);
+ WD_CONSOLE("%s\n", wd_released_time);
+}
+
+bool wd_need_debug(void)
+{
+ return uadk_log_level >= WD_LOG_DEBUG;
+}
+
+bool wd_need_info(void)
+{
+ return uadk_log_level >= WD_LOG_INFO;
+}
diff --git a/wd_aead.c b/wd_aead.c
index 7c07271..d43ace1 100644
--- a/wd_aead.c
+++ b/wd_aead.c
@@ -413,7 +413,7 @@ int wd_aead_init(struct wd_ctx_config *config, struct wd_sched *sched)
wd_aead_set_static_drv();
#endif
- /* init sync request pool */
+ /* init async request pool */
ret = wd_init_async_request_pool(&wd_aead_setting.pool,
config->ctx_num, WD_POOL_MAX_ENTRIES,
sizeof(struct wd_aead_msg));
@@ -531,6 +531,7 @@ int wd_do_aead_sync(handle_t h_sess, struct wd_aead_req *req)
if (unlikely(ret))
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
ret = send_recv_sync(ctx, &msg);
req->state = msg.result;
@@ -563,6 +564,7 @@ int wd_do_aead_async(handle_t h_sess, struct wd_aead_req *req)
if (ret)
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
msg_id = wd_get_msg_from_pool(&wd_aead_setting.pool,
@@ -594,6 +596,11 @@ fail_with_msg:
return ret;
}
+struct wd_aead_msg *wd_aead_get_msg(__u32 idx, __u32 tag)
+{
+ return wd_find_msg_in_pool(&wd_aead_setting.pool, idx, tag);
+}
+
int wd_aead_poll_ctx(__u32 idx, __u32 expt, __u32 *count)
{
struct wd_ctx_config_internal *config = &wd_aead_setting.config;
diff --git a/wd_cipher.c b/wd_cipher.c
index a7e393b..3d00598 100644
--- a/wd_cipher.c
+++ b/wd_cipher.c
@@ -442,7 +442,9 @@ int wd_do_cipher_sync(handle_t h_sess, struct wd_cipher_req *req)
if (unlikely(ret))
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
+
ret = send_recv_sync(ctx, &msg);
req->state = msg.result;
@@ -472,6 +474,7 @@ int wd_do_cipher_async(handle_t h_sess, struct wd_cipher_req *req)
return ret;
ctx = config->ctxs + idx;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
msg_id = wd_get_msg_from_pool(&wd_cipher_setting.pool, idx,
(void **)&msg);
@@ -502,6 +505,11 @@ fail_with_msg:
return ret;
}
+struct wd_cipher_msg *wd_cipher_get_msg(__u32 idx, __u32 tag)
+{
+ return wd_find_msg_in_pool(&wd_cipher_setting.pool, idx, tag);
+}
+
int wd_cipher_poll_ctx(__u32 idx, __u32 expt, __u32 *count)
{
struct wd_ctx_config_internal *config = &wd_cipher_setting.config;
diff --git a/wd_comp.c b/wd_comp.c
index 9107d60..eacebd3 100644
--- a/wd_comp.c
+++ b/wd_comp.c
@@ -406,6 +406,7 @@ static int wd_comp_sync_job(struct wd_comp_sess *sess,
if (unlikely(ret))
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
msg_handle.send = wd_comp_setting.driver->comp_send;
@@ -656,6 +657,7 @@ int wd_do_comp_async(handle_t h_sess, struct wd_comp_req *req)
if (unlikely(ret))
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
tag = wd_get_msg_from_pool(&wd_comp_setting.pool, idx, (void **)&msg);
diff --git a/wd_dh.c b/wd_dh.c
index 9571ab6..cfe294d 100644
--- a/wd_dh.c
+++ b/wd_dh.c
@@ -212,6 +212,7 @@ int wd_do_dh_sync(handle_t sess, struct wd_dh_req *req)
if (ret)
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
memset(&msg, 0, sizeof(struct wd_dh_msg));
@@ -257,6 +258,7 @@ int wd_do_dh_async(handle_t sess, struct wd_dh_req *req)
if (ret)
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
mid = wd_get_msg_from_pool(&wd_dh_setting.pool, idx, (void **)&msg);
@@ -288,6 +290,11 @@ fail_with_msg:
return ret;
}
+struct wd_dh_msg *wd_dh_get_msg(__u32 idx, __u32 tag)
+{
+ return wd_find_msg_in_pool(&wd_dh_setting.pool, idx, tag);
+}
+
int wd_dh_poll_ctx(__u32 idx, __u32 expt, __u32 *count)
{
struct wd_ctx_config_internal *config = &wd_dh_setting.config;
diff --git a/wd_digest.c b/wd_digest.c
index 0fff7c8..43b4bc5 100644
--- a/wd_digest.c
+++ b/wd_digest.c
@@ -340,6 +340,7 @@ int wd_do_digest_sync(handle_t h_sess, struct wd_digest_req *req)
if (unlikely(ret))
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
ret = send_recv_sync(ctx, dsess, &msg);
req->state = msg.result;
@@ -372,6 +373,7 @@ int wd_do_digest_async(handle_t h_sess, struct wd_digest_req *req)
if (ret)
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
msg_id = wd_get_msg_from_pool(&wd_digest_setting.pool, idx,
@@ -403,6 +405,11 @@ fail_with_msg:
return ret;
}
+struct wd_digest_msg *wd_digest_get_msg(__u32 idx, __u32 tag)
+{
+ return wd_find_msg_in_pool(&wd_digest_setting.pool, idx, tag);
+}
+
int wd_digest_poll_ctx(__u32 idx, __u32 expt, __u32 *count)
{
struct wd_ctx_config_internal *config = &wd_digest_setting.config;
diff --git a/wd_ecc.c b/wd_ecc.c
index 76c9d5f..9d30607 100644
--- a/wd_ecc.c
+++ b/wd_ecc.c
@@ -853,14 +853,14 @@ static int fill_user_curve_cfg(struct wd_ecc_curve *param,
if (setup->cv.type == WD_CV_CFG_ID) {
curve_id = setup->cv.cfg.id;
ret = fill_param_by_id(param, setup->key_bits, curve_id);
- dbg("set curve id %u!\n", curve_id);
+ WD_DEBUG("set curve id %u!\n", curve_id);
} else if (setup->cv.type == WD_CV_CFG_PARAM) {
ret = set_key_cv(param, src_param);
if (ret) {
WD_ERR("failed to set key cv!\n");
return ret;
}
- dbg("set curve by user param!\n");
+ WD_DEBUG("set curve by user param!\n");
} else {
WD_ERR("invalid: fill curve cfg type %u is error!\n", setup->cv.type);
return -WD_EINVAL;
@@ -1407,6 +1407,7 @@ int wd_do_ecc_sync(handle_t h_sess, struct wd_ecc_req *req)
if (ret)
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
memset(&msg, 0, sizeof(struct wd_ecc_msg));
@@ -2086,6 +2087,7 @@ int wd_do_ecc_async(handle_t sess, struct wd_ecc_req *req)
if (ret)
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
mid = wd_get_msg_from_pool(&wd_ecc_setting.pool, idx, (void **)&msg);
@@ -2116,6 +2118,11 @@ fail_with_msg:
return ret;
}
+struct wd_ecc_msg *wd_ecc_get_msg(__u32 idx, __u32 tag)
+{
+ return wd_find_msg_in_pool(&wd_ecc_setting.pool, idx, tag);
+}
+
int wd_ecc_poll_ctx(__u32 idx, __u32 expt, __u32 *count)
{
struct wd_ctx_config_internal *config = &wd_ecc_setting.config;
diff --git a/wd_rsa.c b/wd_rsa.c
index 868e78b..d65b01d 100644
--- a/wd_rsa.c
+++ b/wd_rsa.c
@@ -272,6 +272,7 @@ int wd_do_rsa_sync(handle_t h_sess, struct wd_rsa_req *req)
if (ret)
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
memset(&msg, 0, sizeof(struct wd_rsa_msg));
@@ -317,6 +318,7 @@ int wd_do_rsa_async(handle_t sess, struct wd_rsa_req *req)
if (ret)
return ret;
+ wd_dfx_msg_cnt(config->msg_cnt, WD_CTX_CNT_NUM, idx);
ctx = config->ctxs + idx;
mid = wd_get_msg_from_pool(&wd_rsa_setting.pool, idx, (void **)&msg);
@@ -347,6 +349,11 @@ fail_with_msg:
return ret;
}
+struct wd_rsa_msg *wd_rsa_get_msg(__u32 idx, __u32 tag)
+{
+ return wd_find_msg_in_pool(&wd_rsa_setting.pool, idx, tag);
+}
+
int wd_rsa_poll_ctx(__u32 idx, __u32 expt, __u32 *count)
{
struct wd_ctx_config_internal *config = &wd_rsa_setting.config;
diff --git a/wd_util.c b/wd_util.c
index de77d1e..04a2a5b 100644
--- a/wd_util.c
+++ b/wd_util.c
@@ -20,6 +20,7 @@
#define WD_BALANCE_THRHD 1280
#define WD_RECV_MAX_CNT_SLEEP 60000000
#define WD_RECV_MAX_CNT_NOSLEEP 200000000
+#define PRIVILEGE_FLAG 600
struct msg_pool {
/* message array allocated dynamically */
@@ -70,11 +71,76 @@ static void clone_ctx_to_internal(struct wd_ctx *ctx,
ctx_in->ctx_mode = ctx->ctx_mode;
}
+static int get_shared_memory_id(__u32 numsize)
+{
+ int shm;
+
+ shm = shmget(WD_IPC_KEY, sizeof(unsigned long) * numsize,
+ IPC_CREAT | PRIVILEGE_FLAG);
+ if (shm < 0) {
+ WD_ERR("failed to get shared memory id.\n");
+ return -WD_EINVAL;
+ }
+
+ return shm;
+}
+
+static unsigned long *wd_shared_create(__u32 numsize)
+{
+ bool need_info = wd_need_info();
+ void *ptr;
+ int shm;
+
+ if (!need_info)
+ return NULL;
+
+ if (numsize > WD_CTX_CNT_NUM) {
+ WD_ERR("invalid: input parameter is err!\n");
+ return NULL;
+ }
+
+ shm = get_shared_memory_id(numsize);
+ if (shm < 0)
+ return NULL;
+
+ ptr = shmat(shm, NULL, 0);
+ if (ptr == (void *)-1) {
+ WD_ERR("failed to get shared memory addr.\n");
+ return NULL;
+ }
+
+ memset(ptr, 0, sizeof(unsigned long) * numsize);
+
+ return ptr;
+}
+
+static void wd_shared_delete(__u32 numsize)
+{
+ bool need_info = wd_need_info();
+ int shm;
+
+ if (!need_info)
+ return;
+
+ if (numsize > WD_CTX_CNT_NUM) {
+ WD_ERR("invalid: input parameter is err!\n");
+ return;
+ }
+
+ shm = get_shared_memory_id(numsize);
+ if (shm < 0)
+ return;
+
+ /* deleted shared memory */
+ shmctl(shm, IPC_RMID, NULL);
+}
+
int wd_init_ctx_config(struct wd_ctx_config_internal *in,
struct wd_ctx_config *cfg)
{
+ bool need_info = wd_need_info();
struct wd_ctx_internal *ctxs;
- int i, ret;
+ int i, j, ret;
if (!cfg->ctx_num) {
WD_ERR("invalid: ctx_num is 0!\n");
@@ -87,25 +153,29 @@ int wd_init_ctx_config(struct wd_ctx_config_internal *in,
return -WD_EEXIST;
}
+ in->msg_cnt = wd_shared_create(WD_CTX_CNT_NUM);
+ if (!in->msg_cnt && need_info)
+ return -WD_EINVAL;
+
ctxs = calloc(1, cfg->ctx_num * sizeof(struct wd_ctx_internal));
if (!ctxs) {
WD_ERR("failed to alloc memory for internal ctxs!\n");
+ wd_shared_delete(WD_CTX_CNT_NUM);
return -WD_ENOMEM;
}
for (i = 0; i < cfg->ctx_num; i++) {
if (!cfg->ctxs[i].ctx) {
WD_ERR("invalid: ctx is NULL!\n");
- free(ctxs);
- return -WD_EINVAL;
+ ret = -WD_EINVAL;
+ goto err_out;
}
clone_ctx_to_internal(cfg->ctxs + i, ctxs + i);
ret = pthread_spin_init(&ctxs[i].lock, PTHREAD_PROCESS_SHARED);
if (ret) {
WD_ERR("failed to init ctxs lock!\n");
- free(ctxs);
- return ret;
+ goto err_out;
}
}
@@ -115,6 +185,14 @@ int wd_init_ctx_config(struct wd_ctx_config_internal *in,
in->ctx_num = cfg->ctx_num;
return 0;
+
+err_out:
+ for (j = 0; j < i; j++)
+ pthread_spin_destroy(&ctxs[j].lock);
+
+ wd_shared_delete(WD_CTX_CNT_NUM);
+ free(ctxs);
+ return ret;
}
int wd_init_sched(struct wd_sched *in, struct wd_sched *from)
@@ -161,6 +239,9 @@ void wd_clear_ctx_config(struct wd_ctx_config_internal *in)
free(in->ctxs);
in->ctxs = NULL;
}
+
+ wd_shared_delete(WD_CTX_CNT_NUM);
+ in->msg_cnt = NULL;
}
void wd_memset_zero(void *data, __u32 size)
--
2.33.0