Как вы сказали, это зависит от поставленной задачи:
Рабочие очереди откладывают работу в поток ядра - ваша работа всегда будет выполняться в процессе
контекст. Они планируются и поэтому могут спать.
Как правило, между рабочими очередями или sotftirqs / тасклетами нет споров; если отложенная работа должна находиться в спящем режиме, используются рабочие очереди, в противном случае используются программные пакеты или тасклеты. Тасклеты также больше подходят для обработки прерываний (им дают определенные гарантии, такие как: тасклет никогда не запускается позже, чем на следующем такте, он всегда сериализуется относительно себя и т. Д.).
Таймеры ядра хороши, когда вы точно знаете, когда хотите, чтобы что-то произошло, и не хотите прерывать / блокировать процесс тем временем. Они запускаются вне контекста процесса и также асинхронны по отношению к другому коду, поэтому они являются источником условий гонки, если вы не будете осторожны.
Надеюсь, это поможет.