fix SMP support in cdu535 cdrom driver
PATCH 1/1 fix SMP support in cdu535 cdrom driver
Hi Jens, Patch against 2.6.0-test6. Even though cdu535 is polled, not interrupt driven, Matthew pointed
out[1] that is a good idea to fix SMP support on that bit, so that people who wants to fix cdu31a don't get that wrong.
Move prepare_to_wait before enable_interrupts, so that if we enter
the interrupt handler (after enable_interrupts) on a different CPU that's executing sony_sleep's poll version, "wait" is already on the irq_wait list, which I think fixes the race that Matthew pointed out, doesn't it?
CC'ing kernel-janitors since it also replaces yield for
schedule_timeout[2], as Matthew suggested.
Please consider applying.
Thanks,
Felipe
[1]http://marc.theaimsgroup.com/?l=linux-kernel&m=106322465303649&w=2
[2]http://lists.osdl.org/pipermail/kernel-janitors/2003-October/000173.html
drivers/cdrom/sonycd535.c renamed from drivers/cdrom/sonycd535.c.orig +4 -3
@@ -342,13 +342,14 @@sony_sleep (void) {if (sony535_irq_used <=0 ) {/* poll */ -yield (); +set_current_state (TASK_INTERRUPTIBLE ); +schedule_timeout (1 ); }else {/* Interrupt driven */ DEFINE_WAIT (wait); - +spin_lock_irq (&sonycd535_lock); -enable_interrupts ();prepare_to_wait (&cdu535_irq_wait, &wait,TASK_INTERRUPTIBLE ); +enable_interrupts ();spin_unlock_irq (&sonycd535_lock);schedule ();finish_wait (&cdu535_irq_wait, &wait);