¿Cómo evitar un uso elevado de la CPU al leer/escribir un dispositivo de caracteres?

¿Cómo evitar un uso elevado de la CPU al leer/escribir un dispositivo de caracteres?

Necesito escribir un controlador del kernel de Linux para un dispositivo PCIe con SRAM.

Para el primer intento, escribí un controlador para acceder a SRAM desde PCIe con un dispositivo de caracteres.

Todo funciona como se esperaba, pero hay un problema. La SRAM es lenta. 1 MB tarda aproximadamente 2 segundos en leerse/escribirse; esto es una limitación del hardware. La CPU está 100% ocupada mientras lee/escribe. La bruja es un problema. No necesito velocidad, la lectura/escritura puede ser lenta, pero ¿por qué requiere tanta CPU?

El buffer se inicializa con pci_iomap:

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

Las funciones de lectura/escritura se ven así:

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;
}

La pregunta es ¿qué puedo hacer con un uso elevado de la CPU?

¿Debo reescribir el controlador para usar un dispositivo de bloque en lugar de un carácter?

¿Permitir que la CPU funcione en otro proceso mientras lee/guarda datos?

información relacionada