Message ID | 20200911083520.24020-3-sachin.saxena@oss.nxp.com |
---|---|
State | Superseded, archived |
Headers | show |
Series |
|
Related | show |
Context | Check | Description |
---|---|---|
ci/checkpatch | success | coding style OK |
Hi, > -----Original Message----- > From: Sachin Saxena (OSS) <sachin.saxena@oss.nxp.com> > Sent: Friday, September 11, 2020 2:05 PM > To: dev@dpdk.org; ferruh.yigit@intel.com > Cc: Sachin Saxena (OSS) <sachin.saxena@oss.nxp.com> > Subject: [PATCH v2 2/8] bus/fslmc: run secondary debug app without > blocklist devices > > From: Rohit Raj <rohit.raj@nxp.com> > > dpaa2 hw impose limits on some HW access devices like DPMCP(Mnagement > control Port) and DPIO (HW portal). This causes issue in their usages in shared > uses in case of multi-process applications. It can overcome by using > allowlist/blocklist in primary and secondary applications. > However it imposes restrictions on standard debugging apps like dpdk- > procinfo, which can be used to debug any existing application. > > This patch introduces reserving extra DPMCP and DPIO to be used by > secondary process if devices are not blocked previously in primary application. > This leaves the last DPMCP and DPIO for the secondary process usages. [Hemant] It may be good to also document this behavior in the dpaa2 nic guide. > > Signed-off-by: Rohit Raj <rohit.raj@nxp.com> > Reviewed-by: Sachin Saxena <sachin.saxena@oss.nxp.com> > --- > drivers/bus/fslmc/fslmc_vfio.c | 66 > +++++++++++++++++++++++++++++++--- > 1 file changed, 61 insertions(+), 5 deletions(-) > > diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c > index 9134ec552..6dd797632 100644 > --- a/drivers/bus/fslmc/fslmc_vfio.c > +++ b/drivers/bus/fslmc/fslmc_vfio.c > @@ -802,10 +802,29 @@ fslmc_vfio_process_group(void) > int ret; > int found_mportal = 0; > struct rte_dpaa2_device *dev, *dev_temp; > + bool is_dpmcp_in_blocklist = false, is_dpio_in_blocklist = false; > + int dpmcp_count = 0, dpio_count = 0, current_device; > + > + TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, > dev_temp) { > + if (dev->dev_type == DPAA2_MPORTAL) { > + dpmcp_count++; > + if (dev->device.devargs && > + dev->device.devargs->policy == > RTE_DEV_BLACKLISTED) > + is_dpmcp_in_blocklist = true; > + } > + if (dev->dev_type == DPAA2_IO) { > + dpio_count++; > + if (dev->device.devargs && > + dev->device.devargs->policy == > RTE_DEV_BLACKLISTED) > + is_dpmcp_in_blocklist = true; [Hemant] This shall be is_dpio_in_blocklist > + } > + } > > /* Search the MCP as that should be initialized first. */ > + current_device = 0; > TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, > dev_temp) { > if (dev->dev_type == DPAA2_MPORTAL) { > + current_device++; > if (dev->device.devargs && > dev->device.devargs->policy == > RTE_DEV_BLACKLISTED) { > DPAA2_BUS_LOG(DEBUG, "%s Blacklisted, > skipping", @@ -815,13 +834,24 @@ fslmc_vfio_process_group(void) > continue; > } > > - ret = fslmc_process_mcp(dev); > - if (ret) { > - DPAA2_BUS_ERR("Unable to map MC > Portal"); > - return -1; > + if (rte_eal_process_type() == > RTE_PROC_SECONDARY && > + !is_dpmcp_in_blocklist) { > + if (dpmcp_count == 1 || > + current_device != dpmcp_count) { > + > TAILQ_REMOVE(&rte_fslmc_bus.device_list, > + dev, next); > + continue; > + } > } > - if (!found_mportal) > + > + if (!found_mportal) { > + ret = fslmc_process_mcp(dev); > + if (ret) { > + DPAA2_BUS_ERR("Unable to map > MC Portal"); > + return -1; > + } > found_mportal = 1; > + } > > TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, > next); > free(dev); > @@ -838,7 +868,10 @@ fslmc_vfio_process_group(void) > return -1; > } > > + current_device = 0; > TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, > dev_temp) { > + if (dev->dev_type == DPAA2_IO) > + current_device++; > if (dev->device.devargs && > dev->device.devargs->policy == RTE_DEV_BLACKLISTED) { > DPAA2_BUS_LOG(DEBUG, "%s Blacklisted, skipping", > @@ -846,6 +879,14 @@ fslmc_vfio_process_group(void) > TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, > next); > continue; > } > + if (rte_eal_process_type() == RTE_PROC_SECONDARY && > + dev->dev_type != DPAA2_ETH && > + dev->dev_type != DPAA2_CRYPTO && > + dev->dev_type != DPAA2_QDMA && > + dev->dev_type != DPAA2_IO) { > + TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, > next); > + continue; > + } > switch (dev->dev_type) { > case DPAA2_ETH: > case DPAA2_CRYPTO: > @@ -882,6 +923,21 @@ fslmc_vfio_process_group(void) > > break; > case DPAA2_IO: > + if (!is_dpio_in_blocklist && dpio_count > 1) { > + if (rte_eal_process_type() == > RTE_PROC_SECONDARY > + && current_device != dpio_count) { > + > TAILQ_REMOVE(&rte_fslmc_bus.device_list, > + dev, next); > + break; > + } > + if (rte_eal_process_type() == > RTE_PROC_PRIMARY > + && current_device == dpio_count) { > + > TAILQ_REMOVE(&rte_fslmc_bus.device_list, > + dev, next); > + break; > + } > + } > + > ret = fslmc_process_iodevices(dev); > if (ret) { > DPAA2_BUS_DEBUG("Dev (%s) init failed", > -- > 2.28.0
diff --git a/drivers/bus/fslmc/fslmc_vfio.c b/drivers/bus/fslmc/fslmc_vfio.c index 9134ec552..6dd797632 100644 --- a/drivers/bus/fslmc/fslmc_vfio.c +++ b/drivers/bus/fslmc/fslmc_vfio.c @@ -802,10 +802,29 @@ fslmc_vfio_process_group(void) int ret; int found_mportal = 0; struct rte_dpaa2_device *dev, *dev_temp; + bool is_dpmcp_in_blocklist = false, is_dpio_in_blocklist = false; + int dpmcp_count = 0, dpio_count = 0, current_device; + + TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_temp) { + if (dev->dev_type == DPAA2_MPORTAL) { + dpmcp_count++; + if (dev->device.devargs && + dev->device.devargs->policy == RTE_DEV_BLACKLISTED) + is_dpmcp_in_blocklist = true; + } + if (dev->dev_type == DPAA2_IO) { + dpio_count++; + if (dev->device.devargs && + dev->device.devargs->policy == RTE_DEV_BLACKLISTED) + is_dpmcp_in_blocklist = true; + } + } /* Search the MCP as that should be initialized first. */ + current_device = 0; TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_temp) { if (dev->dev_type == DPAA2_MPORTAL) { + current_device++; if (dev->device.devargs && dev->device.devargs->policy == RTE_DEV_BLACKLISTED) { DPAA2_BUS_LOG(DEBUG, "%s Blacklisted, skipping", @@ -815,13 +834,24 @@ fslmc_vfio_process_group(void) continue; } - ret = fslmc_process_mcp(dev); - if (ret) { - DPAA2_BUS_ERR("Unable to map MC Portal"); - return -1; + if (rte_eal_process_type() == RTE_PROC_SECONDARY && + !is_dpmcp_in_blocklist) { + if (dpmcp_count == 1 || + current_device != dpmcp_count) { + TAILQ_REMOVE(&rte_fslmc_bus.device_list, + dev, next); + continue; + } } - if (!found_mportal) + + if (!found_mportal) { + ret = fslmc_process_mcp(dev); + if (ret) { + DPAA2_BUS_ERR("Unable to map MC Portal"); + return -1; + } found_mportal = 1; + } TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next); free(dev); @@ -838,7 +868,10 @@ fslmc_vfio_process_group(void) return -1; } + current_device = 0; TAILQ_FOREACH_SAFE(dev, &rte_fslmc_bus.device_list, next, dev_temp) { + if (dev->dev_type == DPAA2_IO) + current_device++; if (dev->device.devargs && dev->device.devargs->policy == RTE_DEV_BLACKLISTED) { DPAA2_BUS_LOG(DEBUG, "%s Blacklisted, skipping", @@ -846,6 +879,14 @@ fslmc_vfio_process_group(void) TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next); continue; } + if (rte_eal_process_type() == RTE_PROC_SECONDARY && + dev->dev_type != DPAA2_ETH && + dev->dev_type != DPAA2_CRYPTO && + dev->dev_type != DPAA2_QDMA && + dev->dev_type != DPAA2_IO) { + TAILQ_REMOVE(&rte_fslmc_bus.device_list, dev, next); + continue; + } switch (dev->dev_type) { case DPAA2_ETH: case DPAA2_CRYPTO: @@ -882,6 +923,21 @@ fslmc_vfio_process_group(void) break; case DPAA2_IO: + if (!is_dpio_in_blocklist && dpio_count > 1) { + if (rte_eal_process_type() == RTE_PROC_SECONDARY + && current_device != dpio_count) { + TAILQ_REMOVE(&rte_fslmc_bus.device_list, + dev, next); + break; + } + if (rte_eal_process_type() == RTE_PROC_PRIMARY + && current_device == dpio_count) { + TAILQ_REMOVE(&rte_fslmc_bus.device_list, + dev, next); + break; + } + } + ret = fslmc_process_iodevices(dev); if (ret) { DPAA2_BUS_DEBUG("Dev (%s) init failed",