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 <harry.van.haaren@intel.com> Acked-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
This commit is contained in:
parent
519d2e3b3d
commit
a894d4815f
@ -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;
|
||||
|
@ -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];
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user