[dpdk-dev,1/2] service: fix del to reset lcore role to rte
Checks
Commit Message
This patch fixes the reset of the service core,
that when rte_service_lcore_del() is called, the
lcore_role is restored to RTE.
This issue was reported as when running the unit tests, an
error was thrown that "failed to allocate lcore". Investigating
revealed that the state of the service-cores after del() was
not allowing a core to be re-used at a later point in time.
Fixes: 21698354c832 ("service: introduce service cores concept")
+CC stable@dpdk.org
Reported-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
---
@Stable maintainers; this is an EXPERIMENTAL tagged API, so I'm
not sure what the expectation is in terms of backporting.
---
lib/librte_eal/common/rte_service.c | 30 +++++++++++++++---------------
1 file changed, 15 insertions(+), 15 deletions(-)
Comments
Hi Harry,
Comments inline.
On Wed, Dec 20, 2017 at 11:21:46AM +0000, Harry van Haaren wrote:
> This patch fixes the reset of the service core,
> that when rte_service_lcore_del() is called, the
> lcore_role is restored to RTE.
>
> This issue was reported as when running the unit tests, an
> error was thrown that "failed to allocate lcore". Investigating
> revealed that the state of the service-cores after del() was
> not allowing a core to be re-used at a later point in time.
>
> Fixes: 21698354c832 ("service: introduce service cores concept")
> +CC stable@dpdk.org
>
> Reported-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
> Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
>
> ---
>
> @Stable maintainers; this is an EXPERIMENTAL tagged API, so I'm
> not sure what the expectation is in terms of backporting.
> ---
> lib/librte_eal/common/rte_service.c | 30 +++++++++++++++---------------
> 1 file changed, 15 insertions(+), 15 deletions(-)
>
<snip>
> int32_t rte_service_lcore_reset_all(void)
> {
> /* loop over cores, reset all to mask 0 */
> uint32_t i;
> for (i = 0; i < RTE_MAX_LCORE; i++) {
> lcore_states[i].service_mask = 0;
> - lcore_states[i].is_service_core = 0;
> + set_lcore_state(i, ROLE_RTE);
Setting ROLE_RTE for RTE_MAX_LCORE lcores is incorrect. There should be a check
to set only service lcores something like this:
for (i = 0; i < RTE_MAX_LCORE; i++) {
- lcore_states[i].service_mask = 0;
- set_lcore_state(i, ROLE_RTE);
- lcore_states[i].runstate = RUNSTATE_STOPPED;
+ if (lcore_states[i].is_service_core) {
+ lcore_states[i].service_mask = 0;
+ set_lcore_state(i, ROLE_RTE);
+ lcore_states[i].runstate = RUNSTATE_STOPPED;
+ }
Cheers,
Pavan.
> lcore_states[i].runstate = RUNSTATE_STOPPED;
> }
> for (i = 0; i < RTE_SERVICE_NUM_MAX; i++)
> @@ -600,20 +614,6 @@ int32_t rte_service_lcore_reset_all(void)
> return 0;
> }
>
> int32_t
> rte_service_lcore_add(uint32_t lcore)
> {
> --
> 2.7.4
>
@@ -583,13 +583,27 @@ rte_service_map_lcore_get(uint32_t id, uint32_t lcore)
return ret;
}
+static void
+set_lcore_state(uint32_t lcore, int32_t state)
+{
+ /* mark core state in hugepage backed config */
+ struct rte_config *cfg = rte_eal_get_configuration();
+ cfg->lcore_role[lcore] = state;
+
+ /* mark state in process local lcore_config */
+ lcore_config[lcore].core_role = state;
+
+ /* update per-lcore optimized state tracking */
+ lcore_states[lcore].is_service_core = (state == ROLE_SERVICE);
+}
+
int32_t rte_service_lcore_reset_all(void)
{
/* loop over cores, reset all to mask 0 */
uint32_t i;
for (i = 0; i < RTE_MAX_LCORE; i++) {
lcore_states[i].service_mask = 0;
- lcore_states[i].is_service_core = 0;
+ set_lcore_state(i, ROLE_RTE);
lcore_states[i].runstate = RUNSTATE_STOPPED;
}
for (i = 0; i < RTE_SERVICE_NUM_MAX; i++)
@@ -600,20 +614,6 @@ int32_t rte_service_lcore_reset_all(void)
return 0;
}
-static void
-set_lcore_state(uint32_t lcore, int32_t state)
-{
- /* mark core state in hugepage backed config */
- struct rte_config *cfg = rte_eal_get_configuration();
- cfg->lcore_role[lcore] = state;
-
- /* mark state in process local lcore_config */
- lcore_config[lcore].core_role = state;
-
- /* update per-lcore optimized state tracking */
- lcore_states[lcore].is_service_core = (state == ROLE_SERVICE);
-}
-
int32_t
rte_service_lcore_add(uint32_t lcore)
{