event/dsw: use custom element size ring for control
authorMattias Rönnblom <mattias.ronnblom@ericsson.com>
Mon, 20 Jan 2020 15:03:00 +0000 (16:03 +0100)
committerJerin Jacob <jerinj@marvell.com>
Tue, 28 Jan 2020 06:00:12 +0000 (07:00 +0100)
Replace DSW's use of regular DPDK rings (and code for
packing/unpacking control messages into void pointers) with custom
size rings.

In addition to cleaner code, this change allows DSW to support up to
the eventdev API's maximum of 255 ports by tweaking DSW_MAX_PORTS.

Signed-off-by: Mattias Rönnblom <mattias.ronnblom@ericsson.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli@arm.com>
drivers/event/dsw/Makefile
drivers/event/dsw/dsw_evdev.c
drivers/event/dsw/dsw_evdev.h
drivers/event/dsw/dsw_event.c
drivers/event/dsw/meson.build

index f6e7dda..68d681f 100644 (file)
@@ -11,6 +11,9 @@ ifneq ($(CONFIG_RTE_TOOLCHAIN_ICC),y)
 CFLAGS += -Wno-format-nonliteral
 endif
 
+# Depends on rte_ring_elem_*()
+CFLAGS += -DALLOW_EXPERIMENTAL_API
+
 LDLIBS += -lrte_eal
 LDLIBS += -lrte_mbuf
 LDLIBS += -lrte_mempool
index 9387d41..7798a38 100644 (file)
@@ -8,6 +8,7 @@
 #include <rte_eventdev_pmd.h>
 #include <rte_eventdev_pmd_vdev.h>
 #include <rte_random.h>
+#include <rte_ring_elem.h>
 
 #include "dsw_evdev.h"
 
@@ -46,9 +47,11 @@ dsw_port_setup(struct rte_eventdev *dev, uint8_t port_id,
        snprintf(ring_name, sizeof(ring_name), "dswctl%d_p%u",
                 dev->data->dev_id, port_id);
 
-       ctl_in_ring = rte_ring_create(ring_name, DSW_CTL_IN_RING_SIZE,
-                                     dev->data->socket_id,
-                                     RING_F_SC_DEQ|RING_F_EXACT_SZ);
+       ctl_in_ring = rte_ring_create_elem(ring_name,
+                                          sizeof(struct dsw_ctl_msg),
+                                          DSW_CTL_IN_RING_SIZE,
+                                          dev->data->socket_id,
+                                          RING_F_SC_DEQ|RING_F_EXACT_SZ);
 
        if (ctl_in_ring == NULL) {
                rte_event_ring_free(in_ring);
index dc28ab1..5c7b610 100644 (file)
@@ -10,7 +10,6 @@
 
 #define DSW_PMD_NAME RTE_STR(event_dsw)
 
-/* Code changes are required to allow more ports. */
 #define DSW_MAX_PORTS (64)
 #define DSW_MAX_PORT_DEQUEUE_DEPTH (128)
 #define DSW_MAX_PORT_ENQUEUE_DEPTH (128)
@@ -226,15 +225,12 @@ struct dsw_evdev {
 #define DSW_CTL_UNPAUS_REQ (1)
 #define DSW_CTL_CFM (2)
 
-/* sizeof(struct dsw_ctl_msg) must be equal or less than
- * sizeof(void *), to fit on the control ring.
- */
 struct dsw_ctl_msg {
-       uint8_t type:2;
-       uint8_t originating_port_id:6;
+       uint8_t type;
+       uint8_t originating_port_id;
        uint8_t queue_id;
        uint16_t flow_hash;
-} __rte_packed;
+} __rte_aligned(4);
 
 uint16_t dsw_event_enqueue(void *port, const struct rte_event *event);
 uint16_t dsw_event_enqueue_burst(void *port,
index eae53b2..d68b71b 100644 (file)
@@ -176,27 +176,15 @@ dsw_port_consider_load_update(struct dsw_port *port, uint64_t now)
 static void
 dsw_port_ctl_enqueue(struct dsw_port *port, struct dsw_ctl_msg *msg)
 {
-       void *raw_msg;
-
-       memcpy(&raw_msg, msg, sizeof(*msg));
-
        /* there's always room on the ring */
-       while (rte_ring_enqueue(port->ctl_in_ring, raw_msg) != 0)
+       while (rte_ring_enqueue_elem(port->ctl_in_ring, msg, sizeof(*msg)) != 0)
                rte_pause();
 }
 
 static int
 dsw_port_ctl_dequeue(struct dsw_port *port, struct dsw_ctl_msg *msg)
 {
-       void *raw_msg;
-       int rc;
-
-       rc = rte_ring_dequeue(port->ctl_in_ring, &raw_msg);
-
-       if (rc == 0)
-               memcpy(msg, &raw_msg, sizeof(*msg));
-
-       return rc;
+       return rte_ring_dequeue_elem(port->ctl_in_ring, msg, sizeof(*msg));
 }
 
 static void
index 60ab13d..3b39cb6 100644 (file)
@@ -6,3 +6,6 @@ if cc.has_argument('-Wno-format-nonliteral')
        cflags += '-Wno-format-nonliteral'
 endif
 sources = files('dsw_evdev.c', 'dsw_event.c', 'dsw_xstats.c')
+
+# Depends on rte_ring_elem_*()
+allow_experimental_apis = true