While providing port_cos as vdev/pf CLI argument, the port numbers should
take into account all ports (LDB and DIR) that are created by the
application and the same order should be provided for port_cos parameter.
This fix add checks to ensure that above is validated correctly.

Signed-off-by: Pravin Pathak <pravin.pat...@intel.com>
---
 drivers/event/dlb2/dlb2.c      | 32 +++++++++++++++++++++++---------
 drivers/event/dlb2/dlb2_priv.h |  1 -
 2 files changed, 23 insertions(+), 10 deletions(-)

diff --git a/drivers/event/dlb2/dlb2.c b/drivers/event/dlb2/dlb2.c
index a0e673b96b..58eb27f495 100644
--- a/drivers/event/dlb2/dlb2.c
+++ b/drivers/event/dlb2/dlb2.c
@@ -194,10 +194,8 @@ dlb2_init_port_cos(struct dlb2_eventdev *dlb2, int 
*port_cos)
        for (q = 0; q < DLB2_MAX_NUM_PORTS_ALL; q++) {
                dlb2->ev_ports[q].cos_id = port_cos[q];
                if (port_cos[q] != DLB2_COS_DEFAULT &&
-                   dlb2->cos_ports[port_cos[q]] < 
DLB2_MAX_NUM_LDB_PORTS_PER_COS) {
+                   dlb2->cos_ports[port_cos[q]] < 
DLB2_MAX_NUM_LDB_PORTS_PER_COS)
                        dlb2->cos_ports[port_cos[q]]++;
-                       dlb2->max_cos_port = q;
-               }
        }
 }
 
@@ -531,8 +529,8 @@ set_port_cos(const char *key __rte_unused,
             const char *value,
             void *opaque)
 {
+       int first, last, cos_id, i, ports_per_cos[DLB2_COS_NUM_VALS] = {0};
        struct dlb2_port_cos *port_cos = opaque;
-       int first, last, cos_id, i;
 
        if (value == NULL || opaque == NULL) {
                DLB2_LOG_ERR("NULL pointer");
@@ -566,6 +564,14 @@ set_port_cos(const char *key __rte_unused,
        for (i = first; i <= last; i++)
                port_cos->cos_id[i] = cos_id; /* indexed by port */
 
+       for (i = 0; i < DLB2_MAX_NUM_PORTS_ALL; i++)
+               if (port_cos->cos_id[i] != DLB2_COS_DEFAULT &&
+                       ++ports_per_cos[port_cos->cos_id[i]] > 
DLB2_MAX_NUM_LDB_PORTS_PER_COS) {
+                       DLB2_LOG_ERR("Error parsing ldb port cos_id devarg: 
More than 16 ports for "
+                               "cos_id %d.", port_cos->cos_id[i]);
+                       return -EINVAL;
+               }
+
        return 0;
 }
 
@@ -866,9 +872,10 @@ dlb2_hw_create_sched_domain(struct dlb2_eventdev *dlb2,
                            const struct dlb2_hw_rsrcs *resources_asked,
                            uint8_t device_version)
 {
-       int ret = 0;
-       uint32_t cos_ports = 0;
+       uint32_t total_asked_ports;
        struct dlb2_create_sched_domain_args *cfg;
+       uint32_t cos_ports = 0, max_cos_port = 0;
+       int ret = 0;
 
        if (resources_asked == NULL) {
                DLB2_LOG_ERR("dlb2: dlb2_create NULL parameter");
@@ -876,6 +883,8 @@ dlb2_hw_create_sched_domain(struct dlb2_eventdev *dlb2,
                goto error_exit;
        }
 
+       total_asked_ports = resources_asked->num_ldb_ports + 
resources_asked->num_dir_ports;
+
        /* Map generic qm resources to dlb2 resources */
        cfg = &handle->cfg.resources;
 
@@ -897,9 +906,14 @@ dlb2_hw_create_sched_domain(struct dlb2_eventdev *dlb2,
        cos_ports = dlb2->cos_ports[0] + dlb2->cos_ports[1] +
                    dlb2->cos_ports[2] + dlb2->cos_ports[3];
 
-       if (cos_ports > resources_asked->num_ldb_ports ||
-           (cos_ports && dlb2->max_cos_port >= 
resources_asked->num_ldb_ports)) {
-               DLB2_LOG_ERR("dlb2: num_ldb_ports < cos_ports");
+       for (int i = 0; i < DLB2_MAX_NUM_PORTS_ALL; i++) {
+               if (dlb2->ev_ports[i].cos_id != DLB2_COS_DEFAULT)
+                       max_cos_port = i;
+       }
+
+       if (cos_ports > resources_asked->num_ldb_ports || max_cos_port >= 
total_asked_ports) {
+               DLB2_LOG_ERR("dlb2: Insufficient num_ldb_ports=%d: cos_ports=%d 
max_cos_port=%d",
+                       resources_asked->num_ldb_ports, cos_ports, 
max_cos_port);
                ret = EINVAL;
                goto error_exit;
        }
diff --git a/drivers/event/dlb2/dlb2_priv.h b/drivers/event/dlb2/dlb2_priv.h
index 4dd7532519..285d427397 100644
--- a/drivers/event/dlb2/dlb2_priv.h
+++ b/drivers/event/dlb2/dlb2_priv.h
@@ -649,7 +649,6 @@ struct dlb2_eventdev {
        };
        uint32_t cos_ports[DLB2_COS_NUM_VALS]; /* total ldb ports in each class 
*/
        uint32_t cos_bw[DLB2_COS_NUM_VALS]; /* bandwidth per cos domain */
-       uint8_t max_cos_port; /* Max LDB port from any cos */
        bool enable_cq_weight;
 };
 
-- 
2.25.1

Reply via email to