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
* 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);