• Johannes Berg's avatar
    leds: trigger: use RCU to protect the led_cdevs list · 2a5a8fa8
    Johannes Berg authored
    Even with the previous commit 27af8e2c
    ("leds: trigger: fix potential deadlock with libata")
    to this file, we still get lockdep unhappy, and Boqun
    explained the report here:
    https://lore.kernel.org/r/YNA+d1X4UkoQ7g8a@boqun-archlinux
    
    Effectively, this means that the read_lock_irqsave() isn't
    enough here because another CPU might be trying to do a
    write lock, and thus block the readers.
    
    This is all pretty messy, but it doesn't seem right that
    the LEDs framework imposes some locking requirements on
    users, in particular we'd have to make the spinlock in the
    iwlwifi driver always disable IRQs, even if we don't need
    that for any other reason, just to avoid this deadlock.
    
    Since writes to the led_cdevs list are rare (and are done
    by userspace), just switch the list to RCU. This costs a
    synchronize_rcu() at removal time so we can ensure things
    are correct, but that seems like a small price to pay for
    getting lock-free iterations and no deadlocks (nor any
    locking requirements imposed on users.)
    Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
    Signed-off-by: default avatarPavel Machek <pavel@ucw.cz>
    2a5a8fa8
led-triggers.c 11.1 KB