Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

iio: trigger: move to the cleanup.h magic

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>

authored by

Nuno Sa and committed by
Jonathan Cameron
095be2d5 42ea5992

+30 -41
+30 -41
drivers/iio/industrialio-trigger.c
··· 4 4 * Copyright (c) 2008 Jonathan Cameron 5 5 */ 6 6 7 + #include <linux/cleanup.h> 7 8 #include <linux/kernel.h> 8 9 #include <linux/idr.h> 9 10 #include <linux/err.h> ··· 81 80 goto error_unregister_id; 82 81 83 82 /* Add to list of available triggers held by the IIO core */ 84 - mutex_lock(&iio_trigger_list_lock); 85 - if (__iio_trigger_find_by_name(trig_info->name)) { 86 - pr_err("Duplicate trigger name '%s'\n", trig_info->name); 87 - ret = -EEXIST; 88 - goto error_device_del; 83 + scoped_guard(mutex, &iio_trigger_list_lock) { 84 + if (__iio_trigger_find_by_name(trig_info->name)) { 85 + pr_err("Duplicate trigger name '%s'\n", trig_info->name); 86 + ret = -EEXIST; 87 + goto error_device_del; 88 + } 89 + list_add_tail(&trig_info->list, &iio_trigger_list); 89 90 } 90 - list_add_tail(&trig_info->list, &iio_trigger_list); 91 - mutex_unlock(&iio_trigger_list_lock); 92 91 93 92 return 0; 94 93 95 94 error_device_del: 96 - mutex_unlock(&iio_trigger_list_lock); 97 95 device_del(&trig_info->dev); 98 96 error_unregister_id: 99 97 ida_free(&iio_trigger_ida, trig_info->id); ··· 102 102 103 103 void iio_trigger_unregister(struct iio_trigger *trig_info) 104 104 { 105 - mutex_lock(&iio_trigger_list_lock); 106 - list_del(&trig_info->list); 107 - mutex_unlock(&iio_trigger_list_lock); 105 + scoped_guard(mutex, &iio_trigger_list_lock) 106 + list_del(&trig_info->list); 108 107 109 108 ida_free(&iio_trigger_ida, trig_info->id); 110 109 /* Possible issue in here */ ··· 119 120 return -EINVAL; 120 121 121 122 iio_dev_opaque = to_iio_dev_opaque(indio_dev); 122 - mutex_lock(&iio_dev_opaque->mlock); 123 + guard(mutex)(&iio_dev_opaque->mlock); 123 124 WARN_ON(iio_dev_opaque->trig_readonly); 124 125 125 126 indio_dev->trig = iio_trigger_get(trig); 126 127 iio_dev_opaque->trig_readonly = true; 127 - mutex_unlock(&iio_dev_opaque->mlock); 128 128 129 129 return 0; 130 130 } ··· 143 145 144 146 static struct iio_trigger *iio_trigger_acquire_by_name(const char *name) 145 147 { 146 - struct iio_trigger *trig = NULL, *iter; 148 + struct iio_trigger *iter; 147 149 148 - mutex_lock(&iio_trigger_list_lock); 150 + guard(mutex)(&iio_trigger_list_lock); 149 151 list_for_each_entry(iter, &iio_trigger_list, list) 150 - if (sysfs_streq(iter->name, name)) { 151 - trig = iter; 152 - iio_trigger_get(trig); 153 - break; 154 - } 155 - mutex_unlock(&iio_trigger_list_lock); 152 + if (sysfs_streq(iter->name, name)) 153 + return iio_trigger_get(iter); 156 154 157 - return trig; 155 + return NULL; 158 156 } 159 157 160 158 static void iio_reenable_work_fn(struct work_struct *work) ··· 253 259 { 254 260 int ret; 255 261 256 - mutex_lock(&trig->pool_lock); 257 - ret = bitmap_find_free_region(trig->pool, 258 - CONFIG_IIO_CONSUMERS_PER_TRIGGER, 259 - ilog2(1)); 260 - mutex_unlock(&trig->pool_lock); 261 - if (ret >= 0) 262 - ret += trig->subirq_base; 262 + scoped_guard(mutex, &trig->pool_lock) { 263 + ret = bitmap_find_free_region(trig->pool, 264 + CONFIG_IIO_CONSUMERS_PER_TRIGGER, 265 + ilog2(1)); 266 + if (ret < 0) 267 + return ret; 268 + } 263 269 264 - return ret; 270 + return ret + trig->subirq_base; 265 271 } 266 272 267 273 static void iio_trigger_put_irq(struct iio_trigger *trig, int irq) 268 274 { 269 - mutex_lock(&trig->pool_lock); 275 + guard(mutex)(&trig->pool_lock); 270 276 clear_bit(irq - trig->subirq_base, trig->pool); 271 - mutex_unlock(&trig->pool_lock); 272 277 } 273 278 274 279 /* Complexity in here. With certain triggers (datardy) an acknowledgement ··· 444 451 struct iio_trigger *trig; 445 452 int ret; 446 453 447 - mutex_lock(&iio_dev_opaque->mlock); 448 - if (iio_dev_opaque->currentmode == INDIO_BUFFER_TRIGGERED) { 449 - mutex_unlock(&iio_dev_opaque->mlock); 450 - return -EBUSY; 454 + scoped_guard(mutex, &iio_dev_opaque->mlock) { 455 + if (iio_dev_opaque->currentmode == INDIO_BUFFER_TRIGGERED) 456 + return -EBUSY; 457 + if (iio_dev_opaque->trig_readonly) 458 + return -EPERM; 451 459 } 452 - if (iio_dev_opaque->trig_readonly) { 453 - mutex_unlock(&iio_dev_opaque->mlock); 454 - return -EPERM; 455 - } 456 - mutex_unlock(&iio_dev_opaque->mlock); 457 460 458 461 trig = iio_trigger_acquire_by_name(buf); 459 462 if (oldtrig == trig) {