lib/event: remove per core init/deinit API from governor

There is no explicit need for the spdk governors initialization
to occur on per core basis.

This implementation detail for dpdk_governor is now hidden
in the init/deinit calls. There is no recourse when failing
deinit for a certain core, so ignore the return code.
Changed return type for deinit in governor and scheduler to void.

While here modified the callbacks for scheduler to no
longer require passing currently selected governor as an argument.

Signed-off-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Change-Id: I7f0b7a09aa7f5d12ae47fca25186faeedac31a95
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8791
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@gmail.com>
This commit is contained in:
Tomasz Zawadzki 2021-07-13 07:22:12 -04:00
parent 65425be69a
commit 5bf2973e9f
6 changed files with 70 additions and 82 deletions

View File

@ -180,10 +180,8 @@ struct spdk_governor {
int (*set_core_freq_min)(uint32_t lcore_id);
int (*get_core_capabilities)(uint32_t lcore_id, struct spdk_governor_capabilities *capabilities);
int (*init_core)(uint32_t lcore_id);
int (*deinit_core)(uint32_t lcore_id);
int (*init)(void);
int (*deinit)(void);
void (*deinit)(void);
TAILQ_ENTRY(spdk_governor) link;
};
@ -256,20 +254,19 @@ struct spdk_scheduler_core_info {
* Scheduler balance function type.
* Accepts array of core_info which is of size 'count' and returns updated array.
*/
typedef void (*spdk_scheduler_balance_fn)(struct spdk_scheduler_core_info *core_info, int count,
struct spdk_governor *governor);
typedef void (*spdk_scheduler_balance_fn)(struct spdk_scheduler_core_info *core_info, int count);
/**
* Scheduler init function type.
* Called on scheduler module initialization.
*/
typedef int (*spdk_scheduler_init_fn)(struct spdk_governor *governor);
typedef int (*spdk_scheduler_init_fn)(void);
/**
* Scheduler deinitialization function type.
* Called on reactor fini.
*/
typedef int (*spdk_scheduler_deinit_fn)(struct spdk_governor *governor);
typedef void (*spdk_scheduler_deinit_fn)(void);
/** Thread scheduler */
struct spdk_scheduler {

View File

@ -33,6 +33,7 @@
#include "spdk/stdinc.h"
#include "spdk/log.h"
#include "spdk/env.h"
#include "spdk/event.h"
#include "spdk_internal/event.h"
@ -133,18 +134,47 @@ _init_core(uint32_t lcore_id)
}
static int
_deinit_core(uint32_t lcore_id)
_init(void)
{
int rc;
uint32_t i, j;
int rc = 0;
rc = rte_power_exit(lcore_id);
if (rc) {
SPDK_ERRLOG("DPDK Power management library deinitialization failed on core%d\n", lcore_id);
SPDK_ENV_FOREACH_CORE(i) {
rc = _init_core(i);
if (rc != 0) {
SPDK_ERRLOG("Failed to initialize on core%d\n", i);
break;
}
}
if (rc == 0) {
return rc;
}
/* When initalization of a core failed, deinitalize prior cores. */
SPDK_ENV_FOREACH_CORE(j) {
if (j >= i) {
break;
}
if (rte_power_exit(j) != 0) {
SPDK_ERRLOG("Failed to deinitialize on core%d\n", j);
}
}
return rc;
}
static void
_deinit(void)
{
uint32_t i;
SPDK_ENV_FOREACH_CORE(i) {
if (rte_power_exit(i) != 0) {
SPDK_ERRLOG("Failed to deinitialize on core%d\n", i);
}
}
}
static struct spdk_governor dpdk_governor = {
.name = "dpdk_governor",
.get_core_curr_freq = _get_core_curr_freq,
@ -153,10 +183,8 @@ static struct spdk_governor dpdk_governor = {
.set_core_freq_max = _set_core_freq_max,
.set_core_freq_min = _set_core_freq_min,
.get_core_capabilities = _get_core_capabilities,
.init_core = _init_core,
.deinit_core = _deinit_core,
.init = NULL,
.deinit = NULL,
.init = _init,
.deinit = _deinit,
};
SPDK_GOVERNOR_REGISTER(&dpdk_governor);

View File

@ -41,41 +41,32 @@
#include "spdk/env.h"
static int
init(struct spdk_governor *governor)
init(void)
{
return _spdk_governor_set("dpdk_governor");
}
static int
deinit(struct spdk_governor *governor)
static void
deinit(void)
{
uint32_t i;
int rc = 0;
SPDK_ENV_FOREACH_CORE(i) {
if (governor->deinit_core) {
rc = governor->deinit_core(i);
if (rc != 0) {
return rc;
}
}
}
struct spdk_governor *governor;
governor = _spdk_governor_get();
if (governor->deinit) {
rc = governor->deinit();
governor->deinit();
}
return rc;
}
static void
balance(struct spdk_scheduler_core_info *cores, int core_count, struct spdk_governor *governor)
balance(struct spdk_scheduler_core_info *cores, int core_count)
{
struct spdk_governor *governor;
struct spdk_scheduler_core_info *core;
struct spdk_governor_capabilities capabilities;
uint32_t i;
int rc;
governor = _spdk_governor_get();
/* Gather active/idle statistics */
SPDK_ENV_FOREACH_CORE(i) {
core = &cores[i];

View File

@ -120,7 +120,7 @@ _spdk_scheduler_set(char *name)
}
} else {
if (g_scheduler != NULL && g_scheduler->deinit != NULL) {
g_scheduler->deinit(&g_governor);
g_scheduler->deinit();
}
g_scheduler = scheduler;
}
@ -128,7 +128,7 @@ _spdk_scheduler_set(char *name)
g_new_scheduler = scheduler;
if (scheduler->init != NULL) {
scheduler->init(&g_governor);
scheduler->init();
}
return 0;
@ -306,7 +306,7 @@ spdk_reactors_fini(void)
}
if (g_scheduler->deinit != NULL) {
g_scheduler->deinit(&g_governor);
g_scheduler->deinit();
}
spdk_thread_lib_fini();
@ -757,7 +757,7 @@ static void
_reactors_scheduler_balance(void *arg1, void *arg2)
{
if (g_reactor_state == SPDK_REACTOR_STATE_RUNNING) {
g_scheduler->balance(g_core_infos, g_reactor_count, &g_governor);
g_scheduler->balance(g_core_infos, g_reactor_count);
g_scheduler_core_number = spdk_env_get_first_core();
_reactors_scheduler_update_core_mode(NULL);
@ -964,7 +964,7 @@ reactor_run(void *arg)
!g_scheduling_in_progress)) {
if (spdk_unlikely(g_scheduler != g_new_scheduler)) {
if (g_scheduler->deinit != NULL) {
g_scheduler->deinit(&g_governor);
g_scheduler->deinit();
}
g_scheduler = g_new_scheduler;
}
@ -1503,33 +1503,21 @@ int
_spdk_governor_set(char *name)
{
struct spdk_governor *governor;
uint32_t i;
int rc;
int rc = 0;
governor = _governor_find(name);
if (governor == NULL) {
return -EINVAL;
}
g_governor = *governor;
if (g_governor.init) {
rc = g_governor.init();
if (rc != 0) {
return rc;
}
if (governor->init) {
rc = governor->init();
}
SPDK_ENV_FOREACH_CORE(i) {
if (g_governor.init_core) {
rc = g_governor.init_core(i);
if (rc != 0) {
return rc;
}
}
if (rc == 0) {
g_governor = *governor;
}
return 0;
return rc;
}
struct spdk_governor *

View File

@ -221,7 +221,7 @@ _find_optimal_core(struct spdk_scheduler_thread_info *thread_info)
}
static int
init(struct spdk_governor *governor)
init(void)
{
int rc;
@ -239,33 +239,18 @@ init(struct spdk_governor *governor)
return 0;
}
static int
deinit(struct spdk_governor *governor)
static void
deinit(void)
{
uint32_t i;
int rc = 0;
struct spdk_governor *governor;
free(g_cores);
g_cores = NULL;
if (!g_core_mngmnt_available) {
return 0;
}
if (governor->deinit_core) {
SPDK_ENV_FOREACH_CORE(i) {
rc = governor->deinit_core(i);
if (rc != 0) {
SPDK_ERRLOG("Failed to deinitialize governor for core %d\n", i);
}
}
}
governor = _spdk_governor_get();
if (governor->deinit) {
rc = governor->deinit();
governor->deinit();
}
return rc;
}
static void
@ -293,10 +278,10 @@ _balance_active(struct spdk_scheduler_thread_info *thread_info)
}
static void
balance(struct spdk_scheduler_core_info *cores_info, int cores_count,
struct spdk_governor *governor)
balance(struct spdk_scheduler_core_info *cores_info, int cores_count)
{
struct spdk_reactor *reactor;
struct spdk_governor *governor;
struct spdk_scheduler_core_info *core;
struct core_stats *main_core;
uint32_t i;
@ -338,6 +323,7 @@ balance(struct spdk_scheduler_core_info *cores_info, int cores_count,
return;
}
governor = _spdk_governor_get();
/* Change main core frequency if needed */
if (busy_threads_present) {
rc = governor->set_core_freq_max(g_main_lcore);

View File

@ -770,8 +770,6 @@ static struct spdk_governor governor = {
.set_core_freq_max = core_freq_max,
.set_core_freq_min = NULL,
.get_core_capabilities = NULL,
.init_core = NULL,
.deinit_core = NULL,
.init = NULL,
.deinit = NULL,
};