0xffffffffa92eefb0 <intel_alloc_coherent>: nopl 0x0(%rax,%rax,1) [FTRACE NOP] 0xffffffffa92eefb5 <intel_alloc_coherent+5>: push %rbp 使用swiotlb作为iommu,则是: crash> p dma_ops.alloc $3 = (void ()(struct device *, size_t, dma_addr_t *, gfp_t, unsigned long)) 0xffffffffa...
conststructdma_map_opsintel_dma_ops = {//caq:dma_map_ops 注意与 iommu_ops 区别.alloc = intel_alloc_coherent,//caq:创建一个一致性内存映射,要么nocache,要么soc保证cache一致性.free = intel_free_coherent,//caq:释放一段一致性内存映射,.map_sg = intel_map_sg,//caq:分散聚集io的映射.unmap_...
(dev)//把非acpi上报的dev上搞到iommu中来 | ├─dmar_alloc_pci_notify_info | ├─dmar_pci_bus_add_dev | | ├─for_each_drhd_unit//找到dev的hrhd然后加入 | | | └─dmar_insert_dev_scope | | ├─dmar_iommu_notify_scope_dev | | └─intel_irq_remap_add_device | └─dmar_free_...
还有一个内核参数是nointremap,iommu实现了dma remapping和intr remaping,kvm二者都要用,但DPDK/SPDK用轮询模式,可以不用int remapping功能,那nointremap就派上用场了。
通过DMA写物理地址0x0FEE_XXXX来产生中断,PCI config space中有MSI Address和Data寄存器,驱动配置这两个寄存器,Address寄存器中有Destination ID,表示Local APIC ID,Address寄存器所有字段组合起来就是x0FEE_XXXX,Data寄存器有vector号,表示中断号。 如果request-without-PASID,不进行DMA remapping,并且目的地址是0x0FEE_...
(dev, vma, cpu_addr, size, &ret))returnret;if(off >= nr_pages || vma_pages(vma) > nr_pages -off)return-ENXIO;if(IS_ENABLED(CONFIG_DMA_REMAP) &&is_vmalloc_addr(cpu_addr)) {structpage **pages =dma_common_find_pages(cpu_addr);if(pages)return__iommu_dma_mmap(pages, size, vma...
@@ -1171,3 +1171,8 @@ struct irq_remap_ops intel_irq_remap_ops = { .msi_setup_irq = intel_msi_setup_irq, .alloc_hpet_msi = intel_alloc_hpet_msi, }; int dmar_ir_hotplug(struct dmar_drhd_unit *dmaru, bool insert) { return irq_remapping_enabled ? -ENOSYS : 0; } 33 changes...
DMA Read] Request device [86:00.3] fault addr ffff4000 [ 611.858362] DMAR:[fault reason 02] Present bit in context entry is clear [ 611.860819] IPv6: ADDRCONF(NETDEV_UP): eth3: link is not ready [ 611.860983] dmar: DRHD: handling fault status reg 402 [ 611.860995] dmar: INTR-REMAP...
└─vfio_dma_do_map └─vfio_pin_map_dma └─vfio_iommu_map └─iommu_map └─intel_iommu_map(domain->ops->map) └─domain_pfn_mapping 我们再看内核i40e的代码,它也调用到了domain_pfn_mapping。 i40e_alloc_mapped_page └─dma_map_page └─intel_map_page └─__intel_map_single ├─...
系统I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs()等接口。dma_alloc_coherent()/dma_alloc_attrs()等接口通过 DMA IOMMU 的回调分配内存,并为经过 IOMMU 的 DMA 内存访问准备转换表。之后经过 IOMMU 的 DMA 内存访问所需的...