From 68493f45af14bf30385f2605094772c130d8a10e Mon Sep 17 00:00:00 2001 From: Maciej Szwed Date: Thu, 3 Sep 2020 10:45:06 +0200 Subject: [PATCH] event: Add DPDK based governor Signed-off-by: Maciej Szwed Change-Id: Ide0ac38497bc500886e26fd219cb120113896966 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4152 Tested-by: Jim Harris Reviewed-by: Tomasz Zawadzki Reviewed-by: Jim Harris --- lib/env_dpdk/env.mk | 4 + lib/event/Makefile | 6 + lib/event/dpdk_governor.c | 172 ++++++++++++++++++++++++ test/external_code/hello_world/Makefile | 12 +- 4 files changed, 188 insertions(+), 6 deletions(-) create mode 100644 lib/event/dpdk_governor.c diff --git a/lib/env_dpdk/env.mk b/lib/env_dpdk/env.mk index f41ee153e..ad9cd2434 100644 --- a/lib/env_dpdk/env.mk +++ b/lib/env_dpdk/env.mk @@ -50,6 +50,10 @@ DPDK_INC := -I$(DPDK_INC_DIR) DPDK_LIB_LIST = rte_eal rte_mempool rte_ring rte_mbuf rte_pci rte_bus_pci rte_mempool_ring +ifeq ($(OS),Linux) +DPDK_LIB_LIST += rte_power +endif + # DPDK 20.05 eal dependency ifneq (, $(wildcard $(DPDK_ABS_DIR)/lib/librte_telemetry.*)) DPDK_LIB_LIST += rte_telemetry diff --git a/lib/event/Makefile b/lib/event/Makefile index 2011ea238..ffd14ba17 100644 --- a/lib/event/Makefile +++ b/lib/event/Makefile @@ -37,10 +37,16 @@ include $(SPDK_ROOT_DIR)/mk/spdk.common.mk SO_VER := 6 SO_MINOR := 0 +CFLAGS += $(ENV_CFLAGS) + LIBNAME = event C_SRCS = app.c reactor.c rpc.c subsystem.c json_config.c log_rpc.c \ app_rpc.c subsystem_rpc.c scheduler_static.c +ifeq ($(OS),Linux) +C_SRCS += dpdk_governor.c +endif + SPDK_MAP_FILE = $(abspath $(CURDIR)/spdk_event.map) include $(SPDK_ROOT_DIR)/mk/spdk.lib.mk diff --git a/lib/event/dpdk_governor.c b/lib/event/dpdk_governor.c new file mode 100644 index 000000000..a3fe595f3 --- /dev/null +++ b/lib/event/dpdk_governor.c @@ -0,0 +1,172 @@ +/*- + * BSD LICENSE + * + * Copyright (c) Intel Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "spdk/stdinc.h" +#include "spdk/log.h" +#include "spdk/event.h" + +#include "spdk_internal/event.h" + +#include + + +static uint32_t +_get_core_freqs(uint32_t lcore_id, uint32_t *freqs, uint32_t num) +{ + return rte_power_freqs(lcore_id, freqs, num); +} + +static uint32_t +_get_core_curr_freq(uint32_t lcore_id) +{ + return rte_power_get_freq(lcore_id); +} + +static int +_set_core_freq(uint32_t lcore_id, uint32_t freq_index) +{ + return rte_power_set_freq(lcore_id, freq_index); +} + +static int +_core_freq_up(uint32_t lcore_id) +{ + return rte_power_freq_up(lcore_id); +} + +static int +_core_freq_down(uint32_t lcore_id) +{ + return rte_power_freq_down(lcore_id); +} + +static int +_set_core_freq_max(uint32_t lcore_id) +{ + return rte_power_freq_max(lcore_id); +} + +static int +_set_core_freq_min(uint32_t lcore_id) +{ + return rte_power_freq_min(lcore_id); +} + +static int +_get_core_turbo_status(uint32_t lcore_id) +{ + return rte_power_turbo_status(lcore_id); +} + +static int +_enable_core_turbo(uint32_t lcore_id) +{ + return rte_power_freq_enable_turbo(lcore_id); +} + +static int +_disable_core_turbo(uint32_t lcore_id) +{ + return rte_power_freq_disable_turbo(lcore_id); +} + +static int +_get_core_capabilities(uint32_t lcore_id, struct spdk_governor_capabilities *capabilities) +{ + struct rte_power_core_capabilities caps; + int rc; + + rc = rte_power_get_capabilities(lcore_id, &caps); + if (rc != 0) { + return rc; + } + + capabilities->turbo_available = caps.turbo == 0 ? false : true; + capabilities->priority = caps.priority == 0 ? false : true; + capabilities->freq_change = true; + capabilities->freq_getset = true; + capabilities->freq_up = true; + capabilities->freq_down = true; + capabilities->freq_max = true; + capabilities->freq_min = true; + capabilities->turbo_set = true; + + return 0; +} + +static int +_init_core(uint32_t lcore_id) +{ + int rc; + + rc = rte_power_init(lcore_id); + if (rc) { + SPDK_ERRLOG("DPDK Power management library initialization failed on core%d\n", lcore_id); + } + + return rc; +} + +static int +_deinit_core(uint32_t lcore_id) +{ + int rc; + + rc = rte_power_exit(lcore_id); + if (rc) { + SPDK_ERRLOG("DPDK Power management library deinitialization failed on core%d\n", lcore_id); + } + + return rc; +} + +static struct spdk_governor dpdk_governor = { + .name = "dpdk_governor", + .get_core_freqs = _get_core_freqs, + .get_core_curr_freq = _get_core_curr_freq, + .set_core_freq = _set_core_freq, + .core_freq_up = _core_freq_up, + .core_freq_down = _core_freq_down, + .set_core_freq_max = _set_core_freq_max, + .set_core_freq_min = _set_core_freq_min, + .get_core_turbo_status = _get_core_turbo_status, + .enable_core_turbo = _enable_core_turbo, + .disable_core_turbo = _disable_core_turbo, + .get_core_capabilities = _get_core_capabilities, + .init_core = _init_core, + .deinit_core = _deinit_core, + .init = NULL, + .deinit = NULL, +}; + +SPDK_GOVERNOR_REGISTER(&dpdk_governor); diff --git a/test/external_code/hello_world/Makefile b/test/external_code/hello_world/Makefile index 9f6c9cf30..cdf7c9c14 100644 --- a/test/external_code/hello_world/Makefile +++ b/test/external_code/hello_world/Makefile @@ -35,26 +35,26 @@ bdev_shared_combo: $(CC) $(COMMON_CFLAGS) -L../passthru -Wl,-rpath=$(SPDK_LIB_DIR),--no-as-needed -o hello_bdev ./hello_bdev.c -lpassthru_external \ -lspdk -lspdk_env_dpdk -lrte_eal -lrte_mempool -lrte_ring -lrte_mbuf -lrte_mempool_ring -lrte_pci -lrte_bus_pci -lrte_kvargs \ - -lrte_vhost -lrte_net -lrte_hash -lrte_cryptodev -Wl,--no-whole-archive + -lrte_vhost -lrte_net -lrte_hash -lrte_cryptodev -lrte_power -Wl,--no-whole-archive # Shows how to compile both an external bdev and an external application against the SPDK individual shared objects and dpdk shared objects. bdev_shared_iso: $(CC) $(COMMON_CFLAGS) -L../passthru -Wl,-rpath=$(SPDK_LIB_DIR),--no-as-needed -o hello_bdev ./hello_bdev.c \ -lpassthru_external -lspdk_event_bdev -lspdk_event_accel -lspdk_event_vmd -lspdk_bdev -lspdk_bdev_malloc -lspdk_log -lspdk_thread -lspdk_util -lspdk_event \ -lspdk_env_dpdk -lrte_eal -lrte_mempool -lrte_ring -lrte_mbuf -lrte_mempool_ring -lrte_pci -lrte_bus_pci -lrte_kvargs \ - -lrte_vhost -lrte_net -lrte_hash -lrte_cryptodev -Wl,--no-whole-archive -lnuma + -lrte_vhost -lrte_net -lrte_hash -lrte_cryptodev -lrte_power -Wl,--no-whole-archive -lnuma # Shows how to compile an external application against the SPDK combined shared object and dpdk shared objects. alone_shared_combo: $(CC) $(COMMON_CFLAGS) -Wl,-rpath=$(SPDK_LIB_DIR),--no-as-needed -o hello_bdev ./hello_bdev.c -lspdk -lspdk_env_dpdk -lrte_eal \ - -lrte_mempool -lrte_ring -lrte_mbuf -lrte_mempool_ring -lrte_pci -lrte_bus_pci -lrte_kvargs -lrte_vhost -lrte_net -lrte_hash -lrte_cryptodev + -lrte_mempool -lrte_ring -lrte_mbuf -lrte_mempool_ring -lrte_pci -lrte_bus_pci -lrte_kvargs -lrte_vhost -lrte_net -lrte_hash -lrte_cryptodev -lrte_power # Shows how to compile an external application against the SPDK individual shared objects and dpdk shared objects. alone_shared_iso: $(CC) $(COMMON_CFLAGS) -Wl,-rpath=$(SPDK_LIB_DIR),--no-as-needed -o hello_bdev ./hello_bdev.c -lspdk_event_bdev \ -lspdk_event_accel -lspdk_event_vmd -lspdk_bdev -lspdk_bdev_malloc -lspdk_log -lspdk_thread -lspdk_util -lspdk_event \ -lspdk_env_dpdk -lrte_eal -lrte_mempool -lrte_ring -lrte_mbuf -lrte_mempool_ring -lrte_pci -lrte_bus_pci -lrte_kvargs \ - -lrte_vhost -lrte_net -lrte_hash -lrte_cryptodev + -lrte_vhost -lrte_net -lrte_hash -lrte_cryptodev -lrte_power # Shows how to compile an external application against the SPDK archives. alone_static: @@ -62,7 +62,7 @@ alone_static: -lspdk_event_sock -lspdk_bdev -lspdk_accel -lspdk_event -lspdk_thread -lspdk_util -lspdk_conf -lspdk_trace -lspdk_log -lspdk_json \ -lspdk_jsonrpc -lspdk_rpc -lspdk_sock -lspdk_notify -lspdk_vmd -lspdk_env_dpdk -lrte_eal -lrte_mempool -lrte_ring \ -lrte_mbuf -lrte_mempool_ring -lrte_pci -lrte_bus_pci -lrte_kvargs -lrte_vhost -lrte_net -lrte_hash -lrte_telemetry \ - -lrte_cryptodev -Wl,--no-whole-archive,-Bdynamic -lnuma -luuid -lpthread -ldl -lrt + -lrte_cryptodev -lrte_power -Wl,--no-whole-archive,-Bdynamic -lnuma -luuid -lpthread -ldl -lrt # Shows how to compile and external bdev and application sgainst the SPDK archives. bdev_static: @@ -70,4 +70,4 @@ bdev_static: -lspdk_event_accel -lspdk_event_vmd -lspdk_event_sock -lspdk_bdev -lspdk_accel -lspdk_event -lspdk_thread -lspdk_util -lspdk_conf -lspdk_trace \ -lspdk_log -lspdk_json -lspdk_jsonrpc -lspdk_rpc -lspdk_sock -lspdk_notify -lspdk_vmd -lspdk_env_dpdk -lrte_eal -lrte_mempool \ -lrte_ring -lrte_mbuf -lrte_mempool_ring -lrte_pci -lrte_bus_pci -lrte_kvargs -lrte_vhost -lrte_net -lrte_hash -lrte_telemetry -lrte_cryptodev \ - -Wl,--no-whole-archive,-Bdynamic -lnuma -luuid -lpthread -ldl -lrt + -lrte_power -Wl,--no-whole-archive,-Bdynamic -lnuma -luuid -lpthread -ldl -lrt