alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
From: Giuliano Pochini <pochini@shiny.it>
To: Clemens Ladisch <clemens@ladisch.de>
Cc: Frederick V Heitkamp <heitkamp@ameritech.net>,
	Takashi Iwai <tiwai@suse.de>,
	linux-kernel@vger.kernel.org, alsa-devel@alsa-project.org
Subject: Re: [alsa-devel] Crash 2.6.32.x, Echo 3G, Alsa, SCSI
Date: Tue, 2 Feb 2010 23:09:11 +0100	[thread overview]
Message-ID: <20100202230911.71e8b600@Jay> (raw)
In-Reply-To: <4B684513.8090201@ladisch.de>

On Tue, 02 Feb 2010 16:30:27 +0100
Clemens Ladisch <clemens@ladisch.de> wrote:

> Frederick V Heitkamp wrote:
> > Repeatable Hard Crash.
> > What else do I need to provide?
> > 
> > [ 5484.995249] WriteControlReg: not written, no change
> > [ 5485.069621] divide error: 0000 [#1] pcm_hw_params ok
> > [ 5485.070159] Prepare rate=44100 format=2 channels=2
> > [ 5485.070161] set_audio_format[14] = 5
> > [ 5485.070166] Prepare rate=44100 format=2 channels=2
> > [ 5485.070167] set_audio_format[14] = 5
> > [ 5485.070003] PREEMPT SMP 
> > ...
> > [ 5485.070003] EIP is at pcm_pointer+0x37/0x70 [snd_echo3g]
> > ...
> > [ 5485.965788]  [<c10041c0>] ? do_divide_error+0x0/0x90
> > [ 5485.980619]  [<f87aa037>] ? pcm_pointer+0x37/0x70 [snd_echo3g]
> > [ 5485.998047]  [<c104764e>] ? run_timer_softirq+0x17e/0x2e0
> > [ 5486.014175]  [<f87ac9bf>] ? snd_echo_interrupt+0x11f/0x240 [snd_echo3g]
> > [ 5486.033940]  [<c107a5d5>] ? handle_IRQ_event+0x45/0x190
> 
> bytes_to_frames() divides by runtime->frame_bits which is not set until
> after the hw_params callback has succeeded, but the corresponding
> chip->substream[] entry is set in that callback, by init_engine().  It
> should probably have been set in the prepare callback.

I've just had another look at my code. Although it never happened to me, it
is indeed possible when hw_params() completes if another substream is
already running. The reason is that the card delivers an irq when it
executes an irq instruction in any of the running s-g lists. The irq
handler cannot know which substream caused it, so it has to call the
pointer() function for each of the configured substreams (ie. the ones
which completed one of the pcm_*_hw_params() callbacks.

There is another possible fix. I tested it briefly. It looks ok wrt race
conditions because pipe->state is set only in the trigger callback. I hope
I didn't overlook anything again...


Signed-off-by: Giuliano Pochini <pochini@shiny.it>

--- alsa-driver-1.0.22.1/alsa-kernel/pci/echoaudio/echoaudio.c__orig	2010-02-02 22:37:33.000000000 +0100
+++ alsa-driver-1.0.22.1/alsa-kernel/pci/echoaudio/echoaudio.c	2010-02-02 22:44:03.000000000 +0100
@@ -1821,7 +1821,9 @@ static irqreturn_t snd_echo_interrupt(in
 	/* The hardware doesn't tell us which substream caused the irq,
 	thus we have to check all running substreams. */
 	for (ss = 0; ss < DSP_MAXPIPES; ss++) {
-		if ((substream = chip->substream[ss])) {
+		substream = chip->substream[ss];
+		if (substream && ((struct audiopipe *)substream->runtime->
+				private_data)->state == PIPE_STATE_STARTED) {
 			period = pcm_pointer(substream) /
 				substream->runtime->period_size;
 			if (period != chip->last_period[ss]) {


-- 
Giuliano.

  parent reply	other threads:[~2010-02-02 22:09 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <73211.74714.qm@web180714.mail.sp1.yahoo.com>
2010-02-02 15:30 ` Crash 2.6.32.x, Echo 3G, Alsa, SCSI Clemens Ladisch
2010-02-02 16:02   ` [alsa-devel] " Giuliano Pochini
2010-02-03  2:48     ` Frederick V Heitkamp
2010-02-02 22:09   ` Giuliano Pochini [this message]
2010-02-03  2:51     ` Frederick V Heitkamp
2010-02-03  2:53     ` [alsa-devel] " Frederick V Heitkamp
2010-05-31 19:05     ` [LAU] " F. Heitkamp
2010-05-31 20:59       ` Giuliano Pochini
2010-06-01  5:37         ` Takashi Iwai
2010-06-01 12:25         ` [LAU] [Alsa-user] [alsa-devel] " F. Heitkamp
2010-06-02 22:08           ` [Alsa-user] " Giuliano Pochini
2010-06-17 12:11             ` [LAU] [Alsa-user] [alsa-devel] " F. Heitkamp
2010-06-18 11:55               ` [Alsa-user] " Giuliano Pochini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20100202230911.71e8b600@Jay \
    --to=pochini@shiny.it \
    --cc=alsa-devel@alsa-project.org \
    --cc=clemens@ladisch.de \
    --cc=heitkamp@ameritech.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).