加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

将Linux IOMMU API与用户空间地址一起使用

发布时间:2020-12-14 01:40:51 所属栏目:Linux 来源:网络整理
导读:我有一个pci设备驱动程序,当前使用dma_map_page将用户空间地址映射到dma地址.这工作正常,但我正在尝试将此端口移植到iommu api以获得使用组和域提供的一些好处. 当前代码:这很好用 ret = get_user_pages_fast(user_addr,one_page,flags,page);dma_addr = dm
我有一个pci设备驱动程序,当前使用dma_map_page将用户空间地址映射到dma地址.这工作正常,但我正在尝试将此端口移植到iommu api以获得使用组和域提供的一些好处.

当前代码:这很好用

ret = get_user_pages_fast(user_addr,one_page,flags,page);
dma_addr = dma_map_page(dev,off,size,*page,DMA_BIDIRECTIONAL);

IOMMU代码:这不起作用

ret = get_user_pages_fast(...);
pfn = page_to_pfn(*page);
group = iommu_group_get(dev);
domain = iommu_domain_alloc(dev->bus);
iommu_attach_device(domain,dev);
iommu_attach_group(domain,group);
iommu_map(domain,iova,pfn << PAGE_SHIFT,IOMMU_READ|IOMMU_WRITE);

所有功能都成功返回,但是当我将iova传递给设备时,设备无法使用它.有没有人曾经使用过iommu,知道我的问题在哪里或者我可以看到哪里?我无法在任何地方找到Linux的iommu实现.

编辑:
dmesg中有一些我第一次错过的条目:

DEBUG: phys addr 0x7738de000
DEBUG: iova 0xdeadb000
DMAR: DRHD: handling fault status reg 2
DMAR: DMAR:[DMA Read] Request device [50:00.0] fault addr 1fdaee4000 
DMAR:[fault reason 06] PTE Read access is not set

解决方法

此类操作具有特权,因为它正在访问页表,或者可能是在任务结构内维护的数据结构.

请检查虚拟机管理程序如何执行此操作或虚拟机处理此类调用.可能存在一些驱动程序接口,其通过管理程序将来自客户操作系统的IOMMU寻呼单元设置.

Hypervisor还以特权模式执行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读