The driver for the SPI master interface on Samsung 24xx SOCs in the mainline uses a workqueue because it's based on the generic bit-banging one. This could lead to very bad performance under heavy load conditions. I forward ported to kernel 2.6.27 the driver by Christer Weinigel. I just disabled the DMA part for now because on short transfers (< 32) it has a great overhead. The patch: spi-s3c24xx.diff
Workqueues are a useful tool when programming in the Linux kernel-space. Unfortunately they scheduled with the same priority as other processes so under heavy load there could arise problems if a workqueue is servicing a piece of hardware that needs attention. With the patch worqueue-patch.diff you get a function that permits to give the highest (in the real-time or normal class for scheduling) to a workqueue. Example:
s->workqueue = create_freezeable_workqueue(b);
if (use_prio > 0) {
extern void set_workqueue_max_prio(struct workqueue_struct *wq, int rt);
if (use_prio > 1) {
printk(KERN_DEBUG "hack enabled for %s RT\n", b);
set_workqueue_max_prio(s->workqueue, 1);
}
else {
printk(KERN_DEBUG "hack enabled for %s\n", b);
set_workqueue_max_prio(s->workqueue, 0);
}
}
Anyway keep in mind that workqueues are like processes, so if you have HZ set to 1000 (or a tickless kernel) smaller scheduling quantum time will give lower latency and so better response of the driver. Having kernel preemption enabled helps too.