Hi,
> -----Original Message-----
> From: Sachin Saxena (OSS) <sachin.sax...@oss.nxp.com>
> Sent: Friday, September 11, 2020 2:05 PM
> To: dev@dpdk.org; ferruh.yi...@intel.com
> Cc: Sachin Saxena (OSS) <sachin.sax...@oss.nxp.com>
> Subject: [PATCH v2 2/8] bus/fslmc: run secondary debug app without
> blocklist devices
> 
> From: Rohit Raj <rohit....@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....@nxp.com>
> Reviewed-by: Sachin Saxena <sachin.sax...@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

Reply via email to