]> git.baikalelectronics.ru Git - kernel.git/commitdiff
iio: trigger: move trig->owner init to trigger allocate() stage
authorDmitry Rokosov <DDRokosov@sberdevices.ru>
Wed, 1 Jun 2022 17:48:32 +0000 (17:48 +0000)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Sat, 16 Jul 2022 15:24:19 +0000 (16:24 +0100)
To provide a new IIO trigger to the IIO core, usually driver executes the
following pipeline: allocate()/register()/get(). Before, IIO core assigned
trig->owner as a pointer to the module which registered this trigger at
the register() stage. But actually the trigger object is owned by the
module earlier, on the allocate() stage, when trigger object is
successfully allocated for the driver.

This patch moves trig->owner initialization from register()
stage of trigger initialization pipeline to allocate() stage to
eliminate all misunderstandings and time gaps between trigger object
creation and owner acquiring.

Signed-off-by: Dmitry Rokosov <ddrokosov@sberdevices.ru>
Link: https://lore.kernel.org/r/20220601174837.20292-1-ddrokosov@sberdevices.ru
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/iio/industrialio-trigger.c
include/linux/iio/iio.h
include/linux/iio/trigger.h

index 26d610d4cbb81f6a836686cb0b853c37b1038a34..efc01584b3f9d892bec67208b924edcb5749784d 100644 (file)
@@ -63,13 +63,10 @@ ATTRIBUTE_GROUPS(iio_trig_dev);
 
 static struct iio_trigger *__iio_trigger_find_by_name(const char *name);
 
-int __iio_trigger_register(struct iio_trigger *trig_info,
-                          struct module *this_mod)
+int iio_trigger_register(struct iio_trigger *trig_info)
 {
        int ret;
 
-       trig_info->owner = this_mod;
-
        trig_info->id = ida_alloc(&iio_trigger_ida, GFP_KERNEL);
        if (trig_info->id < 0)
                return trig_info->id;
@@ -100,7 +97,7 @@ error_unregister_id:
        ida_free(&iio_trigger_ida, trig_info->id);
        return ret;
 }
-EXPORT_SYMBOL(__iio_trigger_register);
+EXPORT_SYMBOL(iio_trigger_register);
 
 void iio_trigger_unregister(struct iio_trigger *trig_info)
 {
@@ -547,8 +544,9 @@ static void iio_trig_subirqunmask(struct irq_data *d)
        trig->subirqs[d->irq - trig->subirq_base].enabled = true;
 }
 
-static __printf(2, 0)
+static __printf(3, 0)
 struct iio_trigger *viio_trigger_alloc(struct device *parent,
+                                      struct module *this_mod,
                                       const char *fmt,
                                       va_list vargs)
 {
@@ -578,6 +576,8 @@ struct iio_trigger *viio_trigger_alloc(struct device *parent,
 
        INIT_LIST_HEAD(&trig->list);
 
+       trig->owner = this_mod;
+
        trig->subirq_chip.name = trig->name;
        trig->subirq_chip.irq_mask = &iio_trig_subirqmask;
        trig->subirq_chip.irq_unmask = &iio_trig_subirqunmask;
@@ -598,8 +598,9 @@ free_trig:
 }
 
 /**
- * iio_trigger_alloc - Allocate a trigger
+ * __iio_trigger_alloc - Allocate a trigger
  * @parent:            Device to allocate iio_trigger for
+ * @this_mod:          module allocating the trigger
  * @fmt:               trigger name format. If it includes format
  *                     specifiers, the additional arguments following
  *                     format are formatted and inserted in the resulting
@@ -607,18 +608,20 @@ free_trig:
  * RETURNS:
  * Pointer to allocated iio_trigger on success, NULL on failure.
  */
-struct iio_trigger *iio_trigger_alloc(struct device *parent, const char *fmt, ...)
+struct iio_trigger *__iio_trigger_alloc(struct device *parent,
+                                       struct module *this_mod,
+                                       const char *fmt, ...)
 {
        struct iio_trigger *trig;
        va_list vargs;
 
        va_start(vargs, fmt);
-       trig = viio_trigger_alloc(parent, fmt, vargs);
+       trig = viio_trigger_alloc(parent, this_mod, fmt, vargs);
        va_end(vargs);
 
        return trig;
 }
-EXPORT_SYMBOL(iio_trigger_alloc);
+EXPORT_SYMBOL(__iio_trigger_alloc);
 
 void iio_trigger_free(struct iio_trigger *trig)
 {
@@ -633,10 +636,11 @@ static void devm_iio_trigger_release(struct device *dev, void *res)
 }
 
 /**
- * devm_iio_trigger_alloc - Resource-managed iio_trigger_alloc()
+ * __devm_iio_trigger_alloc - Resource-managed iio_trigger_alloc()
  * Managed iio_trigger_alloc.  iio_trigger allocated with this function is
  * automatically freed on driver detach.
  * @parent:            Device to allocate iio_trigger for
+ * @this_mod:          module allocating the trigger
  * @fmt:               trigger name format. If it includes format
  *                     specifiers, the additional arguments following
  *                     format are formatted and inserted in the resulting
@@ -646,7 +650,9 @@ static void devm_iio_trigger_release(struct device *dev, void *res)
  * RETURNS:
  * Pointer to allocated iio_trigger on success, NULL on failure.
  */
-struct iio_trigger *devm_iio_trigger_alloc(struct device *parent, const char *fmt, ...)
+struct iio_trigger *__devm_iio_trigger_alloc(struct device *parent,
+                                            struct module *this_mod,
+                                            const char *fmt, ...)
 {
        struct iio_trigger **ptr, *trig;
        va_list vargs;
@@ -658,7 +664,7 @@ struct iio_trigger *devm_iio_trigger_alloc(struct device *parent, const char *fm
 
        /* use raw alloc_dr for kmalloc caller tracing */
        va_start(vargs, fmt);
-       trig = viio_trigger_alloc(parent, fmt, vargs);
+       trig = viio_trigger_alloc(parent, this_mod, fmt, vargs);
        va_end(vargs);
        if (trig) {
                *ptr = trig;
@@ -669,7 +675,7 @@ struct iio_trigger *devm_iio_trigger_alloc(struct device *parent, const char *fm
 
        return trig;
 }
-EXPORT_SYMBOL_GPL(devm_iio_trigger_alloc);
+EXPORT_SYMBOL_GPL(__devm_iio_trigger_alloc);
 
 static void devm_iio_trigger_unreg(void *trigger_info)
 {
@@ -677,10 +683,9 @@ static void devm_iio_trigger_unreg(void *trigger_info)
 }
 
 /**
- * __devm_iio_trigger_register - Resource-managed iio_trigger_register()
+ * devm_iio_trigger_register - Resource-managed iio_trigger_register()
  * @dev:       device this trigger was allocated for
  * @trig_info: trigger to register
- * @this_mod:   module registering the trigger
  *
  * Managed iio_trigger_register().  The IIO trigger registered with this
  * function is automatically unregistered on driver detach. This function
@@ -690,19 +695,18 @@ static void devm_iio_trigger_unreg(void *trigger_info)
  * RETURNS:
  * 0 on success, negative error number on failure.
  */
-int __devm_iio_trigger_register(struct device *dev,
-                               struct iio_trigger *trig_info,
-                               struct module *this_mod)
+int devm_iio_trigger_register(struct device *dev,
+                             struct iio_trigger *trig_info)
 {
        int ret;
 
-       ret = __iio_trigger_register(trig_info, this_mod);
+       ret = iio_trigger_register(trig_info);
        if (ret)
                return ret;
 
        return devm_add_action_or_reset(dev, devm_iio_trigger_unreg, trig_info);
 }
-EXPORT_SYMBOL_GPL(__devm_iio_trigger_register);
+EXPORT_SYMBOL_GPL(devm_iio_trigger_register);
 
 bool iio_trigger_using_own(struct iio_dev *indio_dev)
 {
index d9b4a9ca9a0f02669188f46812b048989ba5014d..5dfbfc991c6967701ac232f2cd4ff7c5c783afb5 100644 (file)
@@ -727,10 +727,13 @@ static inline void *iio_priv(const struct iio_dev *indio_dev)
 
 void iio_device_free(struct iio_dev *indio_dev);
 struct iio_dev *devm_iio_device_alloc(struct device *parent, int sizeof_priv);
-__printf(2, 3)
-struct iio_trigger *devm_iio_trigger_alloc(struct device *parent,
-                                          const char *fmt, ...);
 
+#define devm_iio_trigger_alloc(parent, fmt, ...) \
+       __devm_iio_trigger_alloc((parent), THIS_MODULE, (fmt), ##__VA_ARGS__)
+__printf(3, 4)
+struct iio_trigger *__devm_iio_trigger_alloc(struct device *parent,
+                                            struct module *this_mod,
+                                            const char *fmt, ...);
 /**
  * iio_get_debugfs_dentry() - helper function to get the debugfs_dentry
  * @indio_dev:         IIO device structure for device
index 03b1d68634367ff2c249593c6c92a7136bdf4002..f6360d9a492d6747cb75b52af25b28a9fc2a5c4f 100644 (file)
@@ -131,16 +131,10 @@ static inline void *iio_trigger_get_drvdata(struct iio_trigger *trig)
  * iio_trigger_register() - register a trigger with the IIO core
  * @trig_info: trigger to be registered
  **/
-#define iio_trigger_register(trig_info) \
-       __iio_trigger_register((trig_info), THIS_MODULE)
-int __iio_trigger_register(struct iio_trigger *trig_info,
-                          struct module *this_mod);
+int iio_trigger_register(struct iio_trigger *trig_info);
 
-#define devm_iio_trigger_register(dev, trig_info) \
-       __devm_iio_trigger_register((dev), (trig_info), THIS_MODULE)
-int __devm_iio_trigger_register(struct device *dev,
-                               struct iio_trigger *trig_info,
-                               struct module *this_mod);
+int devm_iio_trigger_register(struct device *dev,
+                             struct iio_trigger *trig_info);
 
 /**
  * iio_trigger_unregister() - unregister a trigger from the core
@@ -168,8 +162,13 @@ void iio_trigger_poll_chained(struct iio_trigger *trig);
 
 irqreturn_t iio_trigger_generic_data_rdy_poll(int irq, void *private);
 
-__printf(2, 3)
-struct iio_trigger *iio_trigger_alloc(struct device *parent, const char *fmt, ...);
+#define iio_trigger_alloc(parent, fmt, ...) \
+       __iio_trigger_alloc((parent), THIS_MODULE, (fmt), ##__VA_ARGS__)
+
+__printf(3, 4)
+struct iio_trigger *__iio_trigger_alloc(struct device *parent,
+                                       struct module *this_mod,
+                                       const char *fmt, ...);
 void iio_trigger_free(struct iio_trigger *trig);
 
 /**