eventdev: introduce specialized enqueue forward op variant
authorJerin Jacob <jerin.jacob@caviumnetworks.com>
Thu, 29 Jun 2017 14:19:54 +0000 (19:49 +0530)
committerJerin Jacob <jerin.jacob@caviumnetworks.com>
Fri, 7 Jul 2017 07:28:44 +0000 (09:28 +0200)
Introducing the rte_event_enqueue_new_burst() for enabling the
PMD, an optimization opportunity to optimize if all the events in
the enqueue burst has the op type of RTE_EVENT_OP_FORWARD.

If a PMD does not have any optimization opportunity
for this operation then the PMD can choose the generic enqueue
burst PMD callback as the fallback.

Signed-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>
Acked-by: Gage Eads <gage.eads@intel.com>
Acked-by: Harry van Haaren <harry.van.haaren@intel.com>
drivers/event/dpaa2/dpaa2_eventdev.c
drivers/event/octeontx/ssovf_evdev.c
drivers/event/sw/sw_evdev.c
lib/librte_eventdev/rte_eventdev.h

index 633e2a0..412cee1 100644 (file)
@@ -626,6 +626,7 @@ dpaa2_eventdev_create(const char *name)
        eventdev->enqueue       = dpaa2_eventdev_enqueue;
        eventdev->enqueue_burst = dpaa2_eventdev_enqueue_burst;
        eventdev->enqueue_new_burst = dpaa2_eventdev_enqueue_burst;
+       eventdev->enqueue_forward_burst = dpaa2_eventdev_enqueue_burst;
        eventdev->dequeue       = dpaa2_eventdev_dequeue;
        eventdev->dequeue_burst = dpaa2_eventdev_dequeue_burst;
 
index 0d0c6a1..5f97bee 100644 (file)
@@ -159,6 +159,7 @@ ssovf_fastpath_fns_set(struct rte_eventdev *dev)
        dev->enqueue       = ssows_enq;
        dev->enqueue_burst = ssows_enq_burst;
        dev->enqueue_new_burst = ssows_enq_burst;
+       dev->enqueue_forward_burst = ssows_enq_burst;
        dev->dequeue       = ssows_deq;
        dev->dequeue_burst = ssows_deq_burst;
 
index 951ad1b..2b0b4fa 100644 (file)
@@ -797,6 +797,7 @@ sw_probe(struct rte_vdev_device *vdev)
        dev->enqueue = sw_event_enqueue;
        dev->enqueue_burst = sw_event_enqueue_burst;
        dev->enqueue_new_burst = sw_event_enqueue_burst;
+       dev->enqueue_forward_burst = sw_event_enqueue_burst;
        dev->dequeue = sw_event_dequeue;
        dev->dequeue_burst = sw_event_dequeue_burst;
        dev->schedule = sw_event_schedule;
index 132f75f..29d707f 100644 (file)
@@ -1067,6 +1067,8 @@ struct rte_eventdev {
        /**< Pointer to PMD enqueue burst function. */
        event_enqueue_burst_t enqueue_new_burst;
        /**< Pointer to PMD enqueue burst function(op new variant) */
+       event_enqueue_burst_t enqueue_forward_burst;
+       /**< Pointer to PMD enqueue burst function(op forward variant) */
        event_dequeue_t dequeue;
        /**< Pointer to PMD dequeue function. */
        event_dequeue_burst_t dequeue_burst;
@@ -1231,6 +1233,55 @@ rte_event_enqueue_new_burst(uint8_t dev_id, uint8_t port_id,
                        dev->enqueue_new_burst);
 }
 
+/**
+ * Enqueue a burst of events objects of operation type *RTE_EVENT_OP_FORWARD*
+ * on an event device designated by its *dev_id* through the event port
+ * specified by *port_id*.
+ *
+ * Provides the same functionality as rte_event_enqueue_burst(), expect that
+ * application can use this API when the all objects in the burst contains
+ * the enqueue operation of the type *RTE_EVENT_OP_FORWARD*. This specialized
+ * function can provide the additional hint to the PMD and optimize if possible.
+ *
+ * The rte_event_enqueue_new_burst() result is undefined if the enqueue burst
+ * has event object of operation type != RTE_EVENT_OP_FORWARD.
+ *
+ * @param dev_id
+ *   The identifier of the device.
+ * @param port_id
+ *   The identifier of the event port.
+ * @param ev
+ *   Points to an array of *nb_events* objects of type *rte_event* structure
+ *   which contain the event object enqueue operations to be processed.
+ * @param nb_events
+ *   The number of event objects to enqueue, typically number of
+ *   rte_event_port_enqueue_depth() available for this port.
+ *
+ * @return
+ *   The number of event objects actually enqueued on the event device. The
+ *   return value can be less than the value of the *nb_events* parameter when
+ *   the event devices queue is full or if invalid parameters are specified in a
+ *   *rte_event*. If the return value is less than *nb_events*, the remaining
+ *   events at the end of ev[] are not consumed and the caller has to take care
+ *   of them, and rte_errno is set accordingly. Possible errno values include:
+ *   - -EINVAL  The port ID is invalid, device ID is invalid, an event's queue
+ *              ID is invalid, or an event's sched type doesn't match the
+ *              capabilities of the destination queue.
+ *   - -ENOSPC  The event port was backpressured and unable to enqueue
+ *              one or more events. This error code is only applicable to
+ *              closed systems.
+ * @see rte_event_port_enqueue_depth() rte_event_enqueue_burst()
+ */
+static inline uint16_t
+rte_event_enqueue_forward_burst(uint8_t dev_id, uint8_t port_id,
+                       const struct rte_event ev[], uint16_t nb_events)
+{
+       const struct rte_eventdev *dev = &rte_eventdevs[dev_id];
+
+       return __rte_event_enqueue_burst(dev_id, port_id, ev, nb_events,
+                       dev->enqueue_forward_burst);
+}
+
 /**
  * Converts nanoseconds to *timeout_ticks* value for rte_event_dequeue_burst()
  *