Question: input_ff_create_memless synchronization

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi all,

While creating a driver for a haptics device, I started looking at
existing consumers of `input_ff_create_memless` to learn how this API is
typically used. All drivers in drivers/input/misc that use this API
follow the same structure (code heavily simplified):

```
probe() {
    input_ff_create_memless(play);
    INIT_WORK(work);
}

play(data, effect) {
    data->strength = calc_strength(effect);
    schedule_work(work);
}

work(data) {
    do_device_io(data->strength);
}
```

My question is about the lack of synchronization on `data` between
`play` and `work` (none of the drivers I found use any kind of
synchronization).

As far as I understand, `play` is called in the context of a timer
softirq and `work` on a workqueue. So it seems possible that `play` is
executed while a previously scheduled `work` is still running or hasn't
even started yet. I see two potential problems when this would happen:

1. A race on `data->strength`;
2. Missed effect updates: if `work` hasn't finished yet when `play` is
   called again, `schedule_work` will not schedule it. In the worst
   case, we could miss the disabling of an effect.

Is this analysis correct? If not, what am I missing? If so, what would
be the correct way to synchronize? (1. seems easy enough but 2. might
need to involve `flush_work` to implement properly and I'm not sure if
it's ok to call that from a softirq context.)

Best,
Job





[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux