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

Reply via email to