Thread (109 messages) 109 messages, 9 authors, 2017-02-07

Re: [PATCH v4 3/6] eventdev: implement the northbound APIs

From: Jerin Jacob <hidden>
Date: 2017-02-02 14:32:36

On Thu, Feb 02, 2017 at 11:19:45AM +0000, Nipun Gupta wrote:
quoted
-----Original Message-----
From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Jerin Jacob
Sent: Wednesday, December 21, 2016 14:55
To: dev@dpdk.org
Cc: thomas.monjalon@6wind.com; bruce.richardson@intel.com; Hemant
Agrawal [off-list ref]; gage.eads@intel.com;
harry.van.haaren@intel.com; Jerin Jacob [off-list ref]
Subject: [dpdk-dev] [PATCH v4 3/6] eventdev: implement the northbound APIs

This patch implements northbound eventdev API interface using southbond
driver interface

Signed-off-by: Jerin Jacob <redacted>
Acked-by: Bruce Richardson <redacted>
---
 config/common_base                           |   6 +
 lib/Makefile                                 |   1 +
 lib/librte_eal/common/include/rte_log.h      |   1 +
 lib/librte_eventdev/Makefile                 |  57 ++
 lib/librte_eventdev/rte_eventdev.c           | 986
+++++++++++++++++++++++++++
 lib/librte_eventdev/rte_eventdev.h           | 106 ++-
 lib/librte_eventdev/rte_eventdev_pmd.h       | 109 +++
 lib/librte_eventdev/rte_eventdev_version.map |  33 +
 mk/rte.app.mk                                |   1 +
 9 files changed, 1294 insertions(+), 6 deletions(-)  create mode 100644
lib/librte_eventdev/Makefile  create mode 100644
lib/librte_eventdev/rte_eventdev.c
 create mode 100644 lib/librte_eventdev/rte_eventdev_version.map
<Snip>
quoted
+static inline int
+rte_event_dev_port_config(struct rte_eventdev *dev, uint8_t nb_ports) {
+	uint8_t old_nb_ports = dev->data->nb_ports;
+	void **ports;
+	uint16_t *links_map;
+	uint8_t *ports_dequeue_depth;
+	uint8_t *ports_enqueue_depth;
+	unsigned int i;
+
+	RTE_EDEV_LOG_DEBUG("Setup %d ports on device %u", nb_ports,
+			 dev->data->dev_id);
+
+	/* First time configuration */
+	if (dev->data->ports == NULL && nb_ports != 0) {
+		dev->data->ports = rte_zmalloc_socket("eventdev->data-
quoted
ports",
+				sizeof(dev->data->ports[0]) * nb_ports,
+				RTE_CACHE_LINE_SIZE, dev->data->socket_id);
+		if (dev->data->ports == NULL) {
+			dev->data->nb_ports = 0;
+			RTE_EDEV_LOG_ERR("failed to get mem for port meta
data,"
+					"nb_ports %u", nb_ports);
+			return -(ENOMEM);
+		}
+
+		/* Allocate memory to store ports dequeue depth */
+		dev->data->ports_dequeue_depth =
+			rte_zmalloc_socket("eventdev-
quoted
ports_dequeue_depth",
+			sizeof(dev->data->ports_dequeue_depth[0]) *
nb_ports,
+			RTE_CACHE_LINE_SIZE, dev->data->socket_id);
+		if (dev->data->ports_dequeue_depth == NULL) {
+			dev->data->nb_ports = 0;
+			RTE_EDEV_LOG_ERR("failed to get mem for port deq
meta,"
+					"nb_ports %u", nb_ports);
+			return -(ENOMEM);
+		}
+
+		/* Allocate memory to store ports enqueue depth */
+		dev->data->ports_enqueue_depth =
+			rte_zmalloc_socket("eventdev-
quoted
ports_enqueue_depth",
+			sizeof(dev->data->ports_enqueue_depth[0]) *
nb_ports,
+			RTE_CACHE_LINE_SIZE, dev->data->socket_id);
+		if (dev->data->ports_enqueue_depth == NULL) {
+			dev->data->nb_ports = 0;
+			RTE_EDEV_LOG_ERR("failed to get mem for port enq
meta,"
+					"nb_ports %u", nb_ports);
+			return -(ENOMEM);
+		}
+
+		/* Allocate memory to store queue to port link connection */
+		dev->data->links_map =
+			rte_zmalloc_socket("eventdev->links_map",
+			sizeof(dev->data->links_map[0]) * nb_ports *
+			RTE_EVENT_MAX_QUEUES_PER_DEV,
+			RTE_CACHE_LINE_SIZE, dev->data->socket_id);
+		if (dev->data->links_map == NULL) {
+			dev->data->nb_ports = 0;
+			RTE_EDEV_LOG_ERR("failed to get mem for port_map
area,"
+					"nb_ports %u", nb_ports);
+			return -(ENOMEM);
+		}
I think we also need to set all the 'links map' to EVENT_QUEUE_SERVICE_PRIORITY_INVALID
on zmalloc.
Just after the port_setup, we are setting to EVENT_QUEUE_SERVICE_PRIORITY_INVALID in
rte_event_port_unlink(). So it looks OK to me.

        diag = (*dev->dev_ops->port_setup)(dev, port_id, port_conf);

        /* Unlink all the queues from this port(default state after
	 * setup) */
        if (!diag)
                diag = rte_event_port_unlink(dev_id, port_id, NULL, 0);

quoted
+	} else if (dev->data->ports != NULL && nb_ports != 0) {/* re-config */
+		RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->port_release, -
ENOTSUP);
+
+		ports = dev->data->ports;
+		ports_dequeue_depth = dev->data->ports_dequeue_depth;
+		ports_enqueue_depth = dev->data->ports_enqueue_depth;
+		links_map = dev->data->links_map;
+
<Snip>
quoted
+int
+rte_event_port_setup(uint8_t dev_id, uint8_t port_id,
+		     const struct rte_event_port_conf *port_conf) {
+	struct rte_eventdev *dev;
+	struct rte_event_port_conf def_conf;
+	int diag;
+
+	RTE_EVENTDEV_VALID_DEVID_OR_ERR_RET(dev_id, -EINVAL);
+	dev = &rte_eventdevs[dev_id];
+
+	if (!is_valid_port(dev, port_id)) {
+		RTE_EDEV_LOG_ERR("Invalid port_id=%" PRIu8, port_id);
+		return -EINVAL;
+	}
+
+	/* Check new_event_threshold limit */
+	if ((port_conf && !port_conf->new_event_threshold) ||
+			(port_conf && port_conf->new_event_threshold >
+				 dev->data->dev_conf.nb_events_limit)) {
As mentioned in 'rte_eventdev.h', the 'new_event_threshold' is valid for *closed systems*,
so is the above check valid for *open systems*?
new_event_threshold is valid  only for *closed systems*. If you need any
change then please suggest.
Or is it implicit that for open systems the 'port_conf->new_event_threshold' should be
set to '-1' by the application just as it is for 'max_num_events' of 'struct rte_event_dev_info'.

quoted
+		RTE_EDEV_LOG_ERR(
+		   "dev%d port%d Invalid event_threshold=%d
nb_events_limit=%d",
+			dev_id, port_id, port_conf->new_event_threshold,
+			dev->data->dev_conf.nb_events_limit);
+		return -EINVAL;
+	}
+
<Snip>

Regards,
Nipun
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help