背景介绍:

IRQ域层级结构:

在某些架构上,可能有多个中断控制器参与将一个中断从设备传送到目标CPU。

让我们来看看x86平台上典型的中断传递路径吧

Device --> IOAPIC -> Interrupt remapping Controller -> Local APIC -> CPU

涉及到的中断控制器有三个:

  1. IOAPIC 控制器
  2. 中断重映射控制器
  3. Local APIC 控制器

如果是之前就对x86的中断控制器比较熟悉的同学,并且细心的话,会发现我们将 中断重映射控制器 的顺序排在了 Local APIC 控制器 之前。

为了支持这样的硬件拓扑结构,使软件架构与硬件架构相匹配,为每个中断控制器建立一

个irq_domain数据结构,并将这些irq_domain组织成层次结构。linux中断处理子系统有两个很重要的概念就是irq_chip和irq_domain,IOMMU为了支持interrupt remapping也增加了这两个东西。

理解这点非常重要,irq_remap 模块必须按照irq 的子系统方式来实现 irq_chip 和irq_domain.

在建立irq_domain层次结构时,靠近设备的irq_domain为子域,靠近CPU的

irq_domain为父域。所以在上面的例子中,将建立如下的层次结构。

::

    CPU Vector irq_domain (root irq_domain to manage CPU vectors)
^
|
Interrupt Remapping irq_domain (manage irq_remapping entries)
^
|
IOAPIC irq_domain (manage IOAPIC delivery entries/pins)

使用irq_domain层次结构的主要接口有四个:

  1. irq_domain_alloc_irqs(): 分配IRQ描述符和与中断控制器相关的资源来传递这些中断。
  2. irq_domain_free_irqs(): 释放IRQ描述符和与这些中断相关的中断控制器资源。
  3. irq_domain_activate_irq(): 激活中断控制器硬件以传递中断。
  4. irq_domain_deactivate_irq(): 停用中断控制器硬件,停止传递中断。

为了支持irq_domain层次结构,需要做如下修改:

  1. 一个新的字段 'parent' 被添加到irq_domain结构中;它用于维护irq_domain的层次信息。
  2. 一个新的字段 'parent_data' 被添加到irq_data结构中;它用于建立层次结构irq_data以

    匹配irq_domain层次结构。irq_data用于存储irq_domain指针和硬件irq号。
  3. 新的回调被添加到irq_domain_ops结构中,以支持层次结构的irq_domain操作。

在支持分层irq_domain和分层irq_data准备就绪后,为每个中断控制器建立一个irq_domain结

构,并为每个与IRQ相关联的irq_domain分配一个irq_data结构。现在我们可以再进一步支持堆

栈式(层次结构)的irq_chip。也就是说,一个irq_chip与层次结构中的每个irq_data相关联。

一个子irq_chip可以自己或通过与它的父irq_chip合作来实现一个所需的操作。

通过堆栈式的irq_chip,中断控制器驱动只需要处理自己管理的硬件,在需要的时候可以向其父

irq_chip请求服务。所以我们可以实现更简洁的软件架构。

为了让中断控制器驱动程序支持irq_domain层次结构,它需要做到以下几点:

  1. 实现 irq_domain_ops.alloc 和 irq_domain_ops.free
  2. 可选择地实现 irq_domain_ops.activate 和 irq_domain_ops.deactivate.
  3. 可选择地实现一个irq_chip来管理中断控制器硬件。
  4. 不需要实现irq_domain_ops.map和irq_domain_ops.unmap,它们在层次结构

    irq_domain中是不用的。

irq_domain层次结构绝不是x86特有的,大量用于支持其他架构,如ARM、ARM64等。

ir 模块,ir就是interrupt remapping的简写,下同。

//caq:既然是中断ir,那么既要完成irq_domain_ops的实现,又要完成irq_chip的实现,如同背景介绍单元
static struct irq_chip intel_ir_chip = {
.name = "INTEL-IR",
.irq_ack = apic_ack_irq,
.irq_set_affinity = intel_ir_set_affinity,//caq:ir 对irq_chip只实现了部分函数
.irq_compose_msi_msg = intel_ir_compose_msi_msg,
.irq_set_vcpu_affinity = intel_ir_set_vcpu_affinity,
};

而irq_domain的实现如下:

//caq:主要完成irq_domain相关的ops操作
static const struct irq_domain_ops intel_ir_domain_ops = {
.alloc = intel_irq_remapping_alloc,//caq:在某个irq_domain中申请一段irqs
.free = intel_irq_remapping_free,
.activate = intel_irq_remapping_activate,
.deactivate = intel_irq_remapping_deactivate,
};

kvm的物理中断号来自于vfio,vfio_msi_set_vector_signal向系统申请物理中断号,传递给kvm,当外设触发中断后,

IOMMU先处理,再给vcpu所在的物理cpu发起一个物理中断,物理cpu从not-root exit出来,

vfio的vfio_msihandler进行中断处理,通过eventfd给kvm一个信号,

kvm更新VMCS中虚拟中断字段,物理cpu重新enter non-root模式把虚拟中断中断注入。

Interrupt Posting是在Interrupt Remapping的基础上进一步提升了直通设备的中断处理效率,使用Posting模式时,

vcpu可以直接在non-root模式下处理中断而不会被vm-exit到宿主机。

struct pi_desc {
u32 pir[8];//caq:每个bit代表一个vector,一共表示32*8个vector,posting哪个vector,对应bit就置1
union {
struct {
u16 on : 1;//caq:有中断Posting事件
u16 sn : 1;//caq:非紧急中断,是否要立即通知
u16 rsvd_1 : 14;
u8 nv;//caq:nv的值为如下两个
//#define POSTED_INTR_VECTOR 0xf2//caq:当前vcpu正在执行
#define POSTED_INTR_WAKEUP_VECTOR 0xf1//caq:当前vcpu是休眠状态,硬件通知的中断是通知的vcpu所在的物理cpu,物理cpu收到中断事件后需要唤醒vcpu。
u8 rsvd_2;
u32 ndst;
};
u64 control;
};
u32 rsvd[6];
}
SIZE: 64

中断虚拟化的芯片发展路径可以看做:

1、8259虚拟实现,pic/apic虚拟实现,msi/msix的虚拟实现

伴随着的是,用户空间实现中断虚拟化,kvm实现中断虚拟化,最后是在硬件层面实现中断虚拟化。(也就是virtual apic page 来替代 apic-access page 的过程)

调试功能:

打开CONFIG_GENERIC_IRQ_DEBUGFS,可让IRQ子系统的大部分内部结构都在debugfs中暴露出来。

参考资料《Documentation/translations/zh_CN/core-api/irq/irq-domain.rst》

iommu分析之---intel irq remap框架实现的更多相关文章

  1. iommu分析之---intel iommu初始化

    intel 的iommu 是iommu框架的一个实现案例. 由于intel 的iommu 实现得比arm smmv3复杂得多,里面概念也多,所以针对intel 实现的iommu 案例的初始化部分进行一 ...

  2. iommu分析之---DMA remap框架实现

    本文主要介绍iommu的框架.基于4.19.204内核 IOMMU核心框架是管理IOMMU设备的一个通过框架,IOMMU设备通过实现特定的回调函数并将自身注册到IOMMU核心框架中,以此通过IOMMU ...

  3. 【市场调研与分析】Intel发力移动安全领域——By Me at 20140613

                                                    [市场调研与分析]Intel发力移动安全领域                               ...

  4. b2c项目基础架构分析(二)前端框架 以及补漏的第一篇名词解释

    继续上篇,上篇里忘记了也很重要的前端部分,今天的网站基本上是以一个启示页,然后少量的整页切换,大量的浏览器后台调用web服务局部.动态更新页面显示状态这种方式在运作的,从若干年前简单的ajax流行起来 ...

  5. motan源码分析三:与spring框架的结合

    在本文第一章,分析的demo中使用了代码加载的方式加载了相关的类,但在我们的实际工作中,使用spring来加载相关的类的情况会更多,本文将分析一下motan是如何与spring一起协同工作的,主要的原 ...

  6. Android源码分析(三)-----系统框架设计思想

    一 : 术在内而道在外 Android系统的精髓在源码之外,而不在源码之内,代码只是一种实现人类思想的工具,仅此而已...... 近来发现很多关于Android文章都是以源码的方向入手分析Androi ...

  7. 源码分析系列 | 从零开始写MVC框架

    1. 前言 2. 为什么要自己手写框架 3. 简单MVC框架设计思路 4. 课程目标 5. 编码实战 5.1 配置阶段 web.xml配置 config.properties 自定义注解 5.2 初始 ...

  8. 模块化系列教程 | 深入源码分析阿里JarsLink1.0模块化框架

    1. 概述 1.1 模块动态加载卸载主流程 2. 模块动态加载 2.1 模块加载源码分析 2.1.1 AbstractModuleRefreshScheduler 2.1.2 ModuleLoader ...

  9. LCD驱动分析(一)字符设备驱动框架分析

    参考:S3C2440 LCD驱动(FrameBuffer)实例开发<一>   S3C2440 LCD驱动(FrameBuffer)实例开发<二> LCD驱动也是字符设备驱动,也 ...

随机推荐

  1. Dubbo本地存根是什么,Dubbo本地伪装又是什么?

    真正的大师永远怀着一颗学徒的心 哈喽!大家好,我是小奇,一位程序员界的学徒 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 前言 书接上回,昨天打了 ...

  2. 30款提升组织效能 SaaS 工具,我们的宝藏工具箱大公开

    熟悉 Juicedata 的小伙伴知道,从2017年成立到第一款产品发布.从寻找PMF(Product Market Fit) 到开源,我们一直保持着一个精简的团队配置,不少人都很好奇我们是如何做到的 ...

  3. JAVA学习之第一个HelloWorld程序

    第一个HelloWorld程序 第一步,创建java类型的文件 第二步,在创建文件的目录中打开cmd窗口 第三步,使用javac 命令将java文件编译为.class类型的字节码文件 第四步,使用ja ...

  4. 【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()

    问题描述 算法 Algorithms (第四版)书中,第1章:基础编程模型第15题: 结果: 编写一个静态方法 histogram(), 接受一个整型数组a[] 和一个整数M为参数,并返回一个大小为M ...

  5. ReentrantLock源码详解

    前言 以前只知道ReentrantLock底层基于AQS实现,相对于(旧版本的)synchronized: 更轻量(基于CAS而不是管程),由JDK实现 可以实现公平/非公平 可中断等待 可绑定多个条 ...

  6. 基于ABP实现DDD--领域服务、应用服务和DTO实践

      什么是领域服务呢?领域服务就是领域对象本身的服务,通常是通过多个聚合以实现单个聚合无法处理的逻辑. 一.领域服务实践 接下来将聚合根Issue中的AssignToAsync()方法[将问题分配给用 ...

  7. 【亲测有效】Tecnomatix PDPS 软件安装及常见问题!附授权文件

    据说,每个学习 Siemens PLM 仿真的同学,都要先被 TecnoMatix PDPS 软件的安装给折磨过! 经过几天的安装过程,果然,此话不虚~~~ 把自己的安装步骤贴出来,免得大家再走弯路. ...

  8. Operating System_via牛客网

    题目 链接:https://ac.nowcoder.com/acm/contest/28537/F 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语 ...

  9. N皇后的位运算有感

    N皇后很明显是一个NP-Hard问题,如果n足够大的话,在有限较短的时间内是很难得出答案的,但是注意到N皇后(笔者认为这类问题称为棋盘问题更为贴切),在n*n棋盘之上,每个点有且只有两种状态,这与电脑 ...

  10. ZooKeeper3.4.10集群安装配置-Docker

    一. 服务器规划 主机 IP 端口 备注 b-mid-24 172.16.0.24 2181, 2888, 3888 2181:对cline端提供服务 3888:选举leader使用 2888:集群内 ...