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

