Re: [PATCH 5/7] iio: core: simplify some devm functions

Alexandru Ardelean
2021-04-08T13:09:55Z

On Thu, Apr 8, 2021 at 2:41 PM Yicong Yang <yangyicong@hisilicon.com> wrote:
>
> Use devm_add_action_or_reset() instead of devres_alloc() and
> devres_add(), which works the same. This will simplify the
> code. There is no functional changes.
>
> Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
> ---
> drivers/iio/industrialio-core.c | 43 +++++++++++++++--------------------------
> 1 file changed, 16 insertions(+), 27 deletions(-)
>
> diff --git a/drivers/iio/industrialio-core.c b/drivers/iio/industrialio-core.c
> index 7db761a..2dfbed3 100644
> --- a/drivers/iio/industrialio-core.c
> +++ b/drivers/iio/industrialio-core.c
> @@ -1627,9 +1627,9 @@ void iio_device_free(struct iio_dev *dev)
> }
> EXPORT_SYMBOL(iio_device_free);
>
> -static void devm_iio_device_release(struct device *dev, void *res)
> +static void devm_iio_device_release(void *iio_dev)
> {
> - iio_device_free(*(struct iio_dev **)res);
> + iio_device_free(iio_dev);
> }
>
> /**
> @@ -1645,20 +1645,17 @@ static void devm_iio_device_release(struct device *dev, void *res)
> */
> struct iio_dev *devm_iio_device_alloc(struct device *parent, int sizeof_priv)
> {
> - struct iio_dev **ptr, *iio_dev;
> -
> - ptr = devres_alloc(devm_iio_device_release, sizeof(*ptr),
> - GFP_KERNEL);
> - if (!ptr)
> - return NULL;
> + struct iio_dev *iio_dev;
> + int ret;
>
> iio_dev = iio_device_alloc(parent, sizeof_priv);
> - if (iio_dev) {
> - *ptr = iio_dev;
> - devres_add(parent, ptr);
> - } else {
> - devres_free(ptr);
> - }
> + if (!iio_dev)
> + return iio_dev;

This is correct.
But the preference is usually:
if (!iio_dev)
return NULL;

> +
> + ret = devm_add_action_or_reset(parent, devm_iio_device_release,
> + iio_dev);
> + if (ret)
> + return ERR_PTR(ret);
>
> return iio_dev;
> }
> @@ -1889,29 +1886,21 @@ void iio_device_unregister(struct iio_dev *indio_dev)
> }
> EXPORT_SYMBOL(iio_device_unregister);
>
> -static void devm_iio_device_unreg(struct device *dev, void *res)
> +static void devm_iio_device_unreg(void *indio_dev)
> {
> - iio_device_unregister(*(struct iio_dev **)res);
> + iio_device_unregister(indio_dev);
> }
>
> int __devm_iio_device_register(struct device *dev, struct iio_dev *indio_dev,
> struct module *this_mod)
> {
> - struct iio_dev **ptr;
> int ret;
>
> - ptr = devres_alloc(devm_iio_device_unreg, sizeof(*ptr), GFP_KERNEL);
> - if (!ptr)
> - return -ENOMEM;
> -
> - *ptr = indio_dev;
> ret = __iio_device_register(indio_dev, this_mod);
> - if (!ret)
> - devres_add(dev, ptr);
> - else
> - devres_free(ptr);
> + if (ret)
> + return ret;
>
> - return ret;
> + return devm_add_action_or_reset(dev, devm_iio_device_unreg, indio_dev);
> }
> EXPORT_SYMBOL_GPL(__devm_iio_device_register);
>
> --
> 2.8.1
>