Вопрос о логике повтора в usb-skeleton.c skel_read()Linux

Ответить
Anonymous
 Вопрос о логике повтора в usb-skeleton.c skel_read()

Сообщение Anonymous »

Я студент бакалавриата по информатике, изучаю драйверы USB-устройств ядра Linux.
При анализе функции `skel_read()` в `usb-skeleton.c` я заметил нечто похожее на непоследовательную логику повтора. Буду признателен за ваши идеи.
Текущий анализ поведения
Скелетный код работает следующим образом:

Код: Выделить всё

    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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»