From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 8EF81A0597; Thu, 9 Apr 2020 12:54:53 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 630FF1C240; Thu, 9 Apr 2020 12:54:53 +0200 (CEST) Received: from mail-pl1-f195.google.com (mail-pl1-f195.google.com [209.85.214.195]) by dpdk.org (Postfix) with ESMTP id 33ACA1C238 for ; Thu, 9 Apr 2020 12:54:52 +0200 (CEST) Received: by mail-pl1-f195.google.com with SMTP id t4so3690948plq.12 for ; Thu, 09 Apr 2020 03:54:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=KFkLUNoEGrFs9SEW+QgZPd9xOdWP4uv7nkqDU4n2MCs=; b=N1JPNjX/kFIOAHAypvnC9Qcw70bp559J6wE9mTaZHBFLNLBOZZ1Qqu/7HlHIWPLow+ hbGi3KmN3aMFgEd69tc75VQZFgNVLsd0dXwbLH7rByBOF/RmLOg6ZSyZlIN/vFyfuVXK 3Hfx/0fLZwZMSQackEMdIu8iN/VYDkbDc1NiPWQOeeypZ2wL7FMmTGtPEDYD7WLTb9Co 3sMynidF5+6DYsDRMJV3d7w0CscIm3sgu4P7BaAiSf2ojL9OHgQLu/P3/yBkiMdUQRnZ n7V++/DWkOKe0sOiL4o/uypvCCILVXaJ/S7DhOI7uY0HkL24/lc6huTKguxJfCDtB/G7 DtNA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=KFkLUNoEGrFs9SEW+QgZPd9xOdWP4uv7nkqDU4n2MCs=; b=qFS+G+tKzvTfhta8ssC9PCs3jBsHmnl04i/dBk0Jdck/FSgrPrbZEK0vp2aLkIvTXZ Ac+htVjkhZvsDAaHr+ZYNZNsYIBVrBqgcIitHOSWTboCqm6fTIyWyTsC+bHaJXSM73ex GvhXetR8PTmXgL0M7SWvDkEMK6EsOF4X/WkQJu0qt2YD+zm4ncnVnGjNa+sKnVnOuW0D lPHtm9NE/i+HdD4t55Q7tuX86MpwLHeharnocoHDGxQjJXq7NWet8CN0UFy0+GQ/++sq 9alo9EWPhY0r5zeGMSpZKOSfF+q1CC27Zd2DJ7a0XXL+j5lG7xunhGrBvIlhVg79M1s7 il+g== X-Gm-Message-State: AGi0PubTQ4vk7Sd43+N43rLt7l52xdKTpMbzmIvrAmiEkK0Za2flOe8C 2rWqRsi8rvOOox36b83FCMw= X-Google-Smtp-Source: APiQypKK7AIHXd3lDABKZKAiSzUztWEsXtUn6xisCIiX6azruU9gaNs4CNz7vlBjLEP4J0OjjXEa6g== X-Received: by 2002:a17:90b:430f:: with SMTP id ih15mr10773277pjb.56.1586429691409; Thu, 09 Apr 2020 03:54:51 -0700 (PDT) Received: from local.opencloud.tech.localdomain ([115.171.63.184]) by smtp.gmail.com with ESMTPSA id n69sm1549895pjc.8.2020.04.09.03.54.45 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 09 Apr 2020 03:54:50 -0700 (PDT) From: xiangxia.m.yue@gmail.com To: olivier.matz@6wind.com, arybchenko@solarflare.com, gage.eads@intel.com, artem.andreev@oktetlabs.ru, jerinj@marvell.com, ndabilpuram@marvell.com, vattunuru@marvell.com, hemant.agrawal@nxp.com, david.marchand@redhat.com, anatoly.burakov@intel.com, bruce.richardson@intel.com Cc: dev@dpdk.org, Tonghao Zhang Date: Thu, 9 Apr 2020 18:52:59 +0800 Message-Id: <1586429580-6990-1-git-send-email-xiangxia.m.yue@gmail.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1583114253-15345-1-git-send-email-xiangxia.m.yue@gmail.com> References: <1583114253-15345-1-git-send-email-xiangxia.m.yue@gmail.com> Subject: [dpdk-dev] [PATCH dpdk-dev 1/2] eal: introduce last-init queue for libraries initialization X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" From: Tonghao Zhang This patch introduces last-init queue, user can register a callback for theirs initialization. Running rte_last_init_run(), the almost resource of DPDK are available, such as memzone, ring. With this way, user don't introduce additional codes in eal layer. [This patch will be used for next patch.] Signed-off-by: Tonghao Zhang --- lib/librte_eal/common/eal_common_last_init.c | 43 ++++++++++++++++++++++++++++ lib/librte_eal/common/meson.build | 1 + lib/librte_eal/freebsd/Makefile | 1 + lib/librte_eal/freebsd/eal.c | 7 +++++ lib/librte_eal/include/rte_last_init.h | 36 +++++++++++++++++++++++ lib/librte_eal/linux/Makefile | 1 + lib/librte_eal/linux/eal.c | 8 ++++++ 7 files changed, 97 insertions(+) create mode 100644 lib/librte_eal/common/eal_common_last_init.c create mode 100644 lib/librte_eal/include/rte_last_init.h diff --git a/lib/librte_eal/common/eal_common_last_init.c b/lib/librte_eal/common/eal_common_last_init.c new file mode 100644 index 0000000..4f168e9 --- /dev/null +++ b/lib/librte_eal/common/eal_common_last_init.c @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2020 DPDK Community + */ + +#include + +#include +#include + +static struct rte_last_init_list rte_last_init_list = + TAILQ_HEAD_INITIALIZER(rte_last_init_list); + +void +rte_last_init_register(rte_last_init_cb cb, const void *arg) +{ + struct rte_last_init *last; + + RTE_VERIFY(cb); + + last = malloc(sizeof(*last)); + if (last == NULL) + rte_panic("Alloc memory for rte_last_init node failed\n"); + + last->cb = cb; + last->arg = arg; + + TAILQ_INSERT_TAIL(&rte_last_init_list, last, next); +} + +int +rte_last_init_run(void) +{ + struct rte_last_init *init; + int ret; + + TAILQ_FOREACH(init, &rte_last_init_list, next) { + ret = init->cb(init->arg); + if (ret) + return ret; + } + + return 0; +} diff --git a/lib/librte_eal/common/meson.build b/lib/librte_eal/common/meson.build index 02d9280..8107b24 100644 --- a/lib/librte_eal/common/meson.build +++ b/lib/librte_eal/common/meson.build @@ -43,6 +43,7 @@ sources += files( 'eal_common_thread.c', 'eal_common_timer.c', 'eal_common_uuid.c', + 'eal_common_last_init.c', 'hotplug_mp.c', 'malloc_elem.c', 'malloc_heap.c', diff --git a/lib/librte_eal/freebsd/Makefile b/lib/librte_eal/freebsd/Makefile index e5d4d8f..63cb0b9 100644 --- a/lib/librte_eal/freebsd/Makefile +++ b/lib/librte_eal/freebsd/Makefile @@ -60,6 +60,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_thread.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_proc.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_fbarray.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_uuid.c +SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += eal_common_last_init.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += rte_malloc.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += hotplug_mp.c SRCS-$(CONFIG_RTE_EXEC_ENV_FREEBSD) += malloc_elem.c diff --git a/lib/librte_eal/freebsd/eal.c b/lib/librte_eal/freebsd/eal.c index 6ae37e7..b51615f 100644 --- a/lib/librte_eal/freebsd/eal.c +++ b/lib/librte_eal/freebsd/eal.c @@ -44,6 +44,7 @@ #include #include #include +#include #include "eal_private.h" #include "eal_thread.h" @@ -874,6 +875,12 @@ static void rte_eal_init_alert(const char *msg) eal_check_mem_on_local_socket(); + if (rte_last_init_run() < 0) { + rte_eal_init_alert("Cannot init objects in last-init queue"); + rte_errno = EFAULT; + return -1; + } + eal_thread_init_master(rte_config.master_lcore); ret = eal_thread_dump_affinity(cpuset, sizeof(cpuset)); diff --git a/lib/librte_eal/include/rte_last_init.h b/lib/librte_eal/include/rte_last_init.h new file mode 100644 index 0000000..8c91a97 --- /dev/null +++ b/lib/librte_eal/include/rte_last_init.h @@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2020 DPDK Community + */ + +#ifndef _RTE_LAST_INIT_H_ +#define _RTE_LAST_INIT_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +typedef int (*rte_last_init_cb)(const void *arg); + +/** + * A structure describing a generic initialization. + */ +struct rte_last_init { + TAILQ_ENTRY(rte_last_init) next; /**< Next bus object in linked list */ + const void *arg; + rte_last_init_cb cb; +}; + +/** Double linked list of buses */ +TAILQ_HEAD(rte_last_init_list, rte_last_init); + +void rte_last_init_register(rte_last_init_cb cb, const void *arg); +int rte_last_init_run(void); + +#ifdef __cplusplus +} +#endif + +#endif /* _RTE_LAST_INIT_H_ */ diff --git a/lib/librte_eal/linux/Makefile b/lib/librte_eal/linux/Makefile index e5f4495..3a476a7 100644 --- a/lib/librte_eal/linux/Makefile +++ b/lib/librte_eal/linux/Makefile @@ -67,6 +67,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_thread.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_proc.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_fbarray.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_uuid.c +SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += eal_common_last_init.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += rte_malloc.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += hotplug_mp.c SRCS-$(CONFIG_RTE_EXEC_ENV_LINUX) += malloc_elem.c diff --git a/lib/librte_eal/linux/eal.c b/lib/librte_eal/linux/eal.c index 9530ee5..61fc540 100644 --- a/lib/librte_eal/linux/eal.c +++ b/lib/librte_eal/linux/eal.c @@ -51,6 +51,7 @@ #include #include #include +#include #include "eal_private.h" #include "eal_thread.h" @@ -1203,6 +1204,13 @@ static void rte_eal_init_alert(const char *msg) eal_check_mem_on_local_socket(); + + if (rte_last_init_run() < 0) { + rte_eal_init_alert("Cannot init objects in last-init queue"); + rte_errno = EFAULT; + return -1; + } + eal_thread_init_master(rte_config.master_lcore); ret = eal_thread_dump_affinity(cpuset, sizeof(cpuset)); -- 1.8.3.1