From: Kelly Anderson <kelly@silka.with-linux.com>
To: "Christopher K." <c.krooss@googlemail.com>
Cc: Clemens Ladisch <clemens@ladisch.de>,
linux-kernel@vger.kernel.org, alsa-devel@alsa-project.org
Subject: Re: Linux 2.6.38 freeze because of sound/core/pcm_lib.c commit 59ff878ffb26bc0be812ca8295799164f413ae88
Date: Thu, 31 Mar 2011 19:33:42 -0600 [thread overview]
Message-ID: <4D952B76.7000201@silka.with-linux.com> (raw)
In-Reply-To: <4D94F728.60609@silka.with-linux.com>
On 03/31/11 15:50, Kelly Anderson wrote:
>
> Just to let you know. I'm using a gtx460 also. I haven't had a
> chance to reboot into the newly patched kernel yet. It is interesting
> that we both have gtx460's. I have a machine with a gtx430 that
> doesn't seem to exhibit the problem.
>
> cat /etc/modprobe.d/snd_hda_intel.conf
>
> options snd-hda-intel probe_mask=-1,0xa
>
OK, I debugged the problem and came up with a solution. The bottom line
is that it's a problem with a signed to unsigned compare. First the fix:
--- ./sound/core/pcm_lib.c.orig 2011-03-27 12:37:20.000000000 -0600
+++ ./sound/core/pcm_lib.c 2011-03-31 19:01:35.392739127 -0600
@@ -379,17 +379,17 @@ static int snd_pcm_update_hw_ptr0(struct
* Without regular period interrupts, we have to check
* the elapsed time to detect xruns.
*/
- jdelta = jiffies - runtime->hw_ptr_jiffies;
- if (jdelta < runtime->hw_ptr_buffer_jiffies / 2)
+ jdelta = (snd_pcm_sframes_t)(jiffies - runtime->hw_ptr_jiffies);
+ if (jdelta < (snd_pcm_sframes_t)runtime->hw_ptr_buffer_jiffies / 2)
goto no_delta_check;
hdelta = jdelta - delta * HZ / runtime->rate;
- while (hdelta > runtime->hw_ptr_buffer_jiffies / 2 + 1) {
+ while (hdelta >
(snd_pcm_sframes_t)runtime->hw_ptr_buffer_jiffies / 2 + 1) {
delta += runtime->buffer_size;
hw_base += runtime->buffer_size;
if (hw_base >= runtime->boundary)
hw_base = 0;
new_hw_ptr = hw_base + pos;
- hdelta -= runtime->hw_ptr_buffer_jiffies;
+ hdelta -= (snd_pcm_sframes_t)runtime->hw_ptr_buffer_jiffies;
}
goto no_delta_check;
}
And here's the patch I used to debug the problem:
--- ./sound/core/pcm_lib.c.orig 2011-03-27 12:37:20.000000000 -0600
+++ ./sound/core/pcm_lib.c 2011-03-31 18:44:23.701411841 -0600
@@ -379,18 +379,31 @@ static int snd_pcm_update_hw_ptr0(struct
* Without regular period interrupts, we have to check
* the elapsed time to detect xruns.
*/
+ int loopCount = 0;
+ BUG_ON(runtime->hw_ptr_jiffies < 0);
+ BUG_ON(runtime->hw_ptr_jiffies == 0);
+ BUG_ON(runtime->hw_ptr_jiffies > jiffies);
jdelta = jiffies - runtime->hw_ptr_jiffies;
if (jdelta < runtime->hw_ptr_buffer_jiffies / 2)
goto no_delta_check;
hdelta = jdelta - delta * HZ / runtime->rate;
- while (hdelta > runtime->hw_ptr_buffer_jiffies / 2 + 1) {
+ printk(KERN_INFO "Before loop: jdelta=%ld, hdelta=%ld
runtime->hw_ptr_buffer_jiffies=%lu\n"
+ , jdelta , hdelta ,
runtime->hw_ptr_buffer_jiffies);
+ while (hdelta > runtime->hw_ptr_buffer_jiffies / 2 + 1) {
delta += runtime->buffer_size;
hw_base += runtime->buffer_size;
if (hw_base >= runtime->boundary)
hw_base = 0;
new_hw_ptr = hw_base + pos;
- hdelta -= runtime->hw_ptr_buffer_jiffies;
+ hdelta -= runtime->hw_ptr_buffer_jiffies;
+ if (++loopCount >= 1024*1024*4)
+ {
+ printk(KERN_INFO "stopped the madness at 4 thousand\n");
+ break;
+ }
}
+ printk(KERN_INFO "After loop: jdelta=%ld, hdelta=%ld
runtime->hw_ptr_buffer_jiffies=%lu\n"
+ , jdelta , hdelta ,
runtime->hw_ptr_buffer_jiffies);
goto no_delta_check;
}
The kernel output with the testing patch applied:
Mar 31 18:37:02 speedy kernel: Before loop: jdelta=352, hdelta=352
runtime->hw_ptr_buffer_jiffies=371
Mar 31 18:37:02 speedy kernel: stopped the madness at 4 million
Mar 31 18:37:02 speedy kernel: After loop: jdelta=352,
hdelta=-1556086432 runtime->hw_ptr_buffer_jiffies=371
next prev parent reply other threads:[~2011-04-01 1:33 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <AANLkTin17=rCU4eDGYtnVFZ1ffbUn+var4Q_AQUuGKaw@mail.gmail.com>
2011-03-31 11:58 ` Linux 2.6.38 freeze because of sound/core/pcm_lib.c commit 59ff878ffb26bc0be812ca8295799164f413ae88 Clemens Ladisch
2011-03-31 16:09 ` Christopher K.
2011-03-31 21:50 ` Kelly Anderson
2011-04-01 1:33 ` Kelly Anderson [this message]
2011-04-01 3:05 ` Christopher K.
2011-04-01 7:47 ` Clemens Ladisch
2011-04-01 9:10 ` Kelly Anderson
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=4D952B76.7000201@silka.with-linux.com \
--to=kelly@silka.with-linux.com \
--cc=alsa-devel@alsa-project.org \
--cc=c.krooss@googlemail.com \
--cc=clemens@ladisch.de \
--cc=linux-kernel@vger.kernel.org \
/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).