event/dsw: reduce latency in low-load situations
[dpdk.git] / drivers / event / dsw / dsw_event.c
index eae53b2..05abfb2 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
@@ -1254,11 +1242,11 @@ dsw_event_dequeue_burst(void *port, struct rte_event *events, uint16_t num,
                 * seem to improve performance.
                 */
                dsw_port_record_seen_events(port, events, dequeued);
-       }
-       /* XXX: Assuming the port can't produce any more work,
-        *      consider flushing the output buffer, on dequeued ==
-        *      0.
-        */
+       } else /* Zero-size dequeue means a likely idle port, and thus
+               * we can afford trading some efficiency for a slightly
+               * reduced event wall-time latency.
+               */
+               dsw_port_flush_out_buffers(dsw, port);
 
 #ifdef DSW_SORT_DEQUEUED
        dsw_stable_sort(events, dequeued, sizeof(events[0]), dsw_cmp_event);