From: David Hunt <david.hunt@intel.com>
To: dev@dpdk.org
Cc: bruce.richardson@intel.com, David Hunt <david.hunt@intel.com>
Subject: [dpdk-dev] [PATCH v1 3/6] lib/power: reduce memory footprint of pstate lib
Date: Thu, 9 Sep 2021 14:45:08 +0100 [thread overview]
Message-ID: <20210909134511.18871-4-david.hunt@intel.com> (raw)
In-Reply-To: <20210909134511.18871-1-david.hunt@intel.com>
Switch from static memory allocation of core info structs to dynamic
allocation. The library used to statically allocate max_lcores number
of lcore_power_info structs, so change this to rte_malloc as needed.
Reduces static footprint from 192K to 1K.
Desirable, especially if we're changing max_lcores default from 128 to 512.
Signed-off-by: David Hunt <david.hunt@intel.com>
---
lib/power/power_pstate_cpufreq.c | 111 ++++++++++++++++++++++++++-----
1 file changed, 93 insertions(+), 18 deletions(-)
diff --git a/lib/power/power_pstate_cpufreq.c b/lib/power/power_pstate_cpufreq.c
index 86f8a76e46..3e6529f589 100644
--- a/lib/power/power_pstate_cpufreq.c
+++ b/lib/power/power_pstate_cpufreq.c
@@ -16,6 +16,7 @@
#include <rte_memcpy.h>
#include <rte_memory.h>
+#include <rte_malloc.h>
#include <rte_string_fns.h>
#include "power_pstate_cpufreq.h"
@@ -76,7 +77,7 @@ struct pstate_power_info {
} __rte_cache_aligned;
-static struct pstate_power_info lcore_power_info[RTE_MAX_LCORE];
+static struct pstate_power_info *lcore_power_info[RTE_MAX_LCORE] = { NULL };
/**
* It is to read the specific MSR.
@@ -518,7 +519,17 @@ power_pstate_cpufreq_init(unsigned int lcore_id)
return -1;
}
- pi = &lcore_power_info[lcore_id];
+ if (lcore_power_info[lcore_id] == NULL) {
+ lcore_power_info[lcore_id] =
+ rte_malloc(NULL, sizeof(struct pstate_power_info), 0);
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "Cannot allocate core %u\n",
+ lcore_id);
+ return -1;
+ }
+ }
+
+ pi = lcore_power_info[lcore_id];
exp_state = POWER_IDLE;
/* The power in use state works as a guard variable between
* the CPU frequency control initialization and exit process.
@@ -595,7 +606,13 @@ power_pstate_cpufreq_exit(unsigned int lcore_id)
lcore_id, RTE_MAX_LCORE - 1U);
return -1;
}
- pi = &lcore_power_info[lcore_id];
+
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "core %u not initialised\n", lcore_id);
+ return RTE_POWER_INVALID_FREQ_INDEX;
+ }
+
+ pi = lcore_power_info[lcore_id];
exp_state = POWER_USED;
/* The power in use state works as a guard variable between
@@ -632,6 +649,9 @@ power_pstate_cpufreq_exit(unsigned int lcore_id)
__atomic_compare_exchange_n(&(pi->state), &exp_state, POWER_IDLE,
0, __ATOMIC_RELEASE, __ATOMIC_RELAXED);
+ if (lcore_power_info[lcore_id] != NULL)
+ rte_free(lcore_power_info[lcore_id]);
+
return 0;
fail:
@@ -658,7 +678,12 @@ power_pstate_cpufreq_freqs(unsigned int lcore_id, uint32_t *freqs, uint32_t num)
return 0;
}
- pi = &lcore_power_info[lcore_id];
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "core %u not initialised\n", lcore_id);
+ return RTE_POWER_INVALID_FREQ_INDEX;
+ }
+
+ pi = lcore_power_info[lcore_id];
if (num < pi->nb_freqs) {
RTE_LOG(ERR, POWER, "Buffer size is not enough\n");
return 0;
@@ -676,7 +701,12 @@ power_pstate_cpufreq_get_freq(unsigned int lcore_id)
return RTE_POWER_INVALID_FREQ_INDEX;
}
- return lcore_power_info[lcore_id].curr_idx;
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "core %u not initialised\n", lcore_id);
+ return RTE_POWER_INVALID_FREQ_INDEX;
+ }
+
+ return lcore_power_info[lcore_id]->curr_idx;
}
@@ -688,7 +718,12 @@ power_pstate_cpufreq_set_freq(unsigned int lcore_id, uint32_t index)
return -1;
}
- return set_freq_internal(&(lcore_power_info[lcore_id]), index);
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "core %u not initialised\n", lcore_id);
+ return RTE_POWER_INVALID_FREQ_INDEX;
+ }
+
+ return set_freq_internal(lcore_power_info[lcore_id], index);
}
int
@@ -701,7 +736,12 @@ power_pstate_cpufreq_freq_up(unsigned int lcore_id)
return -1;
}
- pi = &lcore_power_info[lcore_id];
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "core %u not initialised\n", lcore_id);
+ return RTE_POWER_INVALID_FREQ_INDEX;
+ }
+
+ pi = lcore_power_info[lcore_id];
if (pi->curr_idx == 0 ||
(pi->curr_idx == 1 && pi->turbo_available && !pi->turbo_enable))
return 0;
@@ -720,7 +760,12 @@ power_pstate_cpufreq_freq_down(unsigned int lcore_id)
return -1;
}
- pi = &lcore_power_info[lcore_id];
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "core %u not initialised\n", lcore_id);
+ return RTE_POWER_INVALID_FREQ_INDEX;
+ }
+
+ pi = lcore_power_info[lcore_id];
if (pi->curr_idx + 1 == pi->nb_freqs)
return 0;
@@ -736,18 +781,23 @@ power_pstate_cpufreq_freq_max(unsigned int lcore_id)
return -1;
}
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "core %u not initialised\n", lcore_id);
+ return RTE_POWER_INVALID_FREQ_INDEX;
+ }
+
/* Frequencies in the array are from high to low. */
- if (lcore_power_info[lcore_id].turbo_available) {
- if (lcore_power_info[lcore_id].turbo_enable)
+ if (lcore_power_info[lcore_id]->turbo_available) {
+ if (lcore_power_info[lcore_id]->turbo_enable)
/* Set to Turbo */
return set_freq_internal(
- &lcore_power_info[lcore_id], 0);
+ lcore_power_info[lcore_id], 0);
else
/* Set to max non-turbo */
return set_freq_internal(
- &lcore_power_info[lcore_id], 1);
+ lcore_power_info[lcore_id], 1);
} else
- return set_freq_internal(&lcore_power_info[lcore_id], 0);
+ return set_freq_internal(lcore_power_info[lcore_id], 0);
}
@@ -761,7 +811,12 @@ power_pstate_cpufreq_freq_min(unsigned int lcore_id)
return -1;
}
- pi = &lcore_power_info[lcore_id];
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "core %u not initialised\n", lcore_id);
+ return RTE_POWER_INVALID_FREQ_INDEX;
+ }
+
+ pi = lcore_power_info[lcore_id];
/* Frequencies in the array are from high to low. */
return set_freq_internal(pi, pi->nb_freqs - 1);
@@ -778,7 +833,12 @@ power_pstate_turbo_status(unsigned int lcore_id)
return -1;
}
- pi = &lcore_power_info[lcore_id];
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "core %u not initialised\n", lcore_id);
+ return RTE_POWER_INVALID_FREQ_INDEX;
+ }
+
+ pi = lcore_power_info[lcore_id];
return pi->turbo_enable;
}
@@ -793,7 +853,12 @@ power_pstate_enable_turbo(unsigned int lcore_id)
return -1;
}
- pi = &lcore_power_info[lcore_id];
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "core %u not initialised\n", lcore_id);
+ return RTE_POWER_INVALID_FREQ_INDEX;
+ }
+
+ pi = lcore_power_info[lcore_id];
if (pi->turbo_available)
pi->turbo_enable = 1;
@@ -819,7 +884,12 @@ power_pstate_disable_turbo(unsigned int lcore_id)
return -1;
}
- pi = &lcore_power_info[lcore_id];
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "core %u not initialised\n", lcore_id);
+ return RTE_POWER_INVALID_FREQ_INDEX;
+ }
+
+ pi = lcore_power_info[lcore_id];
pi->turbo_enable = 0;
@@ -851,7 +921,12 @@ int power_pstate_get_capabilities(unsigned int lcore_id,
return -1;
}
- pi = &lcore_power_info[lcore_id];
+ if (lcore_power_info[lcore_id] == NULL) {
+ RTE_LOG(ERR, POWER, "core %u not initialised\n", lcore_id);
+ return RTE_POWER_INVALID_FREQ_INDEX;
+ }
+
+ pi = lcore_power_info[lcore_id];
caps->capabilities = 0;
caps->turbo = !!(pi->turbo_available);
caps->priority = pi->priority_core;
--
2.17.1
next prev parent reply other threads:[~2021-09-09 13:45 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-09 13:45 [dpdk-dev] build: Increase the default value of RTE_MAX_LCORE David Hunt
2021-09-09 13:45 ` [dpdk-dev] [PATCH v1 1/6] build: increase default of max lcores to 512 David Hunt
2021-09-09 14:37 ` Bruce Richardson
2021-09-10 6:51 ` David Marchand
2021-09-10 7:54 ` Bruce Richardson
2021-09-10 8:06 ` David Marchand
2021-09-10 8:24 ` Thomas Monjalon
2021-09-14 9:34 ` David Hunt
2021-09-14 10:00 ` David Marchand
2021-09-14 11:07 ` David Hunt
2021-09-14 11:29 ` David Marchand
2021-09-15 12:13 ` David Hunt
2021-11-17 15:55 ` Morten Brørup
2021-11-17 19:01 ` David Hunt
2021-09-15 12:11 ` [dpdk-dev] [PATCH v2] eal: add additional info if lcore exceeds max cores David Hunt
2021-09-16 12:34 ` David Marchand
2021-09-20 9:30 ` David Hunt
2021-09-21 11:50 ` [dpdk-dev] [PATCH v3 1/2] eal: add additional info if core list too long David Hunt
2021-09-21 11:50 ` [dpdk-dev] [PATCH v3 2/2] eal: add additional info if core mask " David Hunt
2021-09-21 12:00 ` Bruce Richardson
2021-09-21 11:57 ` [dpdk-dev] [PATCH v3 1/2] eal: add additional info if core list " Bruce Richardson
2021-09-21 12:04 ` David Hunt
2021-09-21 13:16 ` David Hunt
2021-09-21 13:20 ` Bruce Richardson
2021-09-21 13:51 ` David Marchand
2021-09-21 15:10 ` David Hunt
2021-09-22 12:29 ` [dpdk-dev] [PATCH v4 " David Hunt
2021-09-22 12:29 ` [dpdk-dev] [PATCH v4 2/2] eal: add additional info if core mask " David Hunt
2021-09-23 8:12 ` David Marchand
2021-09-23 10:21 ` David Hunt
2021-09-23 8:11 ` [dpdk-dev] [PATCH v4 1/2] eal: add additional info if core list " David Marchand
2021-09-23 9:47 ` David Hunt
2021-09-23 11:02 ` [dpdk-dev] [PATCH v5 " David Hunt
2021-09-23 11:02 ` [dpdk-dev] [PATCH v5 2/2] eal: add additional info if core mask " David Hunt
2021-11-02 17:45 ` David Marchand
2021-11-03 10:27 ` David Hunt
2021-11-03 10:29 ` David Marchand
2021-11-03 13:30 ` David Hunt
2021-11-03 14:32 ` [dpdk-dev] [PATCH v6 1/2] eal: add additional info if core list " David Hunt
2021-11-03 14:32 ` [dpdk-dev] [PATCH v6 2/2] eal: add additional info if core mask " David Hunt
2021-11-05 10:50 ` David Marchand
2021-09-09 13:45 ` [dpdk-dev] [PATCH v1 2/6] lib/power: reduce memory footprint of acpi lib David Hunt
2021-09-09 13:45 ` David Hunt [this message]
2021-09-09 13:45 ` [dpdk-dev] [PATCH v1 4/6] lib/power: reduce memory footprint of cppc lib David Hunt
2021-09-09 13:45 ` [dpdk-dev] [PATCH v1 5/6] lib/power: reduce memory footprint of channels David Hunt
2021-09-09 13:45 ` [dpdk-dev] [PATCH v1 6/6] lib/power: switch empty poll to max cores config David Hunt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210909134511.18871-4-david.hunt@intel.com \
--to=david.hunt@intel.com \
--cc=bruce.richardson@intel.com \
--cc=dev@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.