From: Jun Yang <[email protected]> Event device creation aborted entirely whenever a DPCI object could not be allocated for an event queue, or when any of the parallel, atomic or ordered link attaches failed. A single failure rolled back every queue and made dpaa2_eventdev_create() return an error.
This is too strict. The DPNI and DPSEC event adapters can still be registered and used even when the DPCI-backed event queues are not available, so a DPCI shortage or attach failure must not bring the whole event device down. Signed-off-by: Jun Yang <[email protected]> --- drivers/event/dpaa2/dpaa2_eventdev.c | 68 +++++++++++++--------------- 1 file changed, 31 insertions(+), 37 deletions(-) diff --git a/drivers/event/dpaa2/dpaa2_eventdev.c b/drivers/event/dpaa2/dpaa2_eventdev.c index 011883bba8..5c36cb9dc9 100644 --- a/drivers/event/dpaa2/dpaa2_eventdev.c +++ b/drivers/event/dpaa2/dpaa2_eventdev.c @@ -1278,14 +1278,13 @@ dpaa2_eventdev_create(const char *name, struct rte_vdev_device *vdev) struct dpaa2_dpcon_dev *dpcon_dev = NULL; struct dpaa2_dpci_dev *dpci_dev = NULL; struct dpaa2_eventq *evq_info; - int ret = 0, i; + int ret, i, success; eventdev = rte_event_pmd_vdev_init(name, sizeof(struct dpaa2_eventdev), rte_socket_id(), vdev); if (!eventdev) { - ret = -ENOMEM; DPAA2_EVENTDEV_ERR("Failed to create Event device %s", name); - goto done; + return -ENOMEM; } eventdev->dev_ops = &dpaa2_eventdev_ops; @@ -1312,66 +1311,61 @@ dpaa2_eventdev_create(const char *name, struct rte_vdev_device *vdev) dpci_dev = rte_dpaa2_alloc_dpci_dev(); if (!dpci_dev) { - rte_dpaa2_free_dpcon_dev(dpcon_dev); - break; + DPAA2_EVENTDEV_WARN("No dpci available for evq.%d", i); + goto skip_dpci_attach; } - evq_info->dpci = dpci_dev; + success = 0; ret = rte_dpaa2_dpci_link_attach(dpci_dev, DPCI_DEST_DPCON, dpcon_dev->dpcon_id, 0, dpaa2_eventdev_process_parallel, DPAA2_QUEUE_NONE_ORDER, &evq_info->dpci_txqs[RTE_SCHED_TYPE_PARALLEL]); - if (ret) { - DPAA2_EVENTDEV_ERR("DPCI attach parallel qp failed: err(%d)", ret); - goto err_break; - } + if (ret) + DPAA2_EVENTDEV_WARN("DPCI attach parallel qp failed: err(%d)", ret); + else + success++; ret = rte_dpaa2_dpci_link_attach(dpci_dev, DPCI_DEST_DPCON, dpcon_dev->dpcon_id, 0, dpaa2_eventdev_process_atomic, DPAA2_QUEUE_HOLD_ACTIVE_ORDER, &evq_info->dpci_txqs[RTE_SCHED_TYPE_ATOMIC]); - if (ret) { - DPAA2_EVENTDEV_ERR("DPCI attach atomic qp failed: err(%d)", ret); - goto err_break; - } + if (ret) + DPAA2_EVENTDEV_WARN("DPCI attach atomic qp failed: err(%d)", ret); + else + success++; ret = rte_dpaa2_dpci_link_attach(dpci_dev, DPCI_DEST_DPCON, dpcon_dev->dpcon_id, 0, dpaa2_eventdev_process_order, DPAA2_QUEUE_LOOSE_ORP_ORDER, &evq_info->dpci_txqs[RTE_SCHED_TYPE_ORDERED]); - if (ret) { - DPAA2_EVENTDEV_ERR("DPCI attach order qp failed: err(%d)", ret); - goto err_break; - } + if (ret) + DPAA2_EVENTDEV_WARN("DPCI attach order qp failed: err(%d)", ret); + else + success++; + + if (success) + evq_info->dpci = dpci_dev; + else + rte_dpaa2_free_dpci_dev(dpci_dev); +skip_dpci_attach: evq_info->valid = true; evq_info->event_queue_id = priv->max_event_queues; priv->max_event_queues++; - continue; -err_break: - if (evq_info->dpcon) - rte_dpaa2_free_dpcon_dev(evq_info->dpcon); - if (evq_info->dpci) - rte_dpaa2_free_dpci_dev(evq_info->dpci); - break; } done: - if (ret && priv) { - for (i = 0; i < priv->max_event_queues; i++) { - evq_info = &priv->evq_info[i]; - if (evq_info->dpcon) - rte_dpaa2_free_dpcon_dev(evq_info->dpcon); - if (evq_info->dpci) - rte_dpaa2_free_dpci_dev(evq_info->dpci); - } - } + ret = 0; event_dev_probing_finish(eventdev); - if (ret) - DPAA2_EVENTDEV_ERR("Failed(%d) to create event device(%s)", ret, name); - else + if (priv && !priv->max_event_queues) { + ret = -ENODEV; + DPAA2_EVENTDEV_ERR("Failed to create event device(%s)", name); + } else if (rte_eal_process_type() == RTE_PROC_PRIMARY) { DPAA2_EVENTDEV_INFO("Create event device(%s)", name); + } else { + DPAA2_EVENTDEV_INFO("Attach event device(%s)", name); + } return ret; } -- 2.43.0

