Имеется программа захвата изображения с CCDC-матрицы, управляется через NEXTCHIP NVP2120. Захват буфера осуществляется посредством ioctl (captureFd, VIDIOC_DQBUF, &v4l2buf). На ядре 2.6.10 всё работает.
Пробуем использовать ядро 2.6.18 и получаем на этом ioctl "зависание" программы, помогает только прерывание работы по Ctrl-C.
Отслеженная цепочка: ioctl (captureFd, VIDIOC_DQBUF, &v4l2buf) --> videobuf_dqbuf(&vpfe->bufqueue, arg, 0) (файл drivers/media/video/video-buf.c) --> videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr).
videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
Код: Выделить всё
int videobuf_waiton(struct videobuf_buffer *vb, int non_blocking, int intr)
{
int retval = 0;
DECLARE_WAITQUEUE(wait, current);
MAGIC_CHECK(vb->magic,MAGIC_BUFFER);
add_wait_queue(&vb->done, &wait);
dprintk(1, "buffer waiton: after add_wait_queue\n");
while (vb->state == STATE_ACTIVE || vb->state == STATE_QUEUED) {
if (non_blocking) {
retval = -EAGAIN;
break;
}
set_current_state(intr ? TASK_INTERRUPTIBLE
: TASK_UNINTERRUPTIBLE);
dprintk(1, "buffer waiton: after set_current_state\n");
if (vb->state == STATE_ACTIVE || vb->state == STATE_QUEUED)
schedule();
dprintk(1, "buffer waiton: after schedule\n");
set_current_state(TASK_RUNNING);
dprintk(1, "buffer waiton: after set_current_state\n");
if (intr && signal_pending(current)) {
dprintk(1,"buffer waiton: -EINTR\n");
retval = -EINTR;
break;
}
}
remove_wait_queue(&vb->done, &wait);
return retval;
}
Вывод программы
Код: Выделить всё
vbuf: reqbufs: bufs=3, size=0x3f5000 [3039 pages total]
Creating Dmai clvbuf: mmap setup: 3 buffers, 4149248 bytes each
ass!
vbuf: mmap c63f0fe0: q=bf01062c 41334000-41729000 pgoff 00085800 bufs 0-0
vbuf: qbuf: requesting next field
vbuf: qbuf: succeded
vbuf: mmap c63f0fc0: q=bf01062c 41729000-41b1e000 pgoff 00085c00 bufs 1-1
vbuf: qbuf: requesting next field
vbuf: qbuf: succeded
vbuf: mmap c63f0fa0: q=bf01062c 41b1e000-41f13000 pgoff 00084000 bufs 2-2
vbuf: qbuf: requesting next field
vbuf: qbuf: succeded
vbuf: dqbuf: Running...
[Capture thread]vbuf: dqbuf: running list_entry
vbuf: dqbuf: running videobuf_waiton
vbuf: buffer waiton: after add_wait_queue
vbuf: buffer waiton: after set_current_state
vbuf: buffer waiton: after schedule //появляется после Ctrl-C
vbuf: buffer waiton: after set_current_state
vbuf: buffer waiton: -EINTR
vbuf: dqbuf: waiton returned -4
Я перепробовал четыре доступных планировщика: NOOP, AS, DEADLINE и CFQ - везде этот результат.
В чём причина такого поведения?
Спасибо.