numam-dpdk/lib/librte_eventdev/rte_event_eth_tx_adapter.h
Reshma Pattan 5d3f721009 mbuf: implement generic format for sched field
This patch implements the changes proposed in the deprecation
notes [1][2].

librte_mbuf changes:
The mbuf->hash.sched field is updated to support generic
definition in line with the ethdev traffic manager and meter APIs.
The new generic format contains: queue ID, traffic class, color.

Added public APIs to set and get these new fields to and from mbuf.

librte_sched changes:
In addtion, following API functions of the sched library have
been modified with an additional parameter of type struct
rte_sched_port to accommodate the changes made to mbuf sched field.
(i)rte_sched_port_pkt_write()
(ii) rte_sched_port_pkt_read_tree_path()

librte_pipeline, qos_sched UT, qos_sched app are updated
to make use of new changes.

Also mbuf->hash.txadapter has been added for eventdev txq,
rte_event_eth_tx_adapter_txq_set and rte_event_eth_tx_adapter_txq_get()
are updated to use mbuf->hash.txadapter.txq.

doc:
Release notes updated.
Removed deprecation notice for mbuf->hash.sched and sched API.

[1] http://mails.dpdk.org/archives/dev/2018-February/090651.html
[2] https://mails.dpdk.org/archives/dev/2018-November/119051.html

Signed-off-by: Jasvinder Singh <jasvinder.singh@intel.com>
Signed-off-by: Reshma Pattan <reshma.pattan@intel.com>
Acked-by: Cristian Dumitrescu <cristian.dumitrescu@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
Tested-by: Nikhil Rao <nikhil.rao@intel.com>
Reviewed-by: Nikhil Rao <nikhil.rao@intel.com>
2018-12-22 00:22:44 +01:00

459 lines
13 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2018 Intel Corporation.
*/
#ifndef _RTE_EVENT_ETH_TX_ADAPTER_
#define _RTE_EVENT_ETH_TX_ADAPTER_
/**
* @file
*
* RTE Event Ethernet Tx Adapter
*
* The event ethernet Tx adapter provides configuration and data path APIs
* for the ethernet transmit stage of an event driven packet processing
* application. These APIs abstract the implementation of the transmit stage
* and allow the application to use eventdev PMD support or a common
* implementation.
*
* In the common implementation, the application enqueues mbufs to the adapter
* which runs as a rte_service function. The service function dequeues events
* from its event port and transmits the mbufs referenced by these events.
*
* The ethernet Tx event adapter APIs are:
*
* - rte_event_eth_tx_adapter_create()
* - rte_event_eth_tx_adapter_create_ext()
* - rte_event_eth_tx_adapter_free()
* - rte_event_eth_tx_adapter_start()
* - rte_event_eth_tx_adapter_stop()
* - rte_event_eth_tx_adapter_queue_add()
* - rte_event_eth_tx_adapter_queue_del()
* - rte_event_eth_tx_adapter_stats_get()
* - rte_event_eth_tx_adapter_stats_reset()
* - rte_event_eth_tx_adapter_enqueue()
* - rte_event_eth_tx_adapter_event_port_get()
* - rte_event_eth_tx_adapter_service_id_get()
*
* The application creates the adapter using
* rte_event_eth_tx_adapter_create() or rte_event_eth_tx_adapter_create_ext().
*
* The adapter will use the common implementation when the eventdev PMD
* does not have the #RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT capability.
* The common implementation uses an event port that is created using the port
* configuration parameter passed to rte_event_eth_tx_adapter_create(). The
* application can get the port identifier using
* rte_event_eth_tx_adapter_event_port_get() and must link an event queue to
* this port.
*
* If the eventdev PMD has the #RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT
* flags set, Tx adapter events should be enqueued using the
* rte_event_eth_tx_adapter_enqueue() function, else the application should
* use rte_event_enqueue_burst().
*
* Transmit queues can be added and deleted from the adapter using
* rte_event_eth_tx_adapter_queue_add()/del() APIs respectively.
*
* The application can start and stop the adapter using the
* rte_event_eth_tx_adapter_start/stop() calls.
*
* The common adapter implementation uses an EAL service function as described
* before and its execution is controlled using the rte_service APIs. The
* rte_event_eth_tx_adapter_service_id_get()
* function can be used to retrieve the adapter's service function ID.
*
* The ethernet port and transmit queue index to transmit the mbuf on are
* specified using the mbuf port struct rte_mbuf::hash::txadapter:txq.
* The application should use the rte_event_eth_tx_adapter_txq_set()
* and rte_event_eth_tx_adapter_txq_get() functions to access the transmit
* queue index, using these macros will help with minimizing application
* impact due to a change in how the transmit queue index is specified.
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
#include <rte_mbuf.h>
#include "rte_eventdev.h"
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Adapter configuration structure
*
* @see rte_event_eth_tx_adapter_create_ext
* @see rte_event_eth_tx_adapter_conf_cb
*/
struct rte_event_eth_tx_adapter_conf {
uint8_t event_port_id;
/**< Event port identifier, the adapter service function dequeues mbuf
* events from this port.
* @see RTE_EVENT_ETH_RX_ADAPTER_CAP_INTERNAL_PORT
*/
uint32_t max_nb_tx;
/**< The adapter can return early if it has processed at least
* max_nb_tx mbufs. This isn't treated as a requirement; batching may
* cause the adapter to process more than max_nb_tx mbufs.
*/
};
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Function type used for adapter configuration callback. The callback is
* used to fill in members of the struct rte_event_eth_tx_adapter_conf, this
* callback is invoked when creating a RTE service function based
* adapter implementation.
*
* @param id
* Adapter identifier.
* @param dev_id
* Event device identifier.
* @param [out] conf
* Structure that needs to be populated by this callback.
* @param arg
* Argument to the callback. This is the same as the conf_arg passed to the
* rte_event_eth_tx_adapter_create_ext().
*
* @return
* - 0: Success
* - <0: Error code on failure
*/
typedef int (*rte_event_eth_tx_adapter_conf_cb) (uint8_t id, uint8_t dev_id,
struct rte_event_eth_tx_adapter_conf *conf,
void *arg);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* A structure used to retrieve statistics for an ethernet Tx adapter instance.
*/
struct rte_event_eth_tx_adapter_stats {
uint64_t tx_retry;
/**< Number of transmit retries */
uint64_t tx_packets;
/**< Number of packets transmitted */
uint64_t tx_dropped;
/**< Number of packets dropped */
};
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Create a new ethernet Tx adapter with the specified identifier.
*
* @param id
* The identifier of the ethernet Tx adapter.
* @param dev_id
* The event device identifier.
* @param port_config
* Event port configuration, the adapter uses this configuration to
* create an event port if needed.
* @return
* - 0: Success
* - <0: Error code on failure
*/
int __rte_experimental
rte_event_eth_tx_adapter_create(uint8_t id, uint8_t dev_id,
struct rte_event_port_conf *port_config);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Create a new ethernet Tx adapter with the specified identifier.
*
* @param id
* The identifier of the ethernet Tx adapter.
* @param dev_id
* The event device identifier.
* @param conf_cb
* Callback function that initializes members of the
* struct rte_event_eth_tx_adapter_conf struct passed into
* it.
* @param conf_arg
* Argument that is passed to the conf_cb function.
* @return
* - 0: Success
* - <0: Error code on failure
*/
int __rte_experimental
rte_event_eth_tx_adapter_create_ext(uint8_t id, uint8_t dev_id,
rte_event_eth_tx_adapter_conf_cb conf_cb,
void *conf_arg);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Free an ethernet Tx adapter
*
* @param id
* Adapter identifier.
* @return
* - 0: Success
* - <0: Error code on failure, If the adapter still has Tx queues
* added to it, the function returns -EBUSY.
*/
int __rte_experimental
rte_event_eth_tx_adapter_free(uint8_t id);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Start ethernet Tx adapter
*
* @param id
* Adapter identifier.
* @return
* - 0: Success, Adapter started correctly.
* - <0: Error code on failure.
*/
int __rte_experimental
rte_event_eth_tx_adapter_start(uint8_t id);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Stop ethernet Tx adapter
*
* @param id
* Adapter identifier.
* @return
* - 0: Success.
* - <0: Error code on failure.
*/
int __rte_experimental
rte_event_eth_tx_adapter_stop(uint8_t id);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Add a Tx queue to the adapter.
* A queue value of -1 is used to indicate all
* queues within the device.
*
* @param id
* Adapter identifier.
* @param eth_dev_id
* Ethernet Port Identifier.
* @param queue
* Tx queue index.
* @return
* - 0: Success, Queues added successfully.
* - <0: Error code on failure.
*/
int __rte_experimental
rte_event_eth_tx_adapter_queue_add(uint8_t id,
uint16_t eth_dev_id,
int32_t queue);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Delete a Tx queue from the adapter.
* A queue value of -1 is used to indicate all
* queues within the device, that have been added to this
* adapter.
*
* @param id
* Adapter identifier.
* @param eth_dev_id
* Ethernet Port Identifier.
* @param queue
* Tx queue index.
* @return
* - 0: Success, Queues deleted successfully.
* - <0: Error code on failure.
*/
int __rte_experimental
rte_event_eth_tx_adapter_queue_del(uint8_t id,
uint16_t eth_dev_id,
int32_t queue);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Set Tx queue in the mbuf. This queue is used by the adapter
* to transmit the mbuf.
*
* @param pkt
* Pointer to the mbuf.
* @param queue
* Tx queue index.
*/
static __rte_always_inline void __rte_experimental
rte_event_eth_tx_adapter_txq_set(struct rte_mbuf *pkt, uint16_t queue)
{
pkt->hash.txadapter.txq = queue;
}
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Retrieve Tx queue from the mbuf.
*
* @param pkt
* Pointer to the mbuf.
* @return
* Tx queue identifier.
*
* @see rte_event_eth_tx_adapter_txq_set()
*/
static __rte_always_inline uint16_t __rte_experimental
rte_event_eth_tx_adapter_txq_get(struct rte_mbuf *pkt)
{
return pkt->hash.txadapter.txq;
}
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Retrieve the adapter event port. The adapter creates an event port if
* the #RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT is not set in the
* ethernet Tx capabilities of the event device.
*
* @param id
* Adapter Identifier.
* @param[out] event_port_id
* Event port pointer.
* @return
* - 0: Success.
* - <0: Error code on failure.
*/
int __rte_experimental
rte_event_eth_tx_adapter_event_port_get(uint8_t id, uint8_t *event_port_id);
/**
* Enqueue a burst of events objects or an event object supplied in *rte_event*
* structure on an event device designated by its *dev_id* through the event
* port specified by *port_id*. This function is supported if the eventdev PMD
* has the #RTE_EVENT_ETH_TX_ADAPTER_CAP_INTERNAL_PORT capability flag set.
*
* The *nb_events* parameter is the number of event objects to enqueue which are
* supplied in the *ev* array of *rte_event* structure.
*
* The rte_event_eth_tx_adapter_enqueue() function returns the number of
* events objects it actually enqueued. A return value equal to *nb_events*
* means that all event objects have been enqueued.
*
* @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.
*/
static inline uint16_t __rte_experimental
rte_event_eth_tx_adapter_enqueue(uint8_t dev_id,
uint8_t port_id,
struct rte_event ev[],
uint16_t nb_events)
{
const struct rte_eventdev *dev = &rte_eventdevs[dev_id];
#ifdef RTE_LIBRTE_EVENTDEV_DEBUG
if (dev_id >= RTE_EVENT_MAX_DEVS ||
!rte_eventdevs[dev_id].attached) {
rte_errno = -EINVAL;
return 0;
}
if (port_id >= dev->data->nb_ports) {
rte_errno = -EINVAL;
return 0;
}
#endif
return dev->txa_enqueue(dev->data->ports[port_id], ev, nb_events);
}
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Retrieve statistics for an adapter
*
* @param id
* Adapter identifier.
* @param [out] stats
* A pointer to structure used to retrieve statistics for an adapter.
* @return
* - 0: Success, statistics retrieved successfully.
* - <0: Error code on failure.
*/
int __rte_experimental
rte_event_eth_tx_adapter_stats_get(uint8_t id,
struct rte_event_eth_tx_adapter_stats *stats);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Reset statistics for an adapter.
*
* @param id
* Adapter identifier.
* @return
* - 0: Success, statistics reset successfully.
* - <0: Error code on failure.
*/
int __rte_experimental
rte_event_eth_tx_adapter_stats_reset(uint8_t id);
/**
* @warning
* @b EXPERIMENTAL: this API may change without prior notice
*
* Retrieve the service ID of an adapter. If the adapter doesn't use
* a rte_service function, this function returns -ESRCH.
*
* @param id
* Adapter identifier.
* @param [out] service_id
* A pointer to a uint32_t, to be filled in with the service id.
* @return
* - 0: Success
* - <0: Error code on failure, if the adapter doesn't use a rte_service
* function, this function returns -ESRCH.
*/
int __rte_experimental
rte_event_eth_tx_adapter_service_id_get(uint8_t id, uint32_t *service_id);
#ifdef __cplusplus
}
#endif
#endif /* _RTE_EVENT_ETH_TX_ADAPTER_ */