Como evitar o alto uso da CPU ao ler/escrever um dispositivo de caracteres?

Como evitar o alto uso da CPU ao ler/escrever um dispositivo de caracteres?

Preciso escrever um driver de kernel Linux para um dispositivo PCIe com SRAM.

Para a primeira tentativa, escrevi um driver para acessar SRAM do PCIe com um dispositivo de caracteres.

Tudo funciona como esperado, mas há um problema. A SRAM é lenta, 1 MB leva cerca de 2 segundos para ler/gravar, esta é uma limitação de hardware. A CPU está 100% ocupada durante a leitura/gravação. Bruxa é um problema. Não preciso de velocidade, a leitura/gravação pode ser lenta, mas por que é preciso tanta CPU?

O buffer é inicializado com pci_iomap:

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

funções de leitura/gravação são assim:

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

A questão é o que posso fazer com alto uso da CPU?

Devo reescrever o driver para usar um dispositivo de bloco em vez de um caractere?

Permitir que a CPU trabalhe em outro processo enquanto lê/salva dados?

informação relacionada