From a894d4815f79b0d76527d9c42b23327de1501711 Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Mon, 21 Aug 2017 13:58:04 +0100 Subject: [PATCH] service: return integer service id from register This commit reworks the service register function to accept an extra parameter. The parameter is a uint32_t *, which when provided will be set to the integer service_id that the newly registered service is represented by. This is useful for services that wish to validate settings at a later point in time - they need to know their own service id. This commit updates the eventdev sw pmd, as well as unit tests to use the new register API. Signed-off-by: Harry van Haaren Acked-by: Pavan Nikhilesh --- drivers/event/sw/sw_evdev.c | 4 +-- drivers/event/sw/sw_evdev.h | 1 + lib/librte_eal/bsdapp/eal/rte_eal_version.map | 2 +- .../common/include/rte_service_component.h | 6 +++- lib/librte_eal/common/rte_service.c | 6 +++- .../linuxapp/eal/rte_eal_version.map | 2 +- test/test/test_service_cores.c | 36 ++++++++++--------- 7 files changed, 35 insertions(+), 22 deletions(-) diff --git a/drivers/event/sw/sw_evdev.c b/drivers/event/sw/sw_evdev.c index 9c534b7f93..9cc63a053c 100644 --- a/drivers/event/sw/sw_evdev.c +++ b/drivers/event/sw/sw_evdev.c @@ -620,7 +620,7 @@ sw_start(struct rte_eventdev *dev) struct rte_service_spec *s = rte_service_get_by_name(sw->service_name); if (!rte_service_is_running(s)) SW_LOG_ERR("Warning: No Service core enabled on service %s\n", - s->name); + sw->service_name); /* check all ports are set up */ for (i = 0; i < sw->port_count; i++) @@ -855,7 +855,7 @@ sw_probe(struct rte_vdev_device *vdev) service.callback = sw_sched_service_func; service.callback_userdata = (void *)dev; - int32_t ret = rte_service_register(&service); + int32_t ret = rte_service_component_register(&service, &sw->service_id); if (ret) { SW_LOG_ERR("service register() failed"); return -ENOEXEC; diff --git a/drivers/event/sw/sw_evdev.h b/drivers/event/sw/sw_evdev.h index 71de3c14a0..e0dec910b2 100644 --- a/drivers/event/sw/sw_evdev.h +++ b/drivers/event/sw/sw_evdev.h @@ -278,6 +278,7 @@ struct sw_evdev { uint16_t xstats_count_per_qid[RTE_EVENT_MAX_QUEUES_PER_DEV]; uint16_t xstats_offset_for_qid[RTE_EVENT_MAX_QUEUES_PER_DEV]; + uint32_t service_id; char service_name[SW_PMD_NAME_MAX]; }; diff --git a/lib/librte_eal/bsdapp/eal/rte_eal_version.map b/lib/librte_eal/bsdapp/eal/rte_eal_version.map index 6668e0278b..51281388b2 100644 --- a/lib/librte_eal/bsdapp/eal/rte_eal_version.map +++ b/lib/librte_eal/bsdapp/eal/rte_eal_version.map @@ -212,6 +212,7 @@ EXPERIMENTAL { rte_eal_devargs_remove; rte_eal_hotplug_add; rte_eal_hotplug_remove; + rte_service_component_register; rte_service_dump; rte_service_get_by_id; rte_service_get_by_name; @@ -228,7 +229,6 @@ EXPERIMENTAL { rte_service_map_lcore_get; rte_service_map_lcore_set; rte_service_probe_capability; - rte_service_register; rte_service_reset; rte_service_set_stats_enable; rte_service_start; diff --git a/lib/librte_eal/common/include/rte_service_component.h b/lib/librte_eal/common/include/rte_service_component.h index 7a946a1e44..6ef3ee456e 100644 --- a/lib/librte_eal/common/include/rte_service_component.h +++ b/lib/librte_eal/common/include/rte_service_component.h @@ -89,11 +89,15 @@ struct rte_service_spec { * *rte_service_set_coremask*. * * @param spec The specification of the service to register + * @param[out] service_id A pointer to a uint32_t, which will be filled in + * during registration of the service. It is set to the integers + * service number given to the service. This parameter may be NULL. * @retval 0 Successfully registered the service. * -EINVAL Attempted to register an invalid service (eg, no callback * set) */ -int32_t rte_service_register(const struct rte_service_spec *spec); +int32_t rte_service_component_register(const struct rte_service_spec *spec, + uint32_t *service_id); /** * @warning diff --git a/lib/librte_eal/common/rte_service.c b/lib/librte_eal/common/rte_service.c index 1bf221ddc8..a14b23bc66 100644 --- a/lib/librte_eal/common/rte_service.c +++ b/lib/librte_eal/common/rte_service.c @@ -242,7 +242,8 @@ rte_service_is_running(const struct rte_service_spec *spec) } int32_t -rte_service_register(const struct rte_service_spec *spec) +rte_service_component_register(const struct rte_service_spec *spec, + uint32_t *id_ptr) { uint32_t i; int32_t free_slot = -1; @@ -267,6 +268,9 @@ rte_service_register(const struct rte_service_spec *spec) rte_smp_wmb(); rte_service_count++; + if (id_ptr) + *id_ptr = free_slot; + return 0; } diff --git a/lib/librte_eal/linuxapp/eal/rte_eal_version.map b/lib/librte_eal/linuxapp/eal/rte_eal_version.map index 054feb4ed5..2e3c9f4bfe 100644 --- a/lib/librte_eal/linuxapp/eal/rte_eal_version.map +++ b/lib/librte_eal/linuxapp/eal/rte_eal_version.map @@ -217,6 +217,7 @@ EXPERIMENTAL { rte_eal_devargs_remove; rte_eal_hotplug_add; rte_eal_hotplug_remove; + rte_service_component_register; rte_service_dump; rte_service_get_by_id; rte_service_get_by_name; @@ -233,7 +234,6 @@ EXPERIMENTAL { rte_service_map_lcore_get; rte_service_map_lcore_set; rte_service_probe_capability; - rte_service_register; rte_service_reset; rte_service_set_stats_enable; rte_service_start; diff --git a/test/test/test_service_cores.c b/test/test/test_service_cores.c index fd63efdc05..7767fa27fe 100644 --- a/test/test/test_service_cores.c +++ b/test/test/test_service_cores.c @@ -160,15 +160,17 @@ dummy_register(void) struct rte_service_spec service; memset(&service, 0, sizeof(struct rte_service_spec)); - TEST_ASSERT_EQUAL(-EINVAL, rte_service_register(&service), + TEST_ASSERT_EQUAL(-EINVAL, + rte_service_component_register(&service, NULL), "Invalid callback"); service.callback = dummy_cb; - TEST_ASSERT_EQUAL(-EINVAL, rte_service_register(&service), + TEST_ASSERT_EQUAL(-EINVAL, + rte_service_component_register(&service, NULL), "Invalid name"); snprintf(service.name, sizeof(service.name), DUMMY_SERVICE_NAME); - TEST_ASSERT_EQUAL(0, rte_service_register(&service), + TEST_ASSERT_EQUAL(0, rte_service_component_register(&service, NULL), "Failed to register valid service"); return TEST_SUCCESS; @@ -187,13 +189,15 @@ service_get_by_name(void) /* register service */ struct rte_service_spec service; memset(&service, 0, sizeof(struct rte_service_spec)); - TEST_ASSERT_EQUAL(-EINVAL, rte_service_register(&service), + TEST_ASSERT_EQUAL(-EINVAL, + rte_service_component_register(&service, NULL), "Invalid callback"); service.callback = dummy_cb; - TEST_ASSERT_EQUAL(-EINVAL, rte_service_register(&service), + TEST_ASSERT_EQUAL(-EINVAL, + rte_service_component_register(&service, NULL), "Invalid name"); snprintf(service.name, sizeof(service.name), DUMMY_SERVICE_NAME); - TEST_ASSERT_EQUAL(0, rte_service_register(&service), + TEST_ASSERT_EQUAL(0, rte_service_component_register(&service, NULL), "Failed to register valid service"); /* ensure with dummy services registered returns same ptr as ID */ @@ -221,7 +225,7 @@ service_probe_capability(void) service.callback = dummy_cb; snprintf(service.name, sizeof(service.name), DUMMY_SERVICE_NAME); service.capabilities |= RTE_SERVICE_CAP_MT_SAFE; - TEST_ASSERT_EQUAL(0, rte_service_register(&service), + TEST_ASSERT_EQUAL(0, rte_service_component_register(&service, NULL), "Register of MT SAFE service failed"); /* verify flag is enabled */ @@ -235,7 +239,7 @@ service_probe_capability(void) memset(&service, 0, sizeof(struct rte_service_spec)); service.callback = dummy_cb; snprintf(service.name, sizeof(service.name), DUMMY_SERVICE_NAME); - TEST_ASSERT_EQUAL(0, rte_service_register(&service), + TEST_ASSERT_EQUAL(0, rte_service_component_register(&service, NULL), "Register of non-MT safe service failed"); /* verify flag is enabled */ @@ -274,28 +278,28 @@ static int service_start_stop(void) { const uint32_t sid = 0; - struct rte_service_spec *service = rte_service_get_by_id(0); + struct rte_service_spec *s = rte_service_get_by_id(0); - /* is_running() returns if service is running and slcore is mapped */ + /* runstate_get() returns if service is running and slcore is mapped */ TEST_ASSERT_EQUAL(0, rte_service_lcore_add(slcore_id), "Service core add did not return zero"); int ret = rte_service_map_lcore_set(sid, slcore_id, 1); TEST_ASSERT_EQUAL(0, ret, "Enabling service core, expected 0 got %d", ret); - TEST_ASSERT_EQUAL(0, rte_service_is_running(service), + TEST_ASSERT_EQUAL(0, rte_service_is_running(s), "Error: Service should be stopped"); - TEST_ASSERT_EQUAL(0, rte_service_stop(service), + TEST_ASSERT_EQUAL(0, rte_service_stop(s), "Error: Service stopped returned non-zero"); - TEST_ASSERT_EQUAL(0, rte_service_is_running(service), + TEST_ASSERT_EQUAL(0, rte_service_is_running(s), "Error: Service is running - should be stopped"); - TEST_ASSERT_EQUAL(0, rte_service_start(service), + TEST_ASSERT_EQUAL(0, rte_service_start(s), "Error: Service start returned non-zero"); - TEST_ASSERT_EQUAL(1, rte_service_is_running(service), + TEST_ASSERT_EQUAL(1, rte_service_is_running(s), "Error: Service is not running"); return unregister_all(); @@ -471,7 +475,7 @@ service_threaded_test(int mt_safe) service.callback = dummy_mt_unsafe_cb; } - TEST_ASSERT_EQUAL(0, rte_service_register(&service), + TEST_ASSERT_EQUAL(0, rte_service_component_register(&service, NULL), "Register of MT SAFE service failed"); struct rte_service_spec *s = rte_service_get_by_id(0); -- 2.20.1