]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
gpiolib: switch the line state notifier to atomic
authorBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Fri, 18 Oct 2024 09:10:15 +0000 (11:10 +0200)
committerBartosz Golaszewski <bartosz.golaszewski@linaro.org>
Tue, 22 Oct 2024 06:59:09 +0000 (08:59 +0200)
With everything else ready, we can now switch to using the atomic
notifier for line state events which will allow us to notify user-space
about direction changes from atomic context.

Reviewed-by: Kent Gibson <warthog618@gmail.com>
Link: https://lore.kernel.org/r/20241018-gpio-notify-in-kernel-events-v5-7-c79135e58a1c@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
drivers/gpio/gpiolib-cdev.c
drivers/gpio/gpiolib.c
drivers/gpio/gpiolib.h

index 7759dca92f8bb381b701660bcd403cb3e7415575..cb4fb55e2696a1f1df47679b65be9823e2ce57cb 100644 (file)
@@ -2729,8 +2729,8 @@ static int gpio_chrdev_open(struct inode *inode, struct file *file)
        cdev->gdev = gpio_device_get(gdev);
 
        cdev->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify;
-       ret = blocking_notifier_chain_register(&gdev->line_state_notifier,
-                                              &cdev->lineinfo_changed_nb);
+       ret = atomic_notifier_chain_register(&gdev->line_state_notifier,
+                                            &cdev->lineinfo_changed_nb);
        if (ret)
                goto out_free_bitmap;
 
@@ -2754,8 +2754,8 @@ out_unregister_device_notifier:
        blocking_notifier_chain_unregister(&gdev->device_notifier,
                                           &cdev->device_unregistered_nb);
 out_unregister_line_notifier:
-       blocking_notifier_chain_unregister(&gdev->line_state_notifier,
-                                          &cdev->lineinfo_changed_nb);
+       atomic_notifier_chain_unregister(&gdev->line_state_notifier,
+                                        &cdev->lineinfo_changed_nb);
 out_free_bitmap:
        gpio_device_put(gdev);
        bitmap_free(cdev->watched_lines);
@@ -2779,8 +2779,8 @@ static int gpio_chrdev_release(struct inode *inode, struct file *file)
 
        blocking_notifier_chain_unregister(&gdev->device_notifier,
                                           &cdev->device_unregistered_nb);
-       blocking_notifier_chain_unregister(&gdev->line_state_notifier,
-                                          &cdev->lineinfo_changed_nb);
+       atomic_notifier_chain_unregister(&gdev->line_state_notifier,
+                                        &cdev->lineinfo_changed_nb);
        bitmap_free(cdev->watched_lines);
        gpio_device_put(gdev);
        kfree(cdev);
index 807bee86afd5eb754bc68999760ff1c823db8595..83e85dbfdeed9dfc04144adeee56f886914e853f 100644 (file)
@@ -1026,7 +1026,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
                }
        }
 
-       BLOCKING_INIT_NOTIFIER_HEAD(&gdev->line_state_notifier);
+       ATOMIC_INIT_NOTIFIER_HEAD(&gdev->line_state_notifier);
        BLOCKING_INIT_NOTIFIER_HEAD(&gdev->device_notifier);
 
        ret = init_srcu_struct(&gdev->srcu);
@@ -4098,8 +4098,8 @@ EXPORT_SYMBOL_GPL(gpiod_set_array_value_cansleep);
 
 void gpiod_line_state_notify(struct gpio_desc *desc, unsigned long action)
 {
-       blocking_notifier_call_chain(&desc->gdev->line_state_notifier,
-                                    action, desc);
+       atomic_notifier_call_chain(&desc->gdev->line_state_notifier,
+                                  action, desc);
 }
 
 /**
index 8737e164127837ba6dc0455561250750d3d6872f..a54be597d21a2843c6288585496df49e0584cad0 100644 (file)
@@ -72,7 +72,7 @@ struct gpio_device {
        const char              *label;
        void                    *data;
        struct list_head        list;
-       struct blocking_notifier_head line_state_notifier;
+       struct atomic_notifier_head line_state_notifier;
        struct workqueue_struct *line_state_wq;
        struct blocking_notifier_head device_notifier;
        struct srcu_struct      srcu;