Commit 01472f19 authored by Benjamin Herrenschmidt's avatar Benjamin Herrenschmidt Committed by Linus Torvalds

[PATCH] dmasound close timeout

The dmasound driver occasionally hangs a process on exit.

Apparently there is a possible case where the sound HW stops draining
output samples and the driver waits forever in its release() callback.
It should check for signals(), but it seems signal_pending() never
returns 1 when the process is beeing killed (implicit release() of files
on exit).

This patch adds a safety timeout to the release() function to make sure
we can at least close the driver.  I'll try to find the reason we aren't
driving samples later, but it is better to have a safety just incase the
sound clock goes berserk for some reason.
parent 0d925852
...@@ -1004,6 +1004,7 @@ static void sq_reset(void) ...@@ -1004,6 +1004,7 @@ static void sq_reset(void)
static int sq_fsync(struct file *filp, struct dentry *dentry) static int sq_fsync(struct file *filp, struct dentry *dentry)
{ {
int rc = 0; int rc = 0;
int timeout = 5;
write_sq.syncing |= 1; write_sq.syncing |= 1;
sq_play(); /* there may be an incomplete frame waiting */ sq_play(); /* there may be an incomplete frame waiting */
...@@ -1018,6 +1019,12 @@ static int sq_fsync(struct file *filp, struct dentry *dentry) ...@@ -1018,6 +1019,12 @@ static int sq_fsync(struct file *filp, struct dentry *dentry)
rc = -EINTR; rc = -EINTR;
break; break;
} }
if (!--timeout) {
printk(KERN_WARNING "dmasound: Timeout draining output\n");
sq_reset_output();
rc = -EIO;
break;
}
} }
/* flag no sync regardless of whether we had a DSP_POST or not */ /* flag no sync regardless of whether we had a DSP_POST or not */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment