On 02/20/2018 11:33 AM, Rodrigo Rivas Costa wrote:
> +static void steam_work_connect_cb(struct work_struct *work)
> +{
> +     struct steam_device *steam = container_of(work, struct steam_device,
> +                                                     work_connect);
> +     unsigned long flags;
> +     bool connected;
> +     int ret;
> +
> +     spin_lock_irqsave(&steam->lock, flags);
> +     connected = steam->connected;
> +     spin_unlock_irqrestore(&steam->lock, flags);
> +
> +     if (connected) {
> +             if (steam->input) {
> +                     dbg_hid("%s: already connected\n", __func__);
> +                     return;
> +             }
> +             ret = steam_register(steam);
> +             if (ret) {
> +                     hid_err(steam->hdev,
> +                             "%s:steam_register failed with error %d\n",
> +                             __func__, ret);
> +                     return;
> +             }
> +     } else {
> +             steam_unregister(steam);

I think you need synchronization here. You don't want to be in the middle of
processing a HID event or power supply update and have your device freed out
from underneath you.

xpad uses RCU to avoid this race.

> +     }
> +}
> +

Regards,
Cameron

Reply via email to