Как избежать высокой загрузки процессора при чтении/записи символьного устройства?

Как избежать высокой загрузки процессора при чтении/записи символьного устройства?

Мне нужно написать драйвер ядра Linux для устройства PCIe со SRAM.

Для первой попытки я написал драйвер для доступа к SRAM из PCIe с помощью символьного устройства.

Все работает как и ожидалось, но есть одна проблема. SRAM медленная, 1 МБ считывается/записывается примерно за 2 секунды, это аппаратное ограничение. Процессор занят на 100% во время чтения/записи. Ведьма — это проблема. Мне не нужна скорость, чтение/запись могут быть медленными, но почему это занимает так много ресурсов процессора?

Буфер инициализируется с помощью pci_iomap:

  g_mmio_buffer[0] = pci_iomap(pdev, SRAM_BAR_H, g_mmio_length);

Функции чтения/записи выглядят так:

static ssize_t dev_read(struct file *fp, char *buf, size_t len, loff_t *off) {
  unsigned long rval;
  size_t copied;

  rval = copy_to_user(buf, g_mmio_buffer[SRAM_BAR] + *off, len);

  if (rval < 0) return -EFAULT;

  copied = len - rval;
  *off += copied;

  return copied;
}

static ssize_t dev_write(struct file *fp, const char *buf, size_t len, loff_t *off) {
  unsigned long rval;
  size_t copied;

  rval = copy_from_user(g_mmio_buffer[SRAM_BAR] + *off, buf, len);

  if (rval < 0) return -EFAULT;

  copied = len - rval;
  *off += copied;

  return copied;
}

Вопрос в том, что можно сделать с высокой загрузкой ЦП?

Стоит ли мне переписать драйвер, чтобы использовать блочное устройство вместо символьного?

Разрешить ЦП работать над другим процессом во время чтения/сохранения данных?

Связанный контент