Add selftest as a device argument that can be enabled by suppling
'self_test=1' as a vdev parameter

        --vdev="event_sw,self_test=1"

The selftest is run after vdev creation is successfully complete.

Signed-off-by: Pavan Nikhilesh <pbhagavat...@caviumnetworks.com>
---
 drivers/event/sw/Makefile   |  2 ++
 drivers/event/sw/sw_evdev.c | 23 +++++++++++++++++++++++
 drivers/event/sw/sw_evdev.h |  1 +
 3 files changed, 26 insertions(+)

diff --git a/drivers/event/sw/Makefile b/drivers/event/sw/Makefile
index 2f2b67bac..d4f7677fe 100644
--- a/drivers/event/sw/Makefile
+++ b/drivers/event/sw/Makefile
@@ -44,6 +44,7 @@ CFLAGS += -Wno-missing-field-initializers
 endif
 endif
 LDLIBS += -lrte_eal -lrte_eventdev -lrte_kvargs -lrte_ring
+LDLIBS += -lrte_mempool -lrte_mbuf
 LDLIBS += -lrte_bus_vdev
 
 # library version
@@ -57,6 +58,7 @@ SRCS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw_evdev.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw_evdev_worker.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw_evdev_scheduler.c
 SRCS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += sw_evdev_xstats.c
+SRCS-$(CONFIG_RTE_LIBRTE_PMD_SW_EVENTDEV) += selftest_sw.c
 
 # export include files
 SYMLINK-y-include +=
diff --git a/drivers/event/sw/sw_evdev.c b/drivers/event/sw/sw_evdev.c
index 5b4a20889..7c16d0de6 100644
--- a/drivers/event/sw/sw_evdev.c
+++ b/drivers/event/sw/sw_evdev.c
@@ -47,6 +47,7 @@
 #define NUMA_NODE_ARG "numa_node"
 #define SCHED_QUANTA_ARG "sched_quanta"
 #define CREDIT_QUANTA_ARG "credit_quanta"
+#define SELF_TEST_ARG "self_test"
 
 static void
 sw_info_get(struct rte_eventdev *dev, struct rte_event_dev_info *info);
@@ -756,6 +757,13 @@ set_credit_quanta(const char *key __rte_unused, const char 
*value, void *opaque)
        return 0;
 }
 
+static int
+set_self_test(const char *key __rte_unused, const char *value, void *opaque)
+{
+       int *test = opaque;
+       *test = !!atoi(value);
+       return 0;
+}
 
 static int32_t sw_sched_service_func(void *args)
 {
@@ -796,6 +804,7 @@ sw_probe(struct rte_vdev_device *vdev)
                NUMA_NODE_ARG,
                SCHED_QUANTA_ARG,
                CREDIT_QUANTA_ARG,
+               SELF_TEST_ARG,
                NULL
        };
        const char *name;
@@ -805,6 +814,7 @@ sw_probe(struct rte_vdev_device *vdev)
        int socket_id = rte_socket_id();
        int sched_quanta  = SW_DEFAULT_SCHED_QUANTA;
        int credit_quanta = SW_DEFAULT_CREDIT_QUANTA;
+       int self_test = 0;
 
        name = rte_vdev_device_name(vdev);
        params = rte_vdev_device_args(vdev);
@@ -846,6 +856,16 @@ sw_probe(struct rte_vdev_device *vdev)
                                return ret;
                        }
 
+                       ret = rte_kvargs_process(kvlist, SELF_TEST_ARG,
+                                       set_self_test, &self_test);
+                       if (ret != 0) {
+                               SW_LOG_ERR(
+                                       "%s: Error parsing self test parameter",
+                                       name);
+                               rte_kvargs_free(kvlist);
+                               return ret;
+                       }
+
                        rte_kvargs_free(kvlist);
                }
        }
@@ -897,6 +917,9 @@ sw_probe(struct rte_vdev_device *vdev)
        dev->data->service_inited = 1;
        dev->data->service_id = sw->service_id;
 
+       if (self_test)
+               test_sw_eventdev();
+
        return 0;
 }
 
diff --git a/drivers/event/sw/sw_evdev.h b/drivers/event/sw/sw_evdev.h
index 085938887..838ff0b58 100644
--- a/drivers/event/sw/sw_evdev.h
+++ b/drivers/event/sw/sw_evdev.h
@@ -333,5 +333,6 @@ int sw_xstats_reset(struct rte_eventdev *dev,
                const uint32_t ids[],
                uint32_t nb_ids);
 
+void test_sw_eventdev(void);
 
 #endif /* _SW_EVDEV_H_ */
-- 
2.14.1

Reply via email to