Modularizar heaps ION para GKI

Muitos OEMs do Android modificam o driver do kernel ION por vários motivos, como adicionar heaps de fornecedores e personalizar o gerenciamento de cache (para obter detalhes sobre consulte Como integrar a memória ION allocator). Para permitir que OEMs reter essas modificações ao usar a imagem genérica do Kernel (GKI), Android O Common Kernel v5.4 apresenta um framework para modularizar o ION específico do fornecedor heaps, mantendo o driver ION principal integrado. A figura a seguir mostra layout de imagem do kernel.

Heaps ION modulares

Figura 1. Driver de kernel ION modularizado

As heaps ION modulares têm as seguintes vantagens.

  • O driver principal ION pode fazer parte da imagem GKI, permitindo que todos otimizações de desempenho independentes de dispositivo e correções de bug para atingir todos dispositivos.
  • O driver principal ION no kernel comum pode lidar com registro de heap e gerenciar a interface para o espaço do usuário e os clientes kernel. Os módulos de heap do fornecedor são necessárias apenas para implementar as operações personalizadas de heap.
  • O driver principal ION, como parte da GKI, pode incluir ganchos para facilitar a memória. rastreamento de uso, o que não era possível quando cada OEM tinha sua própria versão do do driver ION.
  • Os heaps ION modulares do fornecedor precisam fazer todas as transições futuras para heaps dmabuf mais fácil.
.

Implementação

Os módulos de heap ION podem registrar as próprias operações dmabuf para substituir as registrados pelo driver ION principal. Uma operação dmabuf (como get_flags()) incompatível com o driver ION principal retornará -EOPNOTSUPP se o heap implementação não tem as substituições necessárias.

Para melhorar o desempenho, o driver dmabuf pode executar o cache parcial manutenção (consulte lista de mudanças). Os clientes de kernel podem usar as APIs dma_buf_begin_cpu_access_partial e dma_buf_end_cpu_access_partial para executar a manutenção parcial do cache.

O kernel comum do Android contém implementações modulares do sistema e heaps de alocação de memória contígua (CMA, na sigla em inglês) para uso como referência para heap modularização.

Mudanças no cabeçalho ION UAPI

O cabeçalho da API ION User Space (UAPI) contém um tipo enumerado ion_heap_id para uso no definir um intervalo de IDs de heap para uso pelos heaps do fornecedor.

 /**
 * ion_heap_id - list of heap IDs that Android can use
 *
 * @ION_HEAP_SYSTEM        ID for the ION_HEAP_TYPE_SYSTEM
 * @ION_HEAP_DMA_START     Start of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
 * @ION_HEAP_DMA_END       End of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
 * @ION_HEAP_CUSTOM_START  Start of reserved ID range for heaps of custom type
 * @ION_HEAP_CUSTOM_END    End of reserved ID range for heaps of custom type
 */

enum ion_heap_id {

   ION_HEAP_SYSTEM = (1 << ION_HEAP_TYPE_SYSTEM),

   ION_HEAP_DMA_START = (ION_HEAP_SYSTEM << 1),

   ION_HEAP_DMA_END = (ION_HEAP_DMA_START << 7),
   ION_HEAP_CUSTOM_START = (ION_HEAP_DMA_END << 1),

   ION_HEAP_CUSTOM_END = (ION_HEAP_CUSTOM_START << 22),
};

Além disso, um novo IOCTL (ION_IOC_ABI_VERSION) pode ajudar os clientes do espaço do usuário determinar se heaps modulares estão sendo usados.

Como substituir a heap genérica do sistema

O heap do sistema ION é integrado e faz parte da imagem GKI para garantir que que precisa de acesso a uma heap genérica/independente de dispositivo pode depender da existência deles. Dessa forma, não é possível substituir o ID de heap de ION_HEAP_SYSTEM. Para criar uma heap do sistema personalizada, usar um ID de heap no intervalo personalizado (de ION_HEAP_CUSTOM_START a ION_HEAP_CUSTOM_END) para executar alocações.