Hans Verkuil wrote: > > Here's my observation: There was no good reason for q_full to stay > > empty for so long (> 5 seconds), just because data was sitting queued > > in q_io. It was as if data stopped being moved from the encoder to > > buffers and into q_full. What is both fortunate and unfortunate is > > that draining q_full and q_io, seems to restart the transfers from > > the encoder. > >
> > So to test these hypotheses, I'll have to gain some understanding of > > the new mailbox protocol and the Memory Descriptor List stuff and do > > some testing with the fix to cx18_v4l2_enc_poll() backed out. > > Look for 'CX18_CPU_DE_SET_MDL' in cx18-fileops.c: this is where the > processed buffer is returned to the firmware so that it can be used > again. Based on your description I was wondering whether in some cases > all or most buffers are in use and the firmware will just stop > capturing due to a lack of available buffers. Argh. I'm giving up on hunting this down for now. Here are my observations and speculations with the return value of cx18_v4l2_enc_poll() does not depend on q_io.length: a) The most buffers I've ever seen in use in the driver are 1 in q_io and 10 in q_full. That was when then encoder decided to give the driver 10 buffers all at once. (What good is q_io anyway in the cx18 driver? It seems like a lot of book keeping just to store the 1 partially read buffer. Would pushing a partially read buffer back on the head of q_full be that hard?) b) I can always get the transfer from the encoder to stall. c) stopping the capture, reloading all the MDLs and restarting the capture doesn't make transfers from the encoder work again. d) a common sequence of failure looked like the following, with the encoder sending a small (2048 bytes) buffer, the driver returning 2 MDLs very close together, and then the encoder sending only one more buffer: Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: open_id: 7 stream type = 0 Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118 Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: stream buffers 64 buf_size 32768 buffers_stolen 0 Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: stream q_free next 0x21d9bd80 prev 0x21d9ba00 buffers 61 length 2031616 bytesused 0 Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: stream q_full next 0x21d9ba80 prev 0x21d9ba80 buffers 1 length 32768 bytesused 2048 Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: stream q_io next 0x21d9ba40 prev 0x21d9ba40 buffers 1 length 32768 bytesused 30720 Mar 8 19:27:09 palomino kernel: cx180 file: Encoder poll Mar 8 19:27:09 palomino kernel: cx180 file: Post poll_wait Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118 Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: stream buffers 64 buf_size 32768 buffers_stolen 0 Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: stream q_free next 0x21d9bd80 prev 0x21d9ba00 buffers 61 length 2031616 bytesused 0 Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: stream q_full next 0x21d9ba80 prev 0x21d9ba80 buffers 1 length 32768 bytesused 2048 Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: stream q_io next 0x21d9ba40 prev 0x21d9ba40 buffers 1 length 32768 bytesused 30720 Mar 8 19:27:09 palomino kernel: cx180 file: read 4096 bytes from encoder MPEG Mar 8 19:27:09 palomino kernel: cx180 file: read 4096 from encoder MPEG, got 4096 ... Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: open_id: 7 stream type = 0 Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118 Mar 8 19:27:09 palomino kernel: cx180 file: enc_poll: stream buffers 64 buf_size 32768 buffers_stolen 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free next 0x21d9bd80 prev 0x21d9ba00 buffers 61 length 2031616 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full next 0x21d9ba80 prev 0x21d9ba80 buffers 1 length 32768 bytesused 2048 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io next 0x21d9ba40 prev 0x21d9ba40 buffers 1 length 32768 bytesused 6144 Mar 8 19:27:10 palomino kernel: cx180 file: Encoder poll Mar 8 19:27:10 palomino kernel: cx180 file: Post poll_wait Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 buf_size 32768 buffers_stolen 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free next 0x21d9bd80 prev 0x21d9ba00 buffers 61 length 2031616 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full next 0x21d9ba80 prev 0x21d9ba80 buffers 1 length 32768 bytesused 2048 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io next 0x21d9ba40 prev 0x21d9ba40 buffers 1 length 32768 bytesused 6144 Mar 8 19:27:10 palomino kernel: cx180 file: read 4096 bytes from encoder MPEG Mar 8 19:27:10 palomino kernel: cx180 file: read 4096 from encoder MPEG, got 4096 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: open_id: 7 stream type = 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 buf_size 32768 buffers_stolen 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free next 0x21d9bd80 prev 0x21d9ba00 buffers 61 length 2031616 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full next 0x21d9ba80 prev 0x21d9ba80 buffers 1 length 32768 bytesused 2048 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io next 0x21d9ba40 prev 0x21d9ba40 buffers 1 length 32768 bytesused 2048 Mar 8 19:27:10 palomino kernel: cx180 file: Encoder poll Mar 8 19:27:10 palomino kernel: cx180 file: Post poll_wait Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 buf_size 32768 buffers_stolen 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free next 0x21d9bd80 prev 0x21d9ba00 buffers 61 length 2031616 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full next 0x21d9ba80 prev 0x21d9ba80 buffers 1 length 32768 bytesused 2048 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io next 0x21d9ba40 prev 0x21d9ba40 buffers 1 length 32768 bytesused 2048 Mar 8 19:27:10 palomino kernel: cx180 file: read 4096 bytes from encoder MPEG Mar 8 19:27:10 palomino kernel: cx180 api: CX18_CPU_DE_SET_MDL Mar 8 19:27:10 palomino kernel: cx180 api: req: 0x000035ab args: 0x00000001 0x00dc0cc8 0x00000001 0x00000003 0x00008000 Mar 8 19:27:10 palomino kernel: cx180 api: ack: 0x000035ab args: 0x00000001 0x00dc0cc8 0x00000001 0x00000003 0x00008000 0x00000000 error: 0x00000000 Mar 8 19:27:10 palomino kernel: cx180 api: CX18_CPU_DE_SET_MDL Mar 8 19:27:10 palomino kernel: cx180 api: req: 0x000035ac args: 0x00000001 0x00dc0cd0 0x00000001 0x00000004 0x00008000 Mar 8 19:27:10 palomino kernel: cx180 api: ack: 0x000035ac args: 0x00000001 0x00dc0cd0 0x00000001 0x00000004 0x00008000 0x00000000 error: 0x00000000 Mar 8 19:27:10 palomino kernel: cx180 file: read 4096 from encoder MPEG, got 4096 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: open_id: 7 stream type = 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 buf_size 32768 buffers_stolen 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free next 0x21d9bd80 prev 0x21d9ba80 buffers 63 length 2097152 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full next 0xa440208 prev 0xa440208 buffers 0 length 0 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io next 0xa440228 prev 0xa440228 buffers 0 length 0 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: Encoder poll Mar 8 19:27:10 palomino kernel: cx180 file: Post poll_wait Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 buf_size 32768 buffers_stolen 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free next 0x21d9bd80 prev 0x21d9ba80 buffers 63 length 2097152 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full next 0xa440208 prev 0xa440208 buffers 0 length 0 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io next 0xa440228 prev 0xa440228 buffers 0 length 0 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: open_id: 7 stream type = 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 buf_size 32768 buffers_stolen 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free next 0x21d9bd80 prev 0x21d9ba80 buffers 62 length 2064384 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full next 0x21d9bac0 prev 0x21d9bac0 buffers 1 length 32768 bytesused 26624 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io next 0xa440228 prev 0xa440228 buffers 0 length 0 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: Encoder poll Mar 8 19:27:10 palomino kernel: cx180 file: Post poll_wait Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream buffers 64 buf_size 32768 buffers_stolen 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_free next 0x21d9bd80 prev 0x21d9ba80 buffers 62 length 2064384 bytesused 0 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_full next 0x21d9bac0 prev 0x21d9bac0 buffers 1 length 32768 bytesused 26624 Mar 8 19:27:10 palomino kernel: cx180 file: enc_poll: stream q_io next 0xa440228 prev 0xa440228 buffers 0 length 0 bytesused 0 ... Mar 8 19:27:13 palomino kernel: cx180 file: enc_poll: open_id: 7 stream type = 0 Mar 8 19:27:13 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118 Mar 8 19:27:13 palomino kernel: cx180 file: enc_poll: stream buffers 64 buf_size 32768 buffers_stolen 0 Mar 8 19:27:13 palomino kernel: cx180 file: enc_poll: stream q_free next 0x21d9bd80 prev 0x21d9ba80 buffers 62 length 2064384 bytesused 0 Mar 8 19:27:13 palomino kernel: cx180 file: enc_poll: stream q_full next 0xa440208 prev 0xa440208 buffers 0 length 0 bytesused 0 Mar 8 19:27:13 palomino kernel: cx180 file: enc_poll: stream q_io next 0x21d9bac0 prev 0x21d9bac0 buffers 1 length 32768 bytesused 22528 Mar 8 19:27:13 palomino kernel: cx180 file: Encoder poll Mar 8 19:27:13 palomino kernel: cx180 file: Post poll_wait Mar 8 19:27:13 palomino kernel: cx180 file: enc_poll: stream s_flags = 0x118 Mar 8 19:27:13 palomino kernel: cx180 file: enc_poll: stream buffers 64 buf_size 32768 buffers_stolen 0 Mar 8 19:27:13 palomino kernel: cx180 file: enc_poll: stream q_free next 0x21d9bd80 prev 0x21d9ba80 buffers 62 length 2064384 bytesused 0 Mar 8 19:27:13 palomino kernel: cx180 file: enc_poll: stream q_full next 0xa440208 prev 0xa440208 buffers 0 length 0 bytesused 0 Mar 8 19:27:13 palomino kernel: cx180 file: enc_poll: stream q_io next 0x21d9bac0 prev 0x21d9bac0 buffers 1 length 32768 bytesused 22528 Mar 8 19:27:13 palomino kernel: cx18-0 info: close stopping capture Mar 8 19:27:13 palomino kernel: cx18-0 info: close stopping embedded VBI capture I changed the cx18_read() function to exit the loop and return once it had returned 1 MDL to the encoder, but the problem still persisted. In this case the short buffer in at least one trial was 4096 bytes. e) I don't know what to make of it all without some specific commands to query the encoder's status, use of MDLs, and timeouts. I could take a closer look at the MDL acks and the irqs and irq acks, but I'm not that motivated at this point. The driver/encoder transfer performance is good enough for me for now with the return value logic of the cx18_v4l2_enc_poll() function fixed. Regards, Andy _______________________________________________ ivtv-devel mailing list [email protected] http://ivtvdriver.org/mailman/listinfo/ivtv-devel
