views:

686

answers:

2

There are many ways to schedule work in the linux kernel: timers, tasklets, work queues, and kernel threads. What are the guidelines for when to use one vs another?

There are the obvious factors: timer functions and tasklets cannot sleep, so they cannot wait on mutexes, condition variables, etc.

What are the other factors in choosing which mechanism to us in a driver?

Which are the preferred mechanisms?

+3  A: 

As you said, it depends on the task at hand:

Work queues defer work into a kernel thread - your work will always run in process context. They are schedulable and can therefore sleep.

Normally, there is no debate between work queues or sotftirqs/tasklets; if the deferred work needs to sleep, work queues are used, otherwise softirqs or tasklets are used. Tasklets are also more suitable for interrupt handling (they are given certain assurances such as: a tasklet is never ran later than on the next tick, it's always serialized with regard to itself, etc.).

Kernel timers are good when you know exactly when you want something to happen, and do not want to interrupt/block a process in the meantime. They run outside process context, and they are also asynchronous with regard to other code, so they're the source of race conditions if you're not careful.

Hope this helps.

Michael Foukarakis
How would you choose between using a kernel thread and a work queue?
Jamey Hicks
Well, the intent behind creation of the workqueues was that they would partially replace kernel threads as a means to schedule tasks in the kernel (lazy workqueues being the latest effort to deal with that) because at some point, the number of kernel threads in a box becomes costly to manage. With that in mind, I think I'd generally favour workqueues over kernel threads for most intents and purposes.
Michael Foukarakis
+1  A: 
softirqs : deferred work runs in interrupt context
tasklets : deferred work runs in interrupt context
work queues : deferred work runs in process context

softirqs : cannot run simultaneously on different CPU's
tasklets : cannot run simultaneously on different CPU's
work queues : can run simultaneously on different CPU's

softirqs : cannot go to sleep
tasklets : cannot go to sleep
work queues : can go to sleep

softirqs : cannot be preempted/schedule
tasklets : cannot be preempted/schedule
work queues : maybe be preempted/schedule

softirqs : not easy to use
tasklets : easy to use
work queues : easy to use