• Eric W. Biederman's avatar
    Input: serio - fix potential deadlock when unbinding drivers · 59b01513
    Eric W. Biederman authored
    sysfs_remove_group() waits for sysfs attributes to be removed, therefore
    we do not need to worry about driver-specific attributes being accessed
    after driver has been detached from the device. In fact, attempts to take
    serio->drv_mutex in attribute methods may lead to the following deadlock:
    
                                              sysfs_read_file()
                                                fill_read_buffer()
                                                  sysfs_get_active_two()
                                                    psmouse_attr_show_helper()
                                                      serio_pin_driver()
    serio_disconnect_driver()
      mutex_lock(&serio->drv_mutex);
                                    <-------->        mutex_lock(&serio_drv_mutex);
        psmouse_disconnect()
          sysfs_remove_group(... psmouse_attr_group);
            ....
            sysfs_deactivate();
              wait_for_completion();
    
    Fix this by removing calls to serio_[un]pin_driver() and functions themselves
    and using driver-private mutexes to serialize access to attribute's set()
    methods that may change device state.
    Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
    Signed-off-by: default avatarDmitry Torokhov <dtor@mail.ru>
    59b01513
psmouse-base.c 42 KB