@@ -36,6 +36,7 @@
#include <rte_common.h>
#include <rte_debug.h>
#include <rte_eventdev.h>
+#include <rte_service.h>
#define CLNRM "\x1b[0m"
#define CLRED "\x1b[31m"
@@ -113,4 +114,44 @@ evt_sched_type2queue_cfg(uint8_t sched_type)
return ret;
}
+
+static inline int
+evt_service_setup(uint8_t dev_id)
+{
+ uint32_t service_id;
+ int32_t core_cnt;
+ unsigned lcore = 0;
+ uint32_t core_array[RTE_MAX_LCORE];
+ uint8_t cnt;
+ uint8_t min_cnt = UINT8_MAX;
+
+ if (evt_has_distributed_sched(dev_id))
+ return 0;
+
+ if (!rte_service_lcore_count())
+ return -ENOENT;
+
+ if (!rte_event_dev_service_id_get(dev_id, &service_id)) {
+ core_cnt = rte_service_lcore_list(core_array,
+ RTE_MAX_LCORE);
+ if (core_cnt < 0)
+ return -ENOENT;
+ /* Get the core which has least number of services running. */
+ while (core_cnt--) {
+ /* Reset default mapping */
+ rte_service_map_lcore_set(service_id,
+ core_array[core_cnt], 0);
+ cnt = rte_service_lcore_count_services(
+ core_array[core_cnt]);
+ if (cnt < min_cnt) {
+ lcore = core_array[core_cnt];
+ min_cnt = cnt;
+ }
+ }
+ if (rte_service_map_lcore_set(service_id, lcore, 1))
+ return -ENOENT;
+ }
+ return 0;
+}
+
#endif /* _EVT_COMMON_*/
@@ -114,13 +114,6 @@ evt_parse_test_name(struct evt_options *opt, const char *arg)
}
static int
-evt_parse_slcore(struct evt_options *opt, const char *arg)
-{
- opt->slcore = atoi(arg);
- return 0;
-}
-
-static int
evt_parse_socket_id(struct evt_options *opt, const char *arg)
{
opt->socket_id = atoi(arg);
@@ -188,7 +181,6 @@ usage(char *program)
"\t--test : name of the test application to run\n"
"\t--socket_id : socket_id of application resources\n"
"\t--pool_sz : pool size of the mempool\n"
- "\t--slcore : lcore id of the scheduler\n"
"\t--plcores : list of lcore ids for producers\n"
"\t--wlcores : list of lcore ids for workers\n"
"\t--stlist : list of scheduled types of the stages\n"
@@ -254,7 +246,6 @@ static struct option lgopts[] = {
{ EVT_POOL_SZ, 1, 0, 0 },
{ EVT_NB_PKTS, 1, 0, 0 },
{ EVT_WKR_DEQ_DEP, 1, 0, 0 },
- { EVT_SCHED_LCORE, 1, 0, 0 },
{ EVT_SCHED_TYPE_LIST, 1, 0, 0 },
{ EVT_FWD_LATENCY, 0, 0, 0 },
{ EVT_QUEUE_PRIORITY, 0, 0, 0 },
@@ -278,7 +269,6 @@ evt_opts_parse_long(int opt_idx, struct evt_options *opt)
{ EVT_POOL_SZ, evt_parse_pool_sz},
{ EVT_NB_PKTS, evt_parse_nb_pkts},
{ EVT_WKR_DEQ_DEP, evt_parse_wkr_deq_dep},
- { EVT_SCHED_LCORE, evt_parse_slcore},
{ EVT_SCHED_TYPE_LIST, evt_parse_sched_type_list},
{ EVT_FWD_LATENCY, evt_parse_fwd_latency},
{ EVT_QUEUE_PRIORITY, evt_parse_queue_priority},
@@ -179,6 +179,12 @@ order_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
if (ret)
return ret;
+ ret = evt_service_setup(opt->dev_id);
+ if (ret) {
+ evt_err("No service lcore found to run event dev.");
+ return ret;
+ }
+
ret = rte_event_dev_start(opt->dev_id);
if (ret) {
evt_err("failed to start eventdev %d", opt->dev_id);
@@ -292,9 +292,6 @@ order_launch_lcores(struct evt_test *test, struct evt_options *opt,
int64_t old_remaining = -1;
while (t->err == false) {
-
- rte_event_schedule(opt->dev_id);
-
uint64_t new_cycles = rte_get_timer_cycles();
int64_t remaining = rte_atomic64_read(&t->outstand_pkts);
@@ -192,6 +192,12 @@ order_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
if (ret)
return ret;
+ ret = evt_service_setup(opt->dev_id);
+ if (ret) {
+ evt_err("No service lcore found to run event dev.");
+ return ret;
+ }
+
ret = rte_event_dev_start(opt->dev_id);
if (ret) {
evt_err("failed to start eventdev %d", opt->dev_id);
@@ -221,6 +221,12 @@ perf_atq_eventdev_setup(struct evt_test *test, struct evt_options *opt)
if (ret)
return ret;
+ ret = evt_service_setup(opt->dev_id);
+ if (ret) {
+ evt_err("No service lcore found to run event dev.");
+ return ret;
+ }
+
ret = rte_event_dev_start(opt->dev_id);
if (ret) {
evt_err("failed to start eventdev %d", opt->dev_id);
@@ -88,18 +88,6 @@ perf_producer(void *arg)
return 0;
}
-static inline int
-scheduler(void *arg)
-{
- struct test_perf *t = arg;
- const uint8_t dev_id = t->opt->dev_id;
-
- while (t->done == false)
- rte_event_schedule(dev_id);
-
- return 0;
-}
-
static inline uint64_t
processed_pkts(struct test_perf *t)
{
@@ -163,15 +151,6 @@ perf_launch_lcores(struct evt_test *test, struct evt_options *opt,
port_idx++;
}
- /* launch scheduler */
- if (!evt_has_distributed_sched(opt->dev_id)) {
- ret = rte_eal_remote_launch(scheduler, t, opt->slcore);
- if (ret) {
- evt_err("failed to launch sched %d", opt->slcore);
- return ret;
- }
- }
-
const uint64_t total_pkts = opt->nb_pkts *
evt_nr_active_lcores(opt->plcores);
@@ -159,6 +159,7 @@ int perf_test_setup(struct evt_test *test, struct evt_options *opt);
int perf_mempool_setup(struct evt_test *test, struct evt_options *opt);
int perf_event_dev_port_setup(struct evt_test *test, struct evt_options *opt,
uint8_t stride, uint8_t nb_queues);
+int perf_event_dev_service_setup(uint8_t dev_id);
int perf_launch_lcores(struct evt_test *test, struct evt_options *opt,
int (*worker)(void *));
void perf_opt_dump(struct evt_options *opt, uint8_t nb_queues);
@@ -232,6 +232,12 @@ perf_queue_eventdev_setup(struct evt_test *test, struct evt_options *opt)
if (ret)
return ret;
+ ret = evt_service_setup(opt->dev_id);
+ if (ret) {
+ evt_err("No service lcore found to run event dev.");
+ return ret;
+ }
+
ret = rte_event_dev_start(opt->dev_id);
if (ret) {
evt_err("failed to start eventdev %d", opt->dev_id);