Почему память, выделенная dma_alloc_coherent (), дает лучшую производительность? - PullRequest
0 голосов
/ 24 апреля 2019

Я пишу код драйвера для чтения и записи с периферийного устройства AXI LITE.Поскольку AXI LITE является интерфейсом с отображением памяти, я реализую функцию mmap в своем коде драйвера.Я делаю некоторый эксперимент,

  1. выделяя память с помощью API dma_alloc_coherent () и затем сопоставляя ее с пользовательским пространством с помощью API dma_mmap_cohernet () {повышая производительность}.
  2. Яотображение памяти в пространство пользователя с помощью API remap_pfn_range () вместе с API pgprot_noncached (), чтобы избежать проблемы кэширования {из-за низкой производительности}.

Я вижу лучшую производительность при чтении и записи в случаеdma_alloc_coherent () сравнивать с remap_pfn_range ().Но если я удаляю pgprot_noncached () из кода, то производительность памяти, отображаемая с помощью remap_pfn_range, также улучшается, но я вижу несоответствие данных из-за проблемы кэширования.

  1. {обеспечить лучшую производительность}

     virt = dmam_alloc_coherent(dev,size, &phys, GFP_KERNEL);
    
      dma_mmap_coherent(dev, vma, virt, phys, size);
    

2. {обеспечить плохую производительность}

 vma->vm_flags |= VM_IO | VM_DONTDUMP;
  vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
    remap_pfn_range(vma, vma->vm_start, mem->start,>>PAGE_SHIFT, size, vma>vm_page_prot);

Мои сомнения: -

  1. Я не могу понять, почему происходит падение производительности в случае dma_alloc_coherent?

  2. Я предполагаю, что dma_alloc_coherent по умолчанию дает не кэшированную память, в то время как в другом случае мы делаемпамять не кэшируется явно с помощью API pgprot_noncahced ().выполняет ли pgprot_noncached () API некоторую операцию или перевод памяти, что приводит к дополнительным расходам?

...