Hello Maxime,

On 08/06/20 17:53 +0200, Maxime Coquelin wrote:
> This patch makes rte_dev_probe() to return the
> rte_device pointer on success and NULL on error
> instead of returning 0 on success and negative
> value on error.
> 
> The goal is to avoid that the calling application
> iterates the devices list afterwards to retrieve
> the pointer. Retrieving the pointer is required
> for calling rte_dev_remove() later.
> 

I agree with the idea. I recall starting to do it on the legacy functions
(rte_eal_hotplug_*), but it was scrapped for API compat.

> Signed-off-by: Maxime Coquelin <maxime.coque...@redhat.com>
> ---
>  app/test-pmd/testpmd.c                 |  2 +-
>  drivers/net/failsafe/failsafe.c        |  5 +++--
>  lib/librte_eal/common/eal_common_dev.c | 18 ++++++++++--------
>  lib/librte_eal/include/rte_dev.h       |  4 ++--
>  4 files changed, 16 insertions(+), 13 deletions(-)
> 
> diff --git a/app/test-pmd/testpmd.c b/app/test-pmd/testpmd.c
> index 4989d22ca8..f777f449a8 100644
> --- a/app/test-pmd/testpmd.c
> +++ b/app/test-pmd/testpmd.c
> @@ -2764,7 +2764,7 @@ attach_port(char *identifier)
>               return;
>       }
>  
> -     if (rte_dev_probe(identifier) < 0) {
> +     if (rte_dev_probe(identifier) == NULL) {
>               TESTPMD_LOG(ERR, "Failed to attach port %s\n", identifier);
>               return;
>       }
> diff --git a/drivers/net/failsafe/failsafe.c b/drivers/net/failsafe/failsafe.c
> index 72362f35de..e32effdef2 100644
> --- a/drivers/net/failsafe/failsafe.c
> +++ b/drivers/net/failsafe/failsafe.c
> @@ -341,6 +341,7 @@ rte_pmd_failsafe_probe(struct rte_vdev_device *vdev)
>       struct rte_eth_dev *eth_dev;
>       struct sub_device  *sdev;
>       struct rte_devargs devargs;
> +     struct rte_device *dev;
>       uint8_t i;
>       int ret;
>  
> @@ -378,8 +379,8 @@ rte_pmd_failsafe_probe(struct rte_vdev_device *vdev)
>                               continue;
>                       }
>                       if (!devargs_already_listed(&devargs)) {
> -                             ret = rte_dev_probe(devargs.name);
> -                             if (ret < 0) {
> +                             dev = rte_dev_probe(devargs.name);
> +                             if (dev == NULL) {
>                                       ERROR("Failed to probe devargs %s",
>                                             devargs.name);
>                                       continue;
> diff --git a/lib/librte_eal/common/eal_common_dev.c 
> b/lib/librte_eal/common/eal_common_dev.c
> index 9e4f09d83e..72baae2e48 100644
> --- a/lib/librte_eal/common/eal_common_dev.c
> +++ b/lib/librte_eal/common/eal_common_dev.c
> @@ -120,7 +120,9 @@ rte_eal_hotplug_add(const char *busname, const char 
> *devname,
>       if (ret != 0)
>               return ret;
>  
> -     ret = rte_dev_probe(devargs);
> +     if (rte_dev_probe(devargs) == NULL)
> +             ret = -1;
> +
>       free(devargs);
>  
>       return ret;
> @@ -192,7 +194,7 @@ local_dev_probe(const char *devargs, struct rte_device 
> **new_dev)
>       return ret;
>  }
>  
> -int
> +struct rte_device *
>  rte_dev_probe(const char *devargs)
>  {
>       struct eal_dev_mp_req req;
> @@ -212,12 +214,12 @@ rte_dev_probe(const char *devargs)
>               if (ret != 0) {
>                       RTE_LOG(ERR, EAL,
>                               "Failed to send hotplug request to primary\n");
> -                     return -ENOMSG;
> +                     return NULL;

Is is a problem to keep the ENOMSG through rte_errno?

>               }
>               if (req.result != 0)
>                       RTE_LOG(ERR, EAL,
>                               "Failed to hotplug add device\n");
> -             return req.result;
> +             return NULL;
>       }
>  
>       /* attach a shared device from primary start from here: */
> @@ -236,7 +238,7 @@ rte_dev_probe(const char *devargs)
>                * process.
>                */
>               if (ret != -EEXIST)
> -                     return ret;
> +                     return dev;
>       }
>  
>       /* primary send attach sync request to secondary. */
> @@ -261,11 +263,11 @@ rte_dev_probe(const char *devargs)
>  
>               /* for -EEXIST, we don't need to rollback. */
>               if (ret == -EEXIST)
> -                     return ret;
> +                     return dev;
>               goto rollback;
>       }
>  
> -     return 0;
> +     return dev;
>  
>  rollback:
>       req.t = EAL_DEV_REQ_TYPE_ATTACH_ROLLBACK;
> @@ -282,7 +284,7 @@ rte_dev_probe(const char *devargs)
>                       "Failed to rollback device attach on primary."
>                       "Devices in secondary may not sync with primary\n");
>  
> -     return ret;
> +     return NULL;
>  }
>  
>  int
> diff --git a/lib/librte_eal/include/rte_dev.h 
> b/lib/librte_eal/include/rte_dev.h
> index c8d985fb5c..9cf7c7fd71 100644
> --- a/lib/librte_eal/include/rte_dev.h
> +++ b/lib/librte_eal/include/rte_dev.h
> @@ -148,9 +148,9 @@ int rte_eal_hotplug_add(const char *busname, const char 
> *devname,
>   * @param devargs
>   *   Device arguments including bus, class and driver properties.
>   * @return
> - *   0 on success, negative on error.
> + *   Generic device pointer on success, NULL on error.

If rte_errno is set, mapping codes to meanings would be helpful here.

Acked-by: Gaetan Rivet <gr...@u256.net>

-- 
Gaëtan

Reply via email to