eal: make lcore config private
[dpdk.git] / lib / librte_eal / common / rte_service.c
index fa15f66..79235c0 100644 (file)
@@ -7,7 +7,6 @@
 #include <inttypes.h>
 #include <limits.h>
 #include <string.h>
-#include <dirent.h>
 
 #include <rte_compat.h>
 #include <rte_service.h>
@@ -22,6 +21,8 @@
 #include <rte_memory.h>
 #include <rte_malloc.h>
 
+#include "eal_private.h"
+
 #define RTE_SERVICE_NUM_MAX 64
 
 #define SERVICE_F_REGISTERED    (1 << 0)
@@ -60,7 +61,7 @@ struct core_state {
        uint64_t service_mask;
        uint8_t runstate; /* running or stopped */
        uint8_t is_service_core; /* set if core is currently a service core */
-
+       uint8_t service_active_on_lcore[RTE_SERVICE_NUM_MAX];
        uint64_t loops;
        uint64_t calls_per_service[RTE_SERVICE_NUM_MAX];
 } __rte_cache_aligned;
@@ -70,10 +71,12 @@ static struct rte_service_spec_impl *rte_services;
 static struct core_state *lcore_states;
 static uint32_t rte_service_library_initialized;
 
-int32_t rte_service_init(void)
+int32_t
+rte_service_init(void)
 {
        if (rte_service_library_initialized) {
-               printf("service library init() called, init flag %d\n",
+               RTE_LOG(NOTICE, EAL,
+                       "service library init() called, init flag %d\n",
                        rte_service_library_initialized);
                return -EALREADY;
        }
@@ -82,14 +85,14 @@ int32_t rte_service_init(void)
                        sizeof(struct rte_service_spec_impl),
                        RTE_CACHE_LINE_SIZE);
        if (!rte_services) {
-               printf("error allocating rte services array\n");
+               RTE_LOG(ERR, EAL, "error allocating rte services array\n");
                goto fail_mem;
        }
 
        lcore_states = rte_calloc("rte_service_core_states", RTE_MAX_LCORE,
                        sizeof(struct core_state), RTE_CACHE_LINE_SIZE);
        if (!lcore_states) {
-               printf("error allocating core states array\n");
+               RTE_LOG(ERR, EAL, "error allocating core states array\n");
                goto fail_mem;
        }
 
@@ -108,10 +111,8 @@ int32_t rte_service_init(void)
        rte_service_library_initialized = 1;
        return 0;
 fail_mem:
-       if (rte_services)
-               rte_free(rte_services);
-       if (lcore_states)
-               rte_free(lcore_states);
+       rte_free(rte_services);
+       rte_free(lcore_states);
        return -ENOMEM;
 }
 
@@ -121,11 +122,8 @@ rte_service_finalize(void)
        if (!rte_service_library_initialized)
                return;
 
-       if (rte_services)
-               rte_free(rte_services);
-
-       if (lcore_states)
-               rte_free(lcore_states);
+       rte_free(rte_services);
+       rte_free(lcore_states);
 
        rte_service_library_initialized = 0;
 }
@@ -354,8 +352,12 @@ service_run(uint32_t i, struct core_state *cs, uint64_t service_mask)
        struct rte_service_spec_impl *s = &rte_services[i];
        if (s->comp_runstate != RUNSTATE_RUNNING ||
                        s->app_runstate != RUNSTATE_RUNNING ||
-                       !(service_mask & (UINT64_C(1) << i)))
+                       !(service_mask & (UINT64_C(1) << i))) {
+               cs->service_active_on_lcore[i] = 0;
                return -ENOEXEC;
+       }
+
+       cs->service_active_on_lcore[i] = 1;
 
        /* check do we need cmpset, if MT safe or <= 1 core
         * mapped, atomic ops are not required.
@@ -374,8 +376,26 @@ service_run(uint32_t i, struct core_state *cs, uint64_t service_mask)
        return 0;
 }
 
-int32_t rte_service_run_iter_on_app_lcore(uint32_t id,
-               uint32_t serialize_mt_unsafe)
+int32_t
+rte_service_may_be_active(uint32_t id)
+{
+       uint32_t ids[RTE_MAX_LCORE] = {0};
+       int32_t lcore_count = rte_service_lcore_list(ids, RTE_MAX_LCORE);
+       int i;
+
+       if (!service_valid(id))
+               return -EINVAL;
+
+       for (i = 0; i < lcore_count; i++) {
+               if (lcore_states[i].service_active_on_lcore[id])
+                       return 1;
+       }
+
+       return 0;
+}
+
+int32_t
+rte_service_run_iter_on_app_lcore(uint32_t id, uint32_t serialize_mt_unsafe)
 {
        /* run service on calling core, using all-ones as the service mask */
        if (!service_valid(id))
@@ -711,7 +731,7 @@ rte_service_lcore_stop(uint32_t lcore)
 }
 
 int32_t
-rte_service_attr_get(uint32_t id, uint32_t attr_id, uint32_t *attr_value)
+rte_service_attr_get(uint32_t id, uint32_t attr_id, uint64_t *attr_value)
 {
        struct rte_service_spec_impl *s;
        SERVICE_VALID_GET_OR_ERR_RET(id, s, -EINVAL);
@@ -731,7 +751,7 @@ rte_service_attr_get(uint32_t id, uint32_t attr_id, uint32_t *attr_value)
        }
 }
 
-int32_t __rte_experimental
+int32_t
 rte_service_lcore_attr_get(uint32_t lcore, uint32_t attr_id,
                           uint64_t *attr_value)
 {
@@ -771,6 +791,9 @@ rte_service_dump_one(FILE *f, struct rte_service_spec_impl *s,
                return;
        }
 
+       if (f == NULL)
+               return;
+
        fprintf(f, "  %s: stats %d\tcalls %"PRIu64"\tcycles %"
                        PRIu64"\tavg: %"PRIu64"\n",
                        s->spec.name, service_stats_enabled(s), s->calls,
@@ -788,7 +811,7 @@ rte_service_attr_reset_all(uint32_t id)
        return 0;
 }
 
-int32_t __rte_experimental
+int32_t
 rte_service_lcore_attr_reset_all(uint32_t lcore)
 {
        struct core_state *cs;