lkml.org 
[lkml]   [2015]   [May]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v2 10/23] gpio: sysfs: release irq after class-device deregistration
    Date
    Make sure to release any irq only after the class device has been
    deregistered.

    This avoids a race between gpiod_unexport and edge_store, where an irq
    could be allocated just before the gpio class device is deregistered
    without relying on FLAG_EXPORT and the global sysfs lock.

    Note that there is no need to hold the sysfs lock when releasing the irq
    after the class device is gone as kernfs will prevent further attribute
    operations.

    Signed-off-by: Johan Hovold <johan@kernel.org>
    ---
    drivers/gpio/gpiolib-sysfs.c | 6 +++++-
    1 file changed, 5 insertions(+), 1 deletion(-)

    diff --git a/drivers/gpio/gpiolib-sysfs.c b/drivers/gpio/gpiolib-sysfs.c
    index a78dabd4035b..e4b079eec9bc 100644
    --- a/drivers/gpio/gpiolib-sysfs.c
    +++ b/drivers/gpio/gpiolib-sysfs.c
    @@ -695,7 +695,6 @@ void gpiod_unexport(struct gpio_desc *desc)

    dev = class_find_device(&gpio_class, NULL, desc, match_export);
    if (dev) {
    - gpio_setup_irq(desc, dev, 0);
    clear_bit(FLAG_SYSFS_DIR, &desc->flags);
    clear_bit(FLAG_EXPORT, &desc->flags);
    } else
    @@ -706,6 +705,11 @@ void gpiod_unexport(struct gpio_desc *desc)

    if (dev) {
    device_unregister(dev);
    + /*
    + * Release irq after deregistration to prevent race with
    + * edge_store.
    + */
    + gpio_setup_irq(desc, dev, 0);
    put_device(dev);
    }

    --
    2.0.5


    \
     
     \ /
      Last update: 2015-05-04 17:41    [W:4.148 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site