Как правильно поддерживать функцию приостановки / возобновления ядра в драйвере ядра? - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть драйвер ядра с устройством char:

static const struct file_operations xxxxx_fops = {
    .owner = THIS_MODULE,
    .read = xxxxx_read,
};

Обратный вызов чтения на этом устройстве char:

static int XXXX_read(struct file *filp, char __user *data, size_t len, loff_t *ppos)
{
    int err = 0;
    int retry = 0;

    do {
        if (retry == 5) return -3;
        err = down_interruptible(&priv.XXXX_sem);
        if (err == 0) {
            retry = 0;
            break;
        } else {
            retry++;
            continue;
        }
    } while (1);

    err = copy_to_user(data, &priv.XXXX_queue[priv.XXXX_read_offset], XXXX_TOTAL_SIZE);
    priv.XXXXX_read_offset += XXXXX_TOTAL_SIZE;
    if (priv.XXXX_read_offset == XXXX_QUEUE_SIZE) priv.XXXX_read_offset = 0;
    if (err) printk ("Error during XXXX copy\n");
    return (XXXX_TOTAL_SIZE - err);
};

В своем коде пользователя я открываю устройство char и использую вызов read в al oop:

(...)
while (1)
{
    err = read (fd, &ctx->xxxx_queue[xxxxx_offset], XXXX_TOTAL);
    if (err != XXXX_TOTAL)
    {
        PRINT_WARN ("XXXX read byte : %d (errno : %d)", err, errno);
        continue;
    }
    (...)
}
(...)

Все работает нормально.

Когда я использовал функцию приостановки из ядра, вызвав: echo mem> / sys / power / состояние , возникла проблема при возобновлении: XXXX байт чтения: -1 (errno: 3) В данный момент большую часть времени мой обратный вызов чтения драйвера является блоком ожидания семафора ( down_interruptible) )

Чтение возврата -1 при возобновлении ядра. Есть ли способ избежать этого? Я пытался найти обратный вызов приостановить / возобновить, чтобы объявить на struct file_operations, но ничего. Должен ли я просто игнорировать ошибку -3 для ioctl?

...