Skip to content

Commit

Permalink
iio: trigger: move to the cleanup.h magic
Browse files Browse the repository at this point in the history
Use the new cleanup magic for handling mutexes in IIO. This allows us to
greatly simplify some code paths.

Signed-off-by: Nuno Sa <nuno.sa@analog.com>
Link: https://lore.kernel.org/r/20240229-iio-use-cleanup-magic-v3-2-c3d34889ae3c@analog.com
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
  • Loading branch information
Nuno Sa authored and Jonathan Cameron committed Mar 25, 2024
1 parent 42ea599 commit 095be2d
Showing 1 changed file with 30 additions and 41 deletions.
71 changes: 30 additions & 41 deletions drivers/iio/industrialio-trigger.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* Copyright (c) 2008 Jonathan Cameron
*/

#include <linux/cleanup.h>
#include <linux/kernel.h>
#include <linux/idr.h>
#include <linux/err.h>
Expand Down Expand Up @@ -80,19 +81,18 @@ int iio_trigger_register(struct iio_trigger *trig_info)
goto error_unregister_id;

/* Add to list of available triggers held by the IIO core */
mutex_lock(&iio_trigger_list_lock);
if (__iio_trigger_find_by_name(trig_info->name)) {
pr_err("Duplicate trigger name '%s'\n", trig_info->name);
ret = -EEXIST;
goto error_device_del;
scoped_guard(mutex, &iio_trigger_list_lock) {
if (__iio_trigger_find_by_name(trig_info->name)) {
pr_err("Duplicate trigger name '%s'\n", trig_info->name);
ret = -EEXIST;
goto error_device_del;
}
list_add_tail(&trig_info->list, &iio_trigger_list);
}
list_add_tail(&trig_info->list, &iio_trigger_list);
mutex_unlock(&iio_trigger_list_lock);

return 0;

error_device_del:
mutex_unlock(&iio_trigger_list_lock);
device_del(&trig_info->dev);
error_unregister_id:
ida_free(&iio_trigger_ida, trig_info->id);
Expand All @@ -102,9 +102,8 @@ EXPORT_SYMBOL(iio_trigger_register);

void iio_trigger_unregister(struct iio_trigger *trig_info)
{
mutex_lock(&iio_trigger_list_lock);
list_del(&trig_info->list);
mutex_unlock(&iio_trigger_list_lock);
scoped_guard(mutex, &iio_trigger_list_lock)
list_del(&trig_info->list);

ida_free(&iio_trigger_ida, trig_info->id);
/* Possible issue in here */
Expand All @@ -120,12 +119,11 @@ int iio_trigger_set_immutable(struct iio_dev *indio_dev, struct iio_trigger *tri
return -EINVAL;

iio_dev_opaque = to_iio_dev_opaque(indio_dev);
mutex_lock(&iio_dev_opaque->mlock);
guard(mutex)(&iio_dev_opaque->mlock);
WARN_ON(iio_dev_opaque->trig_readonly);

indio_dev->trig = iio_trigger_get(trig);
iio_dev_opaque->trig_readonly = true;
mutex_unlock(&iio_dev_opaque->mlock);

return 0;
}
Expand All @@ -145,18 +143,14 @@ static struct iio_trigger *__iio_trigger_find_by_name(const char *name)

static struct iio_trigger *iio_trigger_acquire_by_name(const char *name)
{
struct iio_trigger *trig = NULL, *iter;
struct iio_trigger *iter;

mutex_lock(&iio_trigger_list_lock);
guard(mutex)(&iio_trigger_list_lock);
list_for_each_entry(iter, &iio_trigger_list, list)
if (sysfs_streq(iter->name, name)) {
trig = iter;
iio_trigger_get(trig);
break;
}
mutex_unlock(&iio_trigger_list_lock);
if (sysfs_streq(iter->name, name))
return iio_trigger_get(iter);

return trig;
return NULL;
}

static void iio_reenable_work_fn(struct work_struct *work)
Expand Down Expand Up @@ -259,22 +253,21 @@ static int iio_trigger_get_irq(struct iio_trigger *trig)
{
int ret;

mutex_lock(&trig->pool_lock);
ret = bitmap_find_free_region(trig->pool,
CONFIG_IIO_CONSUMERS_PER_TRIGGER,
ilog2(1));
mutex_unlock(&trig->pool_lock);
if (ret >= 0)
ret += trig->subirq_base;
scoped_guard(mutex, &trig->pool_lock) {
ret = bitmap_find_free_region(trig->pool,
CONFIG_IIO_CONSUMERS_PER_TRIGGER,
ilog2(1));
if (ret < 0)
return ret;
}

return ret;
return ret + trig->subirq_base;
}

static void iio_trigger_put_irq(struct iio_trigger *trig, int irq)
{
mutex_lock(&trig->pool_lock);
guard(mutex)(&trig->pool_lock);
clear_bit(irq - trig->subirq_base, trig->pool);
mutex_unlock(&trig->pool_lock);
}

/* Complexity in here. With certain triggers (datardy) an acknowledgement
Expand Down Expand Up @@ -451,16 +444,12 @@ static ssize_t current_trigger_store(struct device *dev,
struct iio_trigger *trig;
int ret;

mutex_lock(&iio_dev_opaque->mlock);
if (iio_dev_opaque->currentmode == INDIO_BUFFER_TRIGGERED) {
mutex_unlock(&iio_dev_opaque->mlock);
return -EBUSY;
}
if (iio_dev_opaque->trig_readonly) {
mutex_unlock(&iio_dev_opaque->mlock);
return -EPERM;
scoped_guard(mutex, &iio_dev_opaque->mlock) {
if (iio_dev_opaque->currentmode == INDIO_BUFFER_TRIGGERED)
return -EBUSY;
if (iio_dev_opaque->trig_readonly)
return -EPERM;
}
mutex_unlock(&iio_dev_opaque->mlock);

trig = iio_trigger_acquire_by_name(buf);
if (oldtrig == trig) {
Expand Down

0 comments on commit 095be2d

Please sign in to comment.