• Hans de Goede's avatar
    ACPI: platform-profile: Fix possible deadlock in platform_profile_remove() · 041142d7
    Hans de Goede authored
    After a rmmod thinkpad_acpi, lockdep pointed out this possible deadlock:
    
    Our _show and _store sysfs attr functions get called with the kn->active
    lock held for the sysfs attr and then take the profile_lock.
    sysfs_remove_group() also takes the kn->active lock for the sysfs attr,
    so if we call it with the profile_lock held, then we get an ABBA deadlock.
    
    platform_profile_remove() must only be called by drivers which have
    first *successfully* called platform_profile_register(). Anything else
    is a driver bug. So the check for cur_profile being set before calling
    sysfs_remove_group() is not necessary and it can be dropped.
    
    It is safe to call sysfs_remove_group() without holding the profile_lock
    since the attr-group group cannot be re-added until after we clear
    cur_profile.
    
    Change platform_profile_remove() to only hold the profile_lock while
    clearing the cur_profile, fixing the deadlock.
    Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    041142d7
platform_profile.c 4.01 KB