当前位置: 首页 > news >正文

[qemu+kvm]: iommu 开关代码分析

本文介绍pcie/pci设备、platform设备加入iommu group前的代码流程,帮助大伙理解这部分功能。
同时介绍一个guestOS 如何同时使用iommu pcie和 non-iommu pcie

  1. 使用介绍:
  2. 现在qemu支持两个RC:
  • 第一个RC携带iommu attribute:pcie.0
  • 第二个RC不携带iommu attribute:pcie.1
实战: 向guest透传pcie有线网卡,有线网卡使用iommu; 同时向guest透传pcie无线网卡,无线网卡不使用iommu: qemu-system-aarch64-M virt,gic-version=3,accel=kvm,iommu=smmuv3-cpu host-kernel Image_guest-append"root=/dev/vda console=ttyAMA0 init=/sbin/init rootwait rw "-nographic-m10240M-drive file=1.img,if=none,id=drv1,format=raw-device virtio-blk-pci,drive=drv1,bus=pcie.0-device vfio-pci,host=0001:01:00.0,bus=pcie.0-device vfio-pci,host=0002:01:00.0,bus=pcie.1-smp8注:第一个透传pci设备加入bus pcie.0, 第二个透传pci设备加入bus pcie.1
  1. 进入guest查看:
:lspci-vvv//第一个RC pcie.00000:00:00.0Host bridge:Red Hat,Inc.QEMU PCIe Host bridge Subsystem:Red Hat,Inc.QEMU PCIe Host bridge Control:I/O-Mem-BusMaster-SpecCycle-MemWINV-VGASnoop-ParErr-Stepping-SERR-FastB2B-DisINTx-Status:Cap-66MHz-UDF-FastB2B-ParErr-DEVSEL=fast>TAbort-<TAbort-<MAbort->SERR-<PERR-INTx-0000:00:03.0Ethernet controller:Realtek Semiconductor Co.,Ltd.Device8126(rev01)...Interrupt:pin A routed to IRQ35IOMMU group:2//加入iommu groupRegion0:I/O ports at10000[size=256]Region2:Memory at8000000000(64-bit,non-prefetchable)[size=64K]Region4:Memory at8000018000(64-bit,non-prefetchable)[size=16K]...Kernel modules:r8126//第二个RC pcie.10001:00:00.0Host bridge:Red Hat,Inc.QEMU PCIe Host bridge Subsystem:Red Hat,Inc.QEMU PCIe Host bridge Control:I/O-Mem-BusMaster-SpecCycle-MemWINV-VGASnoop-ParErr-Stepping-SERR-FastB2B-DisINTx-Status:Cap-66MHz-UDF-FastB2B-ParErr-DEVSEL=fast>TAbort-<TAbort-<MAbort->SERR-<PERR-INTx-0001:00:01.0Network controller:Realtek Semiconductor Co.,Ltd.RTL8852CE PCIe802.11ax Wireless NetworkController(rev01)...Interrupt:pin A routed to IRQ69// 没有加入iommu groupRegion0:I/O ports at1000[size=256]Region2:Memory at20000000(64-bit,non-prefetchable)[size=1M]...Kernel driver in use:rtl8852ce Kernel modules:rtl8852ce

2. 代码逻辑介绍:
当device和driver 匹配时,内核执行:
device_driver_attach
__driver_probe_device
really_probe

staticintreally_probe(structdevice*dev,structdevice_driver*drv){...if(dev->bus->dma_configure){ret=dev->bus->dma_configure(dev);if(ret)gotopinctrl_bind_failed;}...ret=call_driver_probe(dev,drv);}

在执行driver probe之前, 首先调用dev->bus->dma_configure, dma_configure根据bus type不同而不同

  1. pci bus:
structbus_typepci_bus_type={.name="pci",.match=pci_bus_match,.uevent=pci_uevent,.probe=pci_device_probe,.remove=pci_device_remove,.shutdown=pci_device_shutdown,.dev_groups=pci_dev_groups,.bus_groups=pci_bus_groups,.drv_groups=pci_drv_groups,.pm=PCI_PM_OPS_PTR,.num_vf=pci_bus_num_vf,.dma_configure=pci_dma_configure,.dma_cleanup=pci_dma_cleanup,};EXPORT_SYMBOL(pci_bus_type);
  1. platform bus:
structbus_typeplatform_bus_type={.name="platform",.dev_groups=platform_dev_groups,.match=platform_match,.uevent=platform_uevent,.probe=platform_probe,.remove=platform_remove,.shutdown=platform_shutdown,.dma_configure=platform_dma_configure,.dma_cleanup=platform_dma_cleanup,.pm=&platform_dev_pm_ops,};EXPORT_SYMBOL_GPL(platform_bus_type);

platform bus相对简单,下面以pci bus为例说明:pci_dma_configure

staticintpci_dma_configure(structdevice*dev){structpci_driver*driver=to_pci_driver(dev->driver);structdevice*bridge;intret=0;bridge=pci_get_host_bridge_device(to_pci_dev(dev));if(IS_ENABLED(CONFIG_OF)&&bridge->parent&&bridge->parent->of_node){ret=of_dma_configure(dev,bridge->parent->of_node,true);}elseif(has_acpi_companion(bridge)){structacpi_device*adev=to_acpi_device_node(bridge->fwnode);ret=acpi_dma_configure(dev,acpi_get_dma_attr(adev));}pci_put_host_bridge_device(bridge);if(!ret&&!driver->driver_managed_dma){ret=iommu_device_use_default_domain(dev);if(ret)arch_teardown_dma_ops(dev);}returnret;}

如果是arm平台,更多走基于dtb的解析方式,x86下更多使用acpi table。
注:使用dtb还是acpi table和arch无关。
of_dma_configure:
of_dma_configure_id
of_iommu_configure

intof_iommu_configure(structdevice*dev,structdevice_node*master_np,constu32*id){......if(dev_is_pci(dev)){structof_pci_iommu_alias_infoinfo={.dev=dev,.np=master_np,};err=pci_for_each_dma_alias(to_pci_dev(dev),of_pci_iommu_init,&info);of_pci_check_device_ats(dev,master_np);}else{err=of_iommu_configure_device(master_np,dev,id);}mutex_unlock(&iommu_probe_device_lock);if(err==-ENODEV||err==-EPROBE_DEFER)returnerr;if(err)gotoerr_log;err=iommu_probe_device(dev);......}

如果设备是pcie设备,会走of_pci_iommu_init, dev是设备本身,np是设备父节点(pcie RC)的dtb node,
of_pci_iommu_init:
of_iommu_configure_dev_id

{structof_phandle_argsiommu_spec={.args_count=1};interr;err=of_map_id(master_np,*id,"iommu-map","iommu-map-mask",&iommu_spec.np,iommu_spec.args);if(err)returnerr;err=of_iommu_xlate(dev,&iommu_spec);of_node_put(iommu_spec.np);returnerr;}

在这里进行检索RC的iommu-map做stream ID映射,并且调用of_iommu_xlate将设备对应的stream ID记录到dev->fwspec中。
回到of_iommu_configure:继续调用iommu_probe_device, 调用smmu ops 的attach_dev, 建立STE

结论:

  1. 到这里就明白了,如果是pcie设备,只要设备对应RC dtb有iommu-map node,RC下面的device都使用iommu。
  2. 如果RC没有iommu-map node,也意味着RC没有iommu能力,那么RC下面的EP都不能使用iommu。
http://www.jsqmd.com/news/855028/

相关文章:

  • 【数据结构】顺序表
  • 2026市政地标精神堡垒:发光精神堡垒/商业街精神堡垒/四川交通标识标牌厂家/四川加油站标识标牌/四川加油站灯箱标牌/选择指南 - 优质品牌商家
  • 软考高项案例分析6:项目资源管理
  • 2026年APP广告接入平台技术选型指南:工具APP收益提升/开源广告SDK/微信小程序广告/聚合广告联盟/APP变现/选择指南 - 优质品牌商家
  • 菩瓦纽课业平台:打破教育内卷,让刷题更精准,成长更高效
  • 5015系列圆形连接器选型避坑指南
  • 2025年Gartner中国安全技术成熟度曲线解读:软件供应链安全从“过热”到“落地”的演进之路
  • CANN ops-transformer 的 FlashAttention:把大模型的记忆从 32GB 压到 8GB,怎么做到的
  • 合肥假发店TOP5评测|专业形象管理指南,揭秘靠谱之选! - 行业深度观察C
  • Lua 脚本执行 Redis 队列逻辑出现 ERR 错误怎么排查?
  • 2026年积分兑换柜优质品牌推荐榜:电子去向牌、礼品兑换柜、五育兑换柜、五金电子门牌、人员去向电子牌、会议电子门牌选择指南 - 优质品牌商家
  • 集团化全员学习企业在线学习平台选型指南|政企专属解决方案
  • Seedance2.0内容创作干货!学会这四点教你用 Seedance 2.0 拍出电影感!
  • 2026 运营实战:AI 电商生图能快速上手的工具深度测评,哪款是你的大促生产力?
  • ViMax:AI导演、编剧、制片人一体化——颠覆传统视频制作的智能体革命
  • 2026年开源广告SDK:APP广告变现、APP广告收益提升、APP想接入广告、SDK变现、工具APP收益提升选择指南 - 优质品牌商家
  • 影刀RPA跨境店群自动化实战:Python协同Chromium打破风控“垄断”的高并发调度系统架构
  • 电动汽车创企Fisker破产后,4000名车主自发组建开源汽车公司延续车辆生命。
  • 2026年移动广告联盟TOP5盘点:APP变现、APP商业化变现、APP广告收益提升、APP广告素材合规、APP想接入广告选择指南 - 优质品牌商家
  • 2026年q2物业托管技术全解析:成都清洁外包/成都物业公司/成都物业外包/攀枝花保洁公司/选型与落地核心推荐 - 优质品牌商家
  • # 让工具自己声明并发安全:我把调度逻辑砍到一行
  • DeepSeek RAG场景GPU资源黑洞:向量检索+重排序+生成三阶段显存泄漏的48小时定位实录(含perf脚本)
  • 2026年Q2权威APP变现平台排行:APP商业化变现、APP广告变现、APP广告收益提升、APP广告素材合规选择指南 - 优质品牌商家
  • 百度 Agent 安全中心:构筑企业智能体的安全底座
  • 某消费电子终端上市公司实例:德思特衰减器方案以1/3成本精准复现弱网与WiFi干扰场景
  • Perplexity写作辅助效率翻倍:3个被低估的核心技巧,今天不用明天就落后
  • 初创团队如何利用 Taotoken 以最小成本验证多个大模型能力
  • 别只当题做!我把CTFshow Web信息搜集题(11-20)变成了真实漏洞挖掘指南
  • 覆盖20+省市:合豚无人零售SaaS赋能全渠道零售
  • 避开HFSS优化那些坑:Optimetrics模块5大功能深度解读与常见误区纠正