At Mon, 25 Jun 2007 13:44:49 +1100, Serge Nikolaenko wrote:
[1 <text/plain; us-ascii (7bit)>] Hello,
The attachement is the fix for mpu to prevent lockups/freezes. Added mutexes with down_trylock() calls, to prevent blocking.
Using mutex in the irq handler is scary (even though you're using trylock). What about simply using spin_lock_irqsave() instead of spin_lock() in _snd_mpu401_uart_interrupt() (maybe in uart_interrupt_tx(), too) ?
Takashi
Midi in/out not tested - I don't have no midi devices at the moment.
My soundcard is ESI Juli@. MB integrated midi is disabled in bios.
Last system messages after system freeze when running wine/jackd:
kernel: cmd: 0xff failed at 0xac0c (status = 0xb, data = 0x0) ... kernel: BUG: soft lockup detected on CPU#0! kernel: kernel: Call Trace: kernel: <IRQ> [<ffffffff802b0bdb>] softlockup_tick+0xdb/0xf6 kernel: [<ffffffff8028f5d0>] update_process_times+0x42/0x68 kernel: [<ffffffff80271f0c>] smp_local_timer_interrupt+0x34/0x55 kernel: [<ffffffff802725e8>] smp_apic_timer_interrupt+0x51/0x69 kernel: [<ffffffff8025ace6>] apic_timer_interrupt+0x66/0x70 kernel: [<ffffffff889c600d>] :snd_mpu401_uart:mpu401_read_port+0x4/0x8 kernel: [<ffffffff889c62f0>] :snd_mpu401_uart:_snd_mpu401_uart_interrupt+0x4c/0x70 kernel: [<ffffffff889c6391>] :snd_mpu401_uart:snd_mpu401_uart_interrupt+0x13/0x1a kernel: [<ffffffff88a1f34b>] :snd_ice1724:snd_vt1724_interrupt+0x4e/0x13a kernel: [<ffffffff80210b93>] handle_IRQ_event+0x25/0x53 kernel: [<ffffffff802b202a>] handle_fasteoi_irq+0x92/0xd1 kernel: [<ffffffff8026862a>] do_IRQ+0xff/0x16d kernel: [<ffffffff8025a631>] ret_from_intr+0x0/0xa kernel: <EOI> [<ffffffff802f5df7>] proc_info_read+0x0/0xb9 kernel: [<ffffffff802f5df9>] proc_info_read+0x2/0xb9 kernel: [<ffffffff8020b14e>] vfs_read+0xcb/0x173 kernel: [<ffffffff80211847>] sys_read+0x45/0x6e kernel: [<ffffffff8025a11e>] system_call+0x7e/0x83 [2 mpu401_mutex.diff <text/x-diff; us-ascii (7bit)>] diff -urN a/sound/drivers/mpu401/mpu401_uart.c b/sound/drivers/mpu401/mpu401_uart.c --- a/sound/drivers/mpu401/mpu401_uart.c 2006-12-06 01:58:01.000000000 +1000 +++ b/sound/drivers/mpu401/mpu401_uart.c 2007-06-22 18:21:57.000000000 +1100 @@ -46,6 +46,9 @@ static void snd_mpu401_uart_input_read(struct snd_mpu401 * mpu); static void snd_mpu401_uart_output_write(struct snd_mpu401 * mpu);
+DECLARE_MUTEX(mpu_tx_mutex); +DECLARE_MUTEX(mpu_interrupt_mutex);
/*
*/ @@ -103,6 +106,8 @@ snd_mpu401_uart_output_write(mpu); spin_unlock(&mpu->output_lock); }
- up(&mpu_tx_mutex);
}
static void _snd_mpu401_uart_interrupt(struct snd_mpu401 *mpu) @@ -116,9 +121,16 @@ spin_unlock(&mpu->input_lock); } if (! (mpu->info_flags & MPU401_INFO_TX_IRQ))
- { /* ok. for better Tx performance try do some output when input is done */
if (!down_trylock(&mpu_tx_mutex))
uart_interrupt_tx(mpu);{
}
- }
- up(&mpu_interrupt_mutex);
}
/** @@ -134,7 +146,10 @@
if (mpu == NULL) return IRQ_NONE;
- _snd_mpu401_uart_interrupt(mpu);
- if (!down_trylock(&mpu_interrupt_mutex))
- {
_snd_mpu401_uart_interrupt(mpu);
- } return IRQ_HANDLED;
}
@@ -153,7 +168,10 @@
if (mpu == NULL) return IRQ_NONE;
- uart_interrupt_tx(mpu);
- if (!down_trylock(&mpu_tx_mutex))
- {
uart_interrupt_tx(mpu);
- } return IRQ_HANDLED;
}
[3 <text/plain; us-ascii (7bit)>] _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org http://mailman.alsa-project.org/mailman/listinfo/alsa-devel