From: Jun Yang <[email protected]>

Add qman_find_fq_by_cgid() to find frame queues associated with
a given CGID. This allows the driver to verify that all FQs
using a CGR are shut down before releasing the CGR ID, preventing
use-after-free of CGR resources.

Signed-off-by: Jun Yang <[email protected]>
Signed-off-by: Hemant Agrawal <[email protected]>
---
 drivers/bus/dpaa/base/qbman/qman.c       | 36 ++++++++++++++++++++++++
 drivers/bus/dpaa/dpaa_bus_base_symbols.c |  1 +
 drivers/bus/dpaa/include/fsl_qman.h      |  3 ++
 3 files changed, 40 insertions(+)

diff --git a/drivers/bus/dpaa/base/qbman/qman.c 
b/drivers/bus/dpaa/base/qbman/qman.c
index 56dc1cba45..bb936f8f9b 100644
--- a/drivers/bus/dpaa/base/qbman/qman.c
+++ b/drivers/bus/dpaa/base/qbman/qman.c
@@ -2972,3 +2972,39 @@ qman_shutdown_fq(struct qman_fq *fq)
 out:
        return ret;
 }
+
+int qman_find_fq_by_cgrid(u32 cgrid, u32 *fqid)
+{
+       struct qman_fq fq = {
+               .fqid = 1
+       };
+       struct qm_mcr_queryfq_np np;
+       struct qm_fqd fqd;
+       int err;
+
+       do {
+               err = qman_query_fq_np(&fq, &np);
+               if (err == -ERANGE) {
+                       DPAA_BUS_INFO("No FQ found with cgrid(0x%x)", cgrid);
+                       return err;
+               } else if (err) {
+                       DPAA_BUS_WARN("Failed(%d) to Query np FQ(fqid=0x%x)",
+                               err, fq.fqid);
+                       return err;
+               }
+               if ((np.state & QM_MCR_NP_STATE_MASK) != QM_MCR_NP_STATE_OOS) {
+                       err = qman_query_fq(&fq, &fqd);
+                       if (err) {
+                               DPAA_BUS_WARN("Failed(%d) to Query 
FQ(fqid=0x%x)",
+                                       err, fq.fqid);
+                       } else if ((fqd.fq_ctrl & QM_FQCTRL_CGE) &&
+                               fqd.cgid == cgrid) {
+                               if (fqid)
+                                       *fqid = fq.fqid;
+                               return 0;
+                       }
+               }
+               /* Move to the next FQID */
+               fq.fqid++;
+       } while (1);
+}
diff --git a/drivers/bus/dpaa/dpaa_bus_base_symbols.c 
b/drivers/bus/dpaa/dpaa_bus_base_symbols.c
index 4b63354e0e..1a4778e65b 100644
--- a/drivers/bus/dpaa/dpaa_bus_base_symbols.c
+++ b/drivers/bus/dpaa/dpaa_bus_base_symbols.c
@@ -57,6 +57,7 @@ RTE_EXPORT_INTERNAL_SYMBOL(qman_alloc_pool_range)
 RTE_EXPORT_INTERNAL_SYMBOL(qman_alloc_cgrid_range)
 RTE_EXPORT_INTERNAL_SYMBOL(qman_release_cgrid_range)
 RTE_EXPORT_INTERNAL_SYMBOL(dpaa_get_qm_channel_pool_num)
+RTE_EXPORT_INTERNAL_SYMBOL(qman_find_fq_by_cgrid)
 RTE_EXPORT_INTERNAL_SYMBOL(dpaa_intr_enable)
 RTE_EXPORT_INTERNAL_SYMBOL(dpaa_intr_disable)
 RTE_EXPORT_INTERNAL_SYMBOL(dpaa_get_ioctl_version_number)
diff --git a/drivers/bus/dpaa/include/fsl_qman.h 
b/drivers/bus/dpaa/include/fsl_qman.h
index 57b456cdfd..16fb4da98d 100644
--- a/drivers/bus/dpaa/include/fsl_qman.h
+++ b/drivers/bus/dpaa/include/fsl_qman.h
@@ -1908,6 +1908,9 @@ static inline int qman_shutdown_fq_by_fqid(u32 fqid)
        return qman_shutdown_fq(&fq);
 }
 
+__rte_internal
+int qman_find_fq_by_cgrid(u32 cgrid, u32 *fqid);
+
 /**
  * qman_reserve_fqid_range - Reserve the specified range of frame queue IDs
  * @fqid: the base FQID of the range to deallocate
-- 
2.25.1

Reply via email to