qemu里pci设备的热插拔

-v0.1 2019.2.17 Sherlock Init
-v0.2 2019.2.21 Sherlock Add all related command

本文讨论linux系统中pci设备直通给qemu中涉及的pci热插拔问题。

场景是一个pcie设备的vf通过vfio直通给qemu使用,这时如果我们在host上通过sysfs把
对应的vf disable掉。

正常来讲,qemu里的vf pci设备会表现为一个pci设备热拔出的行为。与之相对应的设置为:

  1. guest kernel的配置里要打开pci hotplug: CONFIG_HOTPLUG_PCI_PCIE.

  2. guest kernel的启动cmdline里要是能pci native hotplug, 加上pcie_port=native

  3. 启动qemu的时候,需要把直通上来的pci vf挂到一个支持pci热插拔的pci桥下面:
    比如在qemu里挂接一个ioh3420的pci桥,然后再把直通的vf挂在这个桥下。

  4. 本文的测试是在主线linux v5.0-rc6上做的,这个版本有一个pci hotplug的bug,这个
    bug会导致虚拟机里vf无法被热拔。相关的fix补丁已经被pci maintainer ack, 会合
    入v5.1主线版本。如果是在v5.0, 以及之前的内核的版本上测试,需要确认这个补丁
    是否合入:
    [PATCH RESEND] PCI: pciehp: Assign ctrl->slot_ctrl before writing it to hardware

综合以上,如下的qemu启动命令,配合正确的kernel,可以支持qemu里直通vf的pci热拔
操作:(这里已ARM64平台为例)

 qemu-system-aarch64 -machine virt,gic_version=3 -enable-kvm -cpu host \-m 1024 -kernel ./Image -initrd ./minifs.cpio.gz -nographic -append \"rdinit=init console=ttyAMA0 earlycon=pl011,0x9000000 pcie_ports=native" \-device ioh3420,id=root_port \-device vfio-pci,host=0000:75:00.1,bus=root_port

具体可以这样测试:(已HiSilicon D06 zip engine为例)

  1. 在host上把vf和vfio驱动绑定:
 echo 1 > /sys/devices/pci0000:74/0000:74:00.0/0000:75:00.0/sriov_numvfsecho 0000:75:00.1 > /sys/bus/pci/drivers/hisi_zip/unbindecho vfio-pci > /sys/devices/pci0000:74/0000:74:00.0/0000:75:00.1/driver_overrideecho 0000:75:00.1 > /sys/bus/pci/drivers_probe
  1. 启动qemu: 同上面的命令

  2. 在host上disable vf:

 echo 0 > /sys/devices/pci0000:74/0000:74:00.0/0000:75:00.0/sriov_numvfs

可以看到在qemu里,vf表现为一个pci热拔的动作:

    (fix me: add log, 目前看上面的命令会在host上挂住)

为了使得这篇介绍完整,对于qemu里pci设备的热插,可以这样来做:

  1. 启动qemu后按ctrl a + c 进入qemu monitor(启动qemu的时候带ioh3420但是不带VF设备)

  2. 在qemu monitor里: device_add vfio-pci,host=0000:75:00.1,bus=root_port

这样可以把已经和vfio驱动绑定的VF PCI热插到qemu
(fix me: lspci看不到新设备,但是在qemu monitor里info pci可以看到新插入的设备)

qemu里pci设备的热插拔相关推荐

  1. Linux的pcie模拟网卡,Qemu虚拟机pci设备透传——网卡

    在qemu虚拟机中为了提高网络的性能,将本地host端的多余网卡透传到虚拟机中使用. 设备的透传需要主机支持Intel(VT-d)或AMD (IOMMU)硬件虚拟化加速技术 查看是否开启IOMMU1d ...

  2. qemu虚拟化-pci设备模拟

    pci设备算是学习qemu必须要掌握的一类设备的模拟,单独提出来说一下.这里以qemu的pci教学程序为基础讲解,源码路径:hw/misc/edu.c 1.设备的定义 typedef struct { ...

  3. qemu: PCI 设备模拟

    目录 1. PCI设备 2. PCI设备模拟 3. PCI设备中断模拟 1. PCI设备 可以参考 :PCI/PCIe基础--配置空间分布_vc66vcc的博客-CSDN博客_pcie配置空间 2. ...

  4. StratoVirt 中的 PCI 设备热插拔实现

    热插拔即带电插拔,在虚拟化场景下,热插拔就是在虚拟机运行过程中对磁盘网卡等设备进行动态调整. 常见的热插拔机制有 ACPI 机制的热插拔,PCIe-Native 机制的热插拔.ACPI 机制的热插拔依 ...

  5. 使用libvirt和qemu将pci pass through设备添加到虚拟机上

    透传的优势 guest使用透传设备可以获得设备近乎原生的性能, PCI pass-throught设备给动态迁移带来的问题, dest host可能没有同样的硬件. 就算可以模拟一个设备,但是原始设备 ...

  6. QEMU如何虚拟PCI设备

    引子 PCI(PCIE)设备在PC架构中有着举足轻重的地位,了解PCI总线与PCI设备在QEMU中的工作机制有助于我们了解CPU和设备之间的沟通机制,会对PC系统有更全面的认知,同时对virtio设备 ...

  7. VIRTIO PCI 设备

    Virtio的代码主要分两个部分:QEMU和内核驱动程序.Virtio设备的模拟就是通过QEMU完成的,QEMU代码在虚拟机启动之前,创建虚拟设备.虚拟机启动后检测到设备,调用内核的virtio设备驱 ...

  8. linux驱动 pcie 框架_Linux PCI 设备驱动基本框架(二)

    针对相应设备定义描述该PCI设备的数据结构: structdevice_private {/*注册字符驱动和发现PCI设备的时候使用*/ struct pci_dev *my_pdev;// stru ...

  9. Pci设备驱动:设备枚举

    有了设备模型基础及usb设备驱动的基础知识,来了解PCI设备驱动,就相对简单了,因为PCI设备驱动仍然套用了设备驱动模型的方式,用到的仍然是设备模型的相应函数,只是把相应的pci设备挂载到PCI总线的 ...

最新文章

  1. 程序员面试题精选100题(51)-顺时针打印矩阵[算法]
  2. Tensorflow详解保存模型(进阶版一):如何有选择的保存变量
  3. 自己的数字选择控件NumberPicker
  4. GitHub 有望在中国开设子公司?
  5. 为什么要学习Kotlin
  6. 【2017最新题库】通识课尔雅人文的物理学答案题库
  7. 图像特征的特点及其常用的特征提取与匹配方法
  8. 关于字符编码与word微软雅黑字体的抽风浅析
  9. 矢量数据 秦岭淮河_秦岭-淮河一线的大致纬度
  10. Java题 细胞分裂
  11. Arch LinuxLinux引导教程 2021.7.22
  12. Proximity indication
  13. 教务(选课)管理系统
  14. git 常用的命令行
  15. C++ typename详解
  16. 华为电子邮件显示未读邮件1_电子邮件简介已经过去
  17. Java语言程序设计 例题9.8(Fan类)
  18. JavaScript中的 NaN 与 isNaN
  19. linux强行安装软件,linux软件安装
  20. 带nfc 的 android 华为,目前支持NFC的手机这么多,为什么只有小米华为能覆盖这么多城市...

热门文章

  1. 【黑马程序员】20天学会Java-基础阶段笔记
  2. awb入门(1).图像的色彩
  3. java赵云主角兵器谱游戏_赵云赵子龙的外号有哪些?赵云的武器是什么 赵
  4. shellcode加载器
  5. 一文看懂未来加密行业如何应对监管?
  6. Window系统中Hosts文件介绍
  7. 黑苹果gtx1050显卡驱动问题
  8. VC/MFC使用OLE操作 EXCEL
  9. 计算机专业笔记本低压,笔记本win7系统下CPU低压u和标压m的区别对比
  10. 每日获取强智教务系统课表,并发送短信到学生手机!爬虫真牛逼!