У меня есть драйвер ядра с устройством 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?