Package: linux-source-2.6.38
Version: 2.6.38-1
Severity: important
Tags: upstream
[Symptom]
Processes that try to open a cx88-blackbird driven MPEG device will hang up.
[Cause]
Nestet mutex_locks (which are not allowed) result in a deadlock.
[Details]
There has been resent work on removing BKL (BigKernelLock) calls from kernel code. (see http://kernelnewbies.org/BigKernelLock) This was not properly done for the cx88-blackbird driver:
Source-File: drivers/media/video/cx88/cx88-blackbird.c
Function: int mpeg_open(struct file *file)
Problem: the calls to drv->request_acquire(drv); and drv->request_release(drv); will hang because they try to lock a mutex that has already been locked by a previouse call to mutex_lock(&dev->core->lock) ...
1050 static int mpeg_open(struct file *file)
1051 {
[...]
1060 mutex_lock(&dev->core->lock); // MUTEX LOCKED !!!!!!!!!!!!!!!!
1061
1062 /* Make sure we can acquire the hardware */
1063 drv = cx8802_get_driver(dev, CX88_MPEG_BLACKBIRD);
1064 if (drv) {
1065 err = drv->request_acquire(drv); // HANGS !!!!!!!!!!!!!!!!!!!
1066 if(err != 0) {
1067 dprintk(1,"%s: Unable to acquire hardware, %d
", __func__, err);
1068 mutex_unlock(&dev->core->lock);;
1069 return err;
1070 }
1071 }
[...]
Here's the relevant kernel log extract (Linux version 2.6.38-1-amd64 (Debian 2.6.38-1)) ...
Mar 24 21:25:10 xen kernel: [ 241.472067] INFO: task v4l_id:1000 blocked for more than 120 seconds.
Mar 24 21:25:10 xen kernel: [ 241.478845] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Mar 24 21:25:10 xen kernel: [ 241.482412] v4l_id D ffff88006bcb6540 0 1000 1 0x00000000
Mar 24 21:25:10 xen kernel: [ 241.486031] ffff88006bcb6540 0000000000000086 ffff880000000001 ffff88006981c380
Mar 24 21:25:10 xen kernel: [ 241.489694] 0000000000013700 ffff88006be5bfd8 ffff88006be5bfd8 0000000000013700
Mar 24 21:25:10 xen kernel: [ 241.493301] ffff88006bcb6540 ffff88006be5a010 ffff88006bcb6540 000000016be5a000
Mar 24 21:25:10 xen kernel: [ 241.496766] Call Trace:
Mar 24 21:25:10 xen kernel: [ 241.500145] [<ffffffff81321c4a>] ? __mutex_lock_common+0x127/0x193
Mar 24 21:25:10 xen kernel: [ 241.503630] [<ffffffff81321d82>] ? mutex_lock+0x1a/0x33
Mar 24 21:25:10 xen kernel: [ 241.507145] [<ffffffffa09dd155>] ? cx8802_request_acquire+0x66/0xc6 [cx8802]
Mar 24 21:25:10 xen kernel: [ 241.510699] [<ffffffffa0aab7f2>] ? mpeg_open+0x7a/0x1fc [cx88_blackbird]
Mar 24 21:25:10 xen kernel: [ 241.514279] [<ffffffff8123bfb6>] ? kobj_lookup+0x139/0x173
Mar 24 21:25:10 xen kernel: [ 241.517856] [<ffffffffa062d5fd>] ? v4l2_open+0xb3/0xdf [videodev]
Kernel: Linux 2.6.36-trunk-amd64 (SMP w/2 CPU cores)
Locale: LANG=en_US.ISO-8859-15, LC_CTYPE=en_US.ISO-8859-15 (charmap=ISO-8859-15)
Shell: /bin/sh linked to /bin/dash
Versions of packages linux-source-2.6.38 depends on:
ii binutils 2.20.1-16 The GNU assembler, linker and bina
ii bzip2 1.0.5-6 high-quality block-sorting file co
Versions of packages linux-source-2.6.38 recommends:
ii gcc 4:4.4.5-1 The GNU C compiler
ii libc6-dev [libc-dev] 2.11.2-10 Embedded GNU C Library: Developmen
ii make 3.81-8 An utility for Directing compilati
Versions of packages linux-source-2.6.38 suggests:
pn kernel-package <none> (no description available)
ii libncurses5-dev [ncurses- 5.8+20110307-1 developer's libraries for ncurses
pn libqt3-mt-dev <none> (no description available)
-- no debconf information
--
To UNSUBSCRIBE, email to debian-kernel-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: 20110327150610.4029.95961.reportbug@xen.corax.at"> http://lists.debian.org/20110327150610.4029.95961.reportbug@xen.corax.at
On Sun, 2011-03-27 at 17:06 +0200, Huber Andreas wrote:
> Package: linux-source-2.6.38
> Version: 2.6.38-1
> Severity: important
> Tags: upstream
>
>
> [Symptom]
> Processes that try to open a cx88-blackbird driven MPEG device will hang up.
>
> [Cause]
> Nestet mutex_locks (which are not allowed) result in a deadlock.
Could you test whether this patch fixes the problem? Instructions for
rebuilding the kernel package are at
<http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official>.
Ben.
--
Ben Hutchings
Once a job is fouled up, anything done to improve it makes it worse.
>
> On Sun, 2011-03-27 at 17:06 +0200, Huber Andreas wrote:
> > Package: linux-source-2.6.38
> > Version: 2.6.38-1
> > Severity: important
> > Tags: upstream
> >
> >
> > [Symptom]
> > Processes that try to open a cx88-blackbird driven MPEG device will hang up.
> >
> > [Cause]
> > Nestet mutex_locks (which are not allowed) result in a deadlock.
>
> Could you test whether this patch fixes the problem? Instructions for
> rebuilding the kernel package are at
> <http://kernel-handbook.alioth.debian.org/ch-common-tasks.html#s-common-official>.
>
> Ben.
>
Hi Ben, this patch fixes the deadlock during opening of the MPEG device, thanks.
But I did some testing and ran into another deadlock while unloading the
(patched) driver ...
1) booting kernel 2.6.36-trunk-amd64 from debian
both cards are able to stream their mpeg encoded tv streams through
the mpeg devices (in my case /dev/video2 and /dev/video3)
2) after reboot into kernel 2.6.38
/dev/video2 still works fine; tuning to different channels works!
/dev/video3 is inaccessible (after doing exactly the same initialization
as before) ...
dd if=/dev/video3 of=/tmp/test.mpg
dd: reading `/dev/video3': Input/output error
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.74267 s, 0.0 kB/s
Do you think this behavior could be BKL conversion related?
--
To UNSUBSCRIBE, email to debian-kernel-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: loom.20110330T202348-493@post.gmane.org">http://lists.debian.org/loom.20110330T202348-493@post.gmane.org
All mail regarding Debian bugs should be cc'd to the bug address (in
this case, 619827@bugs.debian.org).
I am not going to spend more time trying to fix this, as I don't know
the media/DVB system well and do not have the hardware in question. I
will forward your information to the upstream developers.
Ben.
--
To UNSUBSCRIBE, email to debian-kernel-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: 4D93A59B.2080603@gmx.at">http://lists.debian.org/4D93A59B.2080603@gmx.at
Continuing Ben's work, I fixed all remaining issues.
Patch was uploaded to https://bugzilla.kernel.org/show_bug.cgi?id=31962
Everything works fine for me now.
regards
Andi
--
To UNSUBSCRIBE, email to debian-kernel-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: 4D957020.1040607@gmx.at">http://lists.debian.org/4D957020.1040607@gmx.at
Continuing Ben's work, I fixed all remaining issues.
Patch was uploaded to
https://bugzilla.kernel.org/show_bug.cgi?id=31962
Everything works fine for me now.
regards
Andi
--
To UNSUBSCRIBE, email to debian-kernel-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: loom.20110401T082954-65@post.gmane.org">http://lists.debian.org/loom.20110401T082954-65@post.gmane.org
+ mpeg_dbg(1,"%s active driver references before release attempt: %d
",core->name,core->active_ref);
+
if (drv->advise_release && --core->active_ref == 0)
{
drv->advise_release(drv);
core->active_type_id = CX88_BOARD_NONE;
mpeg_dbg(1,"%s() Post release GPIO=%x
", __func__, cx_read(MO_GP0_IO));
}
+
+ if(core->active_ref<0) core->active_ref=0; // prevent us from getting negative ref counts!
return 0;
}
Tests done on amd64 hardware with 2 Hauppauge HVR1300 TV cards:
Both were independently able to tune channels and stream encoded video through
their MPEG encoder devices.
Andi.
--
To UNSUBSCRIBE, email to debian-kernel-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: http://lists.debian.org/4D9732A3.20204@gmx.at
On Sat, 2011-04-02 at 16:28 +0200, Andreas Huber wrote:
> Jonathan has provided a new patch set. (RFC in progress.)
>
> And while testing it today an unrelated issue occurred which needs to
> be resolved ...
[...]
I'm not going to spend more time looking at this in detail. Please let
us know when a complete fix has been accepted upstream.
Ben.
--
Ben Hutchings
Once a job is fouled up, anything done to improve it makes it worse.
if (drv->advise_release&& --core->active_ref == 0) // REF COUNT MAY BECOME NEGATIVE !!!!!!
{
drv->advise_release(drv);
core->active_type_id = CX88_BOARD_NONE;
mpeg_dbg(1,"%s() Post release GPIO=%x
", __func__, cx_read(MO_GP0_IO));
}
if(core->active_ref<0) core->active_ref=0; // THIS IS A POSSIBLE FIX !!!!!
return 0;
}
please review this simple fix!
regards
Andi
--
To UNSUBSCRIBE, email to debian-kernel-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org
Archive: 4D97646B.1060804@gmx.at">http://lists.debian.org/4D97646B.1060804@gmx.at