При анализе функции `skel_read()` в `usb-skeleton.c` я заметил нечто похожее на непоследовательную логику повтора. Буду признателен за ваши идеи.
Текущий анализ поведения
Скелетный код работает следующим образом:
Код: Выделить всё
retry:Код: Выделить всё
if (dev->ongoing_read) {Код: Выделить всё
// Check O_NONBLOCK and waitКод: Выделить всё
if (file->f_flags & O_NONBLOCK)Код: Выделить всё
return -EAGAIN;Код: Выделить всё
wait_event_interruptible(dev->bulk_in_wait, (!dev->ongoing_read));Код: Выделить всё
}Код: Выделить всё
Код: Выделить всё
// Copy dataКод: Выделить всё
chunk = min(available, count);Код: Выделить всё
copy_to_user(buffer, dev->bulk_in_buffer, chunk);Код: Выделить всё
Код: Выделить всё
// When data is insufficientКод: Выделить всё
if (available < count) {Код: Выделить всё
usb_do_read_io(dev, count - chunk);Код: Выделить всё
// No goto retry here!Код: Выделить всё
}Код: Выделить всё
return rv;При входе: ожидает `ongoing_read` (или возвращает -EAGAIN, если O_NONBLOCK)
Когда данные < count: отправляет URB, но возвращает немедленно, не дожидаясь
Эти два поведения кажутся противоречиво.
Предлагаемая модификация
Код: Выделить всё
if (available < count) {Код: Выделить всё
usb_do_read_io(dev, count - chunk);Код: Выделить всё
goto retry; //
Подробнее здесь: [url]https://stackoverflow.com/questions/79856796/question-about-retry-logic-in-usb-skeleton-c-skel-read[/url]
Мобильная версия