service: fix race in service on app lcore function
authorHarry van Haaren <harry.van.haaren@intel.com>
Wed, 1 Nov 2017 18:48:01 +0000 (18:48 +0000)
committerThomas Monjalon <thomas@monjalon.net>
Tue, 7 Nov 2017 00:42:04 +0000 (01:42 +0100)
commit8d39d3e237c29a9eef6b6c3b57982ca7e7077642
tree4304127562f96911d9a476b278ef427516f4db4e
parentdd74b786f24a1e8c4e6656b94c73ab0d217de023
service: fix race in service on app lcore function

This commit fixes a possible race condition if an application
uses the service-cores infrastructure and the function to run
a service on an application lcore at the same time.

The fix is to change the num_mapped_cores variable to be an
atomic variable. This causes concurrent accesses by multiple
threads to a service using rte_service_run_iter_on_app_lcore()
to detect if another core is currently mapped to the service,
and refuses to run if it is not multi-thread safe.

The run iteration on app lcore function has two arguments, the
service id to run, and if atomics should be used to serialize access
to multi-thread unsafe services. This allows applications to choose
if they wish to use use the service-cores feature, or if they
take responsibility themselves for serializing invoking a service.
See doxygen documentation for more details.

Two unit tests were added to verify the behaviour of the
function to run a service on an application core, testing both
a multi-thread safe service, and a multi-thread unsafe service.

The doxygen API documentation for the function has been updated
to reflect the current and correct behaviour.

Fixes: e9139a32f6e8 ("service: add function to run on app lcore")

Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
examples/eventdev_pipeline_sw_pmd/main.c
lib/librte_eal/common/include/rte_service.h
lib/librte_eal/common/rte_service.c
test/test/test_eventdev_sw.c
test/test/test_service_cores.c