When trying to patch up MythTV so that it might work better with the
cx18 driver, I noticed that once select() calls on a cx18 device node
start reporting timeouts when data should be available, select() will
never again report the cx18 device has data ready for read()ing.  This
errant select() behavior persists across device close() and re-open().
I can reliably reproduce this with MythTV.  The funny thing is that
"mplayer /dev/video1" will still work, despite what the select() call
reports to MythTV.  The only way I've found to restore things is to
unload and reload the cx18 module.


Using the attached (very ugly) debug patch to the cx18_v4l2_enc_poll()
function, I found that the MPEG stream's q_full queue has a bytesused
value that takes on ever growing negative values (far beyond -2MB).
This appears to be wrong to me, but I'm not sure.  Is this value
supposed to be negative?

-Andy


Here's the highlights from /var/log/messages with notes or deletions
indicated by ....:

....
Feb 26 23:23:04 palomino kernel: cx18-0: loaded v4l-cx23418-dig.fw firmware 
(16382 bytes)
..... MythTV opens a "chanfd" for control and a "readfd" for reading
Feb 26 23:23:04 palomino kernel: cx18-0 file: open encoder MPEG
Feb 26 23:23:04 palomino last message repeated 2 times
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: open_id: 3  stream type 
= 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x0
Feb 26 23:23:04 palomino kernel: cx18-0 file: Encoder poll started capture
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
.... 64 x 32 kB = 2 MB, that seems correct
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x15f180c0 prev 2395dec0 buffers 64 length 2097152 bytesused 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x8220208 prev 8220208 buffers 0 length 0 bytesused 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x8220228 prev 8220228 buffers 0 length 0 bytesused 0
Feb 26 23:23:04 palomino kernel: cx180 file: Encoder poll
Feb 26 23:23:04 palomino kernel: cx180 file: Post poll_wait
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x15f180c0 prev 2395dec0 buffers 64 length 2097152 bytesused 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x8220208 prev 8220208 buffers 0 length 0 bytesused 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x8220228 prev 8220228 buffers 0 length 0 bytesused 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: open_id: 3  stream type 
= 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x15f180c0 prev 2395dec0 buffers 64 length 2097152 bytesused 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x8220208 prev 8220208 buffers 0 length 0 bytesused 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x8220228 prev 8220228 buffers 0 length 0 bytesused 0
Feb 26 23:23:04 palomino kernel: cx180 file: Encoder poll
Feb 26 23:23:04 palomino kernel: cx180 file: Post poll_wait
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x15f180c0 prev 2395dec0 buffers 64 length 2097152 bytesused 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x8220208 prev 8220208 buffers 0 length 0 bytesused 0
Feb 26 23:23:04 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x8220228 prev 8220228 buffers 0 length 0 bytesused 0
...
Feb 26 23:23:05 palomino kernel: cx180 file: read 4096 bytes from encoder MPEG
Feb 26 23:23:05 palomino kernel: cx180 file: read 4096 from encoder MPEG, got 
4096
Feb 26 23:23:05 palomino kernel: cx180 file: enc_poll: open_id: 3  stream type 
= 0
Feb 26 23:23:05 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:23:05 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:23:05 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x15f18700 prev 2395dec0 buffers 63 length 2064384 bytesused 0
... bytesused = -32 kB ??
Feb 26 23:23:05 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x8220208 prev 8220208 buffers 0 length 0 bytesused -32768
Feb 26 23:23:05 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x15f180c0 prev 15f180c0 buffers 1 length 32768 bytesused 28672
Feb 26 23:23:05 palomino kernel: cx180 file: Encoder poll
Feb 26 23:23:05 palomino kernel: cx180 file: Post poll_wait
Feb 26 23:23:05 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:23:05 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:23:05 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x15f18700 prev 2395dec0 buffers 63 length 2064384 bytesused 0
Feb 26 23:23:05 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x8220208 prev 8220208 buffers 0 length 0 bytesused -32768
Feb 26 23:23:05 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x15f180c0 prev 15f180c0 buffers 1 length 32768 bytesused 28672
...
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: open_id: 3  stream type 
= 0
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x2395dec0 prev 15f18d00 buffers 63 length 2064384 bytesused 0
.... bytesused ~= -86.2 MB ???
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x15f18500 prev 15f18500 buffers 1 length 32768 bytesused -90353664
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x8220228 prev 8220228 buffers 0 length 0 bytesused 0
Feb 26 23:25:27 palomino kernel: cx180 file: Encoder poll
Feb 26 23:25:27 palomino kernel: cx180 file: Post poll_wait
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x2395dec0 prev 15f18d00 buffers 63 length 2064384 bytesused 0
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x15f18500 prev 15f18500 buffers 1 length 32768 bytesused -90353664
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x8220228 prev 8220228 buffers 0 length 0 bytesused 0
Feb 26 23:25:27 palomino kernel: cx180 file: read 4096 bytes from encoder MPEG
Feb 26 23:25:27 palomino kernel: cx180 file: read 4096 from encoder MPEG, got 
4096
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: open_id: 3  stream type 
= 0
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x2395dec0 prev 15f18d00 buffers 63 length 2064384 bytesused 0
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x8220208 prev 8220208 buffers 0 length 0 bytesused -90384384
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x15f18500 prev 15f18500 buffers 1 length 32768 bytesused 26624
Feb 26 23:25:27 palomino kernel: cx180 file: Encoder poll
Feb 26 23:25:27 palomino kernel: cx180 file: Post poll_wait
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x2395dec0 prev 15f18d00 buffers 63 length 2064384 bytesused 0
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x8220208 prev 8220208 buffers 0 length 0 bytesused -90384384
Feb 26 23:25:27 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x15f18500 prev 15f18500 buffers 1 length 32768 bytesused 26624
Feb 26 23:25:30 palomino kernel: cx180 file: enc_poll: open_id: 3  stream type 
= 0
Feb 26 23:25:30 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:25:30 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:25:30 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x2395dec0 prev 15f18d00 buffers 63 length 2064384 bytesused 0
Feb 26 23:25:30 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x8220208 prev 8220208 buffers 0 length 0 bytesused -90384384
Feb 26 23:25:30 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x15f18500 prev 15f18500 buffers 1 length 32768 bytesused 26624
Feb 26 23:25:30 palomino kernel: cx180 file: Encoder poll
Feb 26 23:25:30 palomino kernel: cx180 file: Post poll_wait
Feb 26 23:25:30 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:25:30 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:25:30 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x2395dec0 prev 15f18d00 buffers 63 length 2064384 bytesused 0
Feb 26 23:25:30 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x8220208 prev 8220208 buffers 0 length 0 bytesused -90384384
Feb 26 23:25:30 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x15f18500 prev 15f18500 buffers 1 length 32768 bytesused 26624
.... MythTV closes the device node and reopens it.
Feb 26 23:25:31 palomino kernel: cx18-0 file: open encoder MPEG
Feb 26 23:25:31 palomino kernel: cx180 file: enc_poll: open_id: 4  stream type 
= 0
Feb 26 23:25:31 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x0
Feb 26 23:25:31 palomino kernel: cx18-0 file: Encoder poll started capture
Feb 26 23:25:31 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:25:31 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:25:31 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x2395dec0 prev 15f18500 buffers 64 length 2097152 bytesused 0
Feb 26 23:25:31 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x8220208 prev 8220208 buffers 0 length 0 bytesused -90384384
Feb 26 23:25:31 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x8220228 prev 8220228 buffers 0 length 0 bytesused 0
Feb 26 23:25:31 palomino kernel: cx180 file: Encoder poll
Feb 26 23:25:31 palomino kernel: cx180 file: Post poll_wait
Feb 26 23:25:31 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118
Feb 26 23:25:31 palomino kernel: cx180 file: enc_poll: stream buffers 64 
buf_size 32768 buffers_stolen 0
Feb 26 23:25:31 palomino kernel: cx180 file: enc_poll: stream q_free  next 
0x2395dec0 prev 15f18500 buffers 64 length 2097152 bytesused 0
Feb 26 23:25:31 palomino kernel: cx180 file: enc_poll: stream q_full  next 
0x8220208 prev 8220208 buffers 0 length 0 bytesused -90384384
Feb 26 23:25:31 palomino kernel: cx180 file: enc_poll: stream q_io  next 
0x8220228 prev 8220228 buffers 0 length 0 bytesused 0
...
--- cx18-03d4d8d84c4f/linux/drivers/media/video/cx18/cx18-fileops.c.orig	2008-02-26 22:52:35.000000000 -0500
+++ cx18-03d4d8d84c4f/linux/drivers/media/video/cx18/cx18-fileops.c	2008-02-26 23:20:10.000000000 -0500
@@ -504,6 +504,9 @@ unsigned int cx18_v4l2_enc_poll(struct f
 	struct cx18_stream *s = &cx->streams[id->type];
 	int eof = test_bit(CX18_F_S_STREAMOFF, &s->s_flags);
 
+	CX18_DEBUG_HI_FILE("enc_poll: open_id: %d  stream type = %d\n", id->open_id, id->type);
+	CX18_DEBUG_HI_FILE("enc_poll: stream s_flags = %#0lx\n", s->s_flags);
+	
 	/* Start a capture if there is none */
 	if (!eof && !test_bit(CX18_F_S_STREAMING, &s->s_flags)) {
 		int rc;
@@ -517,12 +520,25 @@ unsigned int cx18_v4l2_enc_poll(struct f
 			return POLLERR;
 		}
 		CX18_DEBUG_FILE("Encoder poll started capture\n");
+		CX18_DEBUG_HI_FILE("enc_poll: stream s_flags = %#0lx\n", s->s_flags);
 	}
 
+	CX18_DEBUG_HI_FILE("enc_poll: stream buffers %d buf_size %d buffers_stolen %d\n", s->buffers, s->buf_size, s->buffers_stolen);
+	CX18_DEBUG_HI_FILE("enc_poll: stream q_free  next %#0x prev %0x buffers %d length %d bytesused %d\n", s->q_free.list.next,  s->q_free.list.prev, s->q_free.buffers, s->q_free.length, s->q_free.bytesused);
+	CX18_DEBUG_HI_FILE("enc_poll: stream q_full  next %#0x prev %0x buffers %d length %d bytesused %d\n", s->q_full.list.next,  s->q_full.list.prev, s->q_full.buffers, s->q_full.length, s->q_full.bytesused);
+	CX18_DEBUG_HI_FILE("enc_poll: stream q_io  next %#0x prev %0x buffers %d length %d bytesused %d\n", s->q_io.list.next,  s->q_io.list.prev, s->q_io.buffers, s->q_io.length, s->q_io.bytesused);
+
 	/* add stream's waitq to the poll list */
 	CX18_DEBUG_HI_FILE("Encoder poll\n");
 	poll_wait(filp, &s->waitq, wait);
 
+	CX18_DEBUG_HI_FILE("Post poll_wait\n");
+	CX18_DEBUG_HI_FILE("enc_poll: stream s_flags = %#0lx\n", s->s_flags);
+	CX18_DEBUG_HI_FILE("enc_poll: stream buffers %d buf_size %d buffers_stolen %d\n", s->buffers, s->buf_size, s->buffers_stolen);
+	CX18_DEBUG_HI_FILE("enc_poll: stream q_free  next %#0x prev %0x buffers %d length %d bytesused %d\n", s->q_free.list.next,  s->q_free.list.prev, s->q_free.buffers, s->q_free.length, s->q_free.bytesused);
+	CX18_DEBUG_HI_FILE("enc_poll: stream q_full  next %#0x prev %0x buffers %d length %d bytesused %d\n", s->q_full.list.next,  s->q_full.list.prev, s->q_full.buffers, s->q_full.length, s->q_full.bytesused);
+	CX18_DEBUG_HI_FILE("enc_poll: stream q_io  next %#0x prev %0x buffers %d length %d bytesused %d\n", s->q_io.list.next,  s->q_io.list.prev, s->q_io.buffers, s->q_io.length, s->q_io.bytesused);
+
 	if (eof || s->q_full.length)
 		return POLLIN | POLLRDNORM;
 	return 0;
_______________________________________________
ivtv-devel mailing list
[email protected]
http://ivtvdriver.org/mailman/listinfo/ivtv-devel

Reply via email to