Skip to content

Commit

Permalink
HID: wacom: Shrink critical section in wacom_add_shared_data
Browse files Browse the repository at this point in the history
The size of the critical section in this function appears to be larger
than necessary. The `wacom_udev_list_lock` exists to ensure that one
interface cannot begin checking if a shared object exists while a second
interface is doing the same (otherwise both could determine that no
object exists yet and create their own independent objects rather than
sharing just one). It should be safe for the critical section to end
once a fresly-allocated shared object would be found by other threads
(i.e., once it has been added to `wacom_udev_list`, which is looped
over by `wacom_get_hdev_data`).

This commit is a necessary pre-requisite for a later change to swap the
use of `devm_add_action` with `devm_add_action_or_reset`, which would
otherwise deadlock in its error case.

Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
  • Loading branch information
Jason Gerecke authored and Jiri Kosina committed Oct 27, 2021
1 parent 42d43c9 commit b764459
Showing 1 changed file with 4 additions and 5 deletions.
9 changes: 4 additions & 5 deletions drivers/hid/wacom_sys.c
Original file line number Diff line number Diff line change
Expand Up @@ -881,20 +881,21 @@ static int wacom_add_shared_data(struct hid_device *hdev)
if (!data) {
data = kzalloc(sizeof(struct wacom_hdev_data), GFP_KERNEL);
if (!data) {
retval = -ENOMEM;
goto out;
mutex_unlock(&wacom_udev_list_lock);
return -ENOMEM;
}

kref_init(&data->kref);
data->dev = hdev;
list_add_tail(&data->list, &wacom_udev_list);
}

mutex_unlock(&wacom_udev_list_lock);

wacom_wac->shared = &data->shared;

retval = devm_add_action(&hdev->dev, wacom_remove_shared_data, wacom);
if (retval) {
mutex_unlock(&wacom_udev_list_lock);
wacom_remove_shared_data(wacom);
return retval;
}
Expand All @@ -904,8 +905,6 @@ static int wacom_add_shared_data(struct hid_device *hdev)
else if (wacom_wac->features.device_type & WACOM_DEVICETYPE_PEN)
wacom_wac->shared->pen = hdev;

out:
mutex_unlock(&wacom_udev_list_lock);
return retval;
}

Expand Down

0 comments on commit b764459

Please sign in to comment.