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

virt基础-mdev_parent_ops函数集源码解析-i915

mdev_parent_ops函数集

@linux5.15/drivers/gpu/drm/i915/gvt/kvmgt.c
static struct mdev_parent_ops intel_vgpu_ops = {.mdev_attr_groups       = intel_vgpu_groups,.create			= intel_vgpu_create,.remove			= intel_vgpu_remove,.open_device		= intel_vgpu_open_device,.close_device		= intel_vgpu_close_device,.read			= intel_vgpu_read,.write			= intel_vgpu_write,.mmap			= intel_vgpu_mmap,.ioctl			= intel_vgpu_ioctl,
};
  1. intel_vgpu_create

  2. intel_vgpu_remove

  3. intel_vgpu_open_device

    @linux-5.15.0/drivers/gpu/drm/i915/gvt/kvmgt.c
    static int intel_vgpu_open_device(struct mdev_device *mdev)
    {struct intel_vgpu *vgpu = mdev_get_drvdata(mdev);struct kvmgt_vdev *vdev = kvmgt_vdev(vgpu);unsigned long events;int ret;struct vfio_group *vfio_group;vdev->iommu_notifier.notifier_call = intel_vgpu_iommu_notifier;vdev->group_notifier.notifier_call = intel_vgpu_group_notifier;events = VFIO_IOMMU_NOTIFY_DMA_UNMAP;ret = vfio_register_notifier(mdev_dev(mdev), VFIO_IOMMU_NOTIFY, &events,&vdev->iommu_notifier);if (ret != 0) {gvt_vgpu_err("vfio_register_notifier for iommu failed: %d\n",ret);goto out;}events = VFIO_GROUP_NOTIFY_SET_KVM;ret = vfio_register_notifier(mdev_dev(mdev), VFIO_GROUP_NOTIFY, &events,&vdev->group_notifier);if (ret != 0) {gvt_vgpu_err("vfio_register_notifier for group failed: %d\n",ret);goto undo_iommu;}vfio_group = vfio_group_get_external_user_from_dev(mdev_dev(mdev));if (IS_ERR_OR_NULL(vfio_group)) {ret = !vfio_group ? -EFAULT : PTR_ERR(vfio_group);gvt_vgpu_err("vfio_group_get_external_user_from_dev failed\n");goto undo_register;}vdev->vfio_group = vfio_group;/* Take a module reference as mdev core doesn't take* a reference for vendor driver.*/if (!try_module_get(THIS_MODULE)) {ret = -ENODEV;goto undo_group;}ret = kvmgt_guest_init(mdev);if (ret)goto undo_group;intel_gvt_ops->vgpu_activate(vgpu);atomic_set(&vdev->released, 0);return ret;undo_group:vfio_group_put_external_user(vdev->vfio_group);vdev->vfio_group = NULL;undo_register:vfio_unregister_notifier(mdev_dev(mdev), VFIO_GROUP_NOTIFY,&vdev->group_notifier);undo_iommu:vfio_unregister_notifier(mdev_dev(mdev), VFIO_IOMMU_NOTIFY,&vdev->iommu_notifier);
    out:return ret;
    }
    

    此函数在做管道建立工作,把虚拟机 (KVM)、内存管理 (IOMMU) 和 物理硬件 (GVT) 联系在一起。

    使用场景:当运行qemu-system-x86_64 -device vfio-pci,sysfsdev=/sys/bus/mdev/devices/$UUID,QEMU在初始化PCI设备的过程中,会去打开这个mdev设备。在QEMU启动时,open函数被调用,初始化相关的逻辑放在这里。

  4. intel_vgpu_close_device

  5. intel_vgpu_read

  6. intel_vgpu_write

  7. intel_vgpu_mmap

  8. intel_vgpu_ioctl

    名称 作用
    VFIO_DEVICE_GET_INFO 返回设备的总体特征
    VFIO_DEVICE_GET_REGION_INFO QEMU探测虚拟硬件区域接口,遍历所有的PCI区域
    VFIO_DEVICE_GET_IRQ_INFO 告诉GUEST设备支持哪些中断(INTx或MSI)
    VFIO_DEVICE_SET_IRQS 当GUEST OS的驱动想要注册一个中断处理函数时,QEMU会通过这个ioctl把一个Eventfd(内核事件句柄)传给驱动。物理卡同虚机之间的交互桥梁
    VFIO_DEVICE_RESET 虚拟机重启或驱动崩溃时,QEMU会调用这个命令,清除这个vGPU实例所有的寄存器状态、任务队列和影子页表,确保它回到初始状态

PCI总线中断:

  1. INTx (Legacy Interrupts - 物理连线)
    • 物理形式:在主板上,PCI插槽有4根专门的中断引脚(INTA#, INTB#, INTC#, INTD#)。
    • 工作原理:当设备想发中断时,它会物理性地拉低这根引脚的电平(信号变低)来通知CPU。
  2. MSI / MSI-X (Message Signaled Interrupts - 数据包)
    • 物理形式:没有物理引脚, 中断信号走的是正常的数据传输通道。
    • 工作原理:当设备想发中断时,它直接向内存中的一个特定地址写入一个特定的小数据包(一个 32 位的 Message)。这个写入动作会被芯片识别并转换成一个 CPU 中断。

目前i915和NVIDIA都会先使用MSI/MSI-X方案。

http://www.jsqmd.com/news/652526/

相关文章:

  • 从算法工程师视角拆解:CSDN博客质量分V5.0的迭代逻辑与平滑函数优化
  • GitHub Pages 并发部署与工作流优化终极指南
  • CubeFS元数据备份工具:实现自动化备份的终极指南
  • Gogs数据迁移进阶:如何只迁移数据库或单个仓库?(MySQL/PostgreSQL切换实战)
  • 终极指南:如何用Tweepy和Jupyter Notebook实现交互式Twitter数据分析
  • 革命性窗口管理:智能置顶工具的完全实战指南
  • 终极指南:使用gumbo-parser将HTML转换为JSON的完整教程
  • 破解Nessus10.11.3
  • 从干涉条纹到三维图像:SS-OCT如何实现无创“光学切片”
  • Tsuru多语言应用部署终极指南:7大技术栈适配全攻略
  • 2026年沈阳居家便民服务优质机构参考:家电清洗、热水器、洗衣机、地热、空调、冰箱、油烟机、全屋家电清洗、上门家电清洗、门窗维修、沈阳高益生活覆盖家电清洗与门窗维修全场景 - 海棠依旧大
  • BilibiliDown终极指南:4步轻松下载B站高清视频和音频
  • LinuxCNC终极指南:从零开始掌握开源数控系统
  • 为什么你的RAG应用总被跨租户检索?:深度解析向量数据库权限粒度缺失、元数据标签逃逸与Hybrid Search隔离盲区
  • 终极指南:如何用BilibiliDown轻松下载B站视频和音频
  • 如何将PyPortfolioOpt单元测试覆盖率从80%提升到95%:完整指南
  • 2026年专用钢管领域优质企业参考:注浆钢管、钢花管、管棚管、超前小导管、地质钢管、聊城邦润金属、以靠谱品质适配工程建设需求 - 海棠依旧大
  • Tsuru平台API文档生成终极指南:Swagger与OpenAPI集成完整教程
  • 10大未来发展方向:AnyDoor零样本图像定制技术的全景展望
  • 六通道CAN集线器(协议型)在工业自动化中的关键应用解析
  • 如何在 macOS 中使用 launchd 每分钟执行一次 PHP 脚本
  • CentOS 7下使用宝塔面板快速部署Vtiger CRM系统
  • 银河麒麟V10SP3离线环境踩坑记:源码编译Nginx 1.26.2全流程实录(附依赖库解决方案)
  • VCS仿真器下UVM调试实战:从uvm_hdl_force失败到编译器被kill的五个真实案例复盘
  • 国内4家靠谱美容培训机构推荐|零基础小白入行参考 - 品牌测评鉴赏家
  • 2026届必备的六大AI辅助写作网站实际效果
  • LFM2.5-1.2B-Thinking-GGUF实操手册:tail日志定位llama.cpp加载失败原因
  • Potree安全最佳实践:保护点云数据安全的终极指南
  • PMD教育版详解:如何用静态代码分析工具提升高校代码教学质量
  • 告别logging:用loguru的bind()与parse()实现日志结构化与智能解析