]> git.droids-corp.org - dpdk.git/commitdiff
service: allow to disable core check
authorHarry van Haaren <harry.van.haaren@intel.com>
Wed, 25 Oct 2017 13:25:29 +0000 (14:25 +0100)
committerThomas Monjalon <thomas@monjalon.net>
Wed, 25 Oct 2017 15:05:38 +0000 (17:05 +0200)
This commit adds a new function to disable the runtime mapped
service-cores check. This allows an application to take responsibility
of running unmapped services.

This feature is useful in cases like unit tests, where the application
code (or unit test in this case) requires accurate control over when
the service function is called to ensure correct behaviour, and when
an application has an advanced use-case and wishes to manage services
manually.

Signed-off-by: Harry van Haaren <harry.van.haaren@intel.com>
Acked-by: Pavan Nikhilesh <pbhagavatula@caviumnetworks.com>
lib/librte_eal/common/include/rte_service.h
lib/librte_eal/common/rte_service.c
lib/librte_eal/rte_eal_version.map

index 63d3170ad2b789db57a50b7aa40614be829daed6..d9de5ad74e6a8fac84521c493a918acb67fd55ad 100644 (file)
@@ -199,7 +199,12 @@ int32_t rte_service_runstate_set(uint32_t id, uint32_t runstate);
  * @b EXPERIMENTAL: this API may change without prior notice
  *
  * Get the runstate for the service with *id*. See *rte_service_runstate_set*
- * for details of runstates.
+ * for details of runstates. A service can call this function to ensure that
+ * the application has indicated that it will receive CPU cycles. Either a
+ * service-core is mapped (default case), or the application has explicitly
+ * disabled the check that a service-cores is mapped to the service and takes
+ * responsibility to run the service manually using the available function
+ * *rte_service_run_iter_on_app_lcore* to do so.
  *
  * @retval 1 Service is running
  * @retval 0 Service is stopped
@@ -207,6 +212,22 @@ int32_t rte_service_runstate_set(uint32_t id, uint32_t runstate);
  */
 int32_t rte_service_runstate_get(uint32_t id);
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ *
+ * Enable or disable the check for a service-core being mapped to the service.
+ * An application can disable the check when takes the responsibility to run a
+ * service itself using *rte_service_run_iter_on_app_lcore*.
+ *
+ * @param id The id of the service to set the check on
+ * @param enable When zero, the check is disabled. Non-zero enables the check.
+ *
+ * @retval 0 Success
+ * @retval -EINVAL Invalid service ID
+ */
+int32_t rte_service_set_runstate_mapped_check(uint32_t id, int32_t enable);
+
 /**
  * @warning
  * @b EXPERIMENTAL: this API may change without prior notice
index 4e27f7505678cbd198f64e9b9ab7901d73ee9708..f17bf4bb0484749c251de382b3cbd8888291e545 100644 (file)
@@ -54,6 +54,7 @@
 
 #define SERVICE_F_REGISTERED    (1 << 0)
 #define SERVICE_F_STATS_ENABLED (1 << 1)
+#define SERVICE_F_START_CHECK   (1 << 2)
 
 /* runstates for services and lcores, denoting if they are active or not */
 #define RUNSTATE_STOPPED 0
@@ -180,6 +181,19 @@ int32_t rte_service_set_stats_enable(uint32_t id, int32_t enabled)
        return 0;
 }
 
+int32_t rte_service_set_runstate_mapped_check(uint32_t id, int32_t enabled)
+{
+       struct rte_service_spec_impl *s;
+       SERVICE_VALID_GET_OR_ERR_RET(id, s, 0);
+
+       if (enabled)
+               s->internal_flags |= SERVICE_F_START_CHECK;
+       else
+               s->internal_flags &= ~(SERVICE_F_START_CHECK);
+
+       return 0;
+}
+
 uint32_t
 rte_service_get_count(void)
 {
@@ -241,7 +255,7 @@ rte_service_component_register(const struct rte_service_spec *spec,
 
        struct rte_service_spec_impl *s = &rte_services[free_slot];
        s->spec = *spec;
-       s->internal_flags |= SERVICE_F_REGISTERED;
+       s->internal_flags |= SERVICE_F_REGISTERED | SERVICE_F_START_CHECK;
 
        rte_smp_wmb();
        rte_service_count++;
@@ -309,9 +323,13 @@ rte_service_runstate_get(uint32_t id)
        struct rte_service_spec_impl *s;
        SERVICE_VALID_GET_OR_ERR_RET(id, s, -EINVAL);
        rte_smp_rmb();
+
+       int check_disabled = !(s->internal_flags & SERVICE_F_START_CHECK);
+       int lcore_mapped = (s->num_mapped_cores > 0);
+
        return (s->app_runstate == RUNSTATE_RUNNING) &&
                (s->comp_runstate == RUNSTATE_RUNNING) &&
-               (s->num_mapped_cores > 0);
+               (check_disabled | lcore_mapped);
 }
 
 static inline void
index 4be900878785c89b9630474a367881d973045b58..8eb53abdfab21c0b6b6b174d4106ec4f43f80329 100644 (file)
@@ -232,6 +232,7 @@ EXPERIMENTAL {
        rte_service_run_iter_on_app_lcore;
        rte_service_runstate_get;
        rte_service_runstate_set;
+       rte_service_set_runstate_mapped_check;
        rte_service_set_stats_enable;
        rte_service_start_with_defaults;