首页 > 其他分享 >System Suspend and Device Interrupts 【ChatGPT】

System Suspend and Device Interrupts 【ChatGPT】

时间:2023-12-12 16:57:21浏览次数:26  
标签:Suspend NO 中断 IRQ Interrupts SUSPEND Device 唤醒 IRQF

系统挂起和设备中断

版权

© 2014 Intel Corp. 作者:Rafael J. Wysocki [email protected]

挂起和恢复设备中断

在系统挂起后(即在所有设备的->prepare、->suspend和->suspend_late回调已经执行完毕之后),通常会禁用设备中断请求线(IRQs)。这是通过suspend_device_irqs()来实现的。

这样做的理由是,在设备挂起的“晚期”阶段之后,暂停设备的任何中断触发都没有合法的理由,如果有任何设备尚未正确挂起,最好也阻止来自它们的中断。此外,在过去,我们曾遇到过共享IRQ的中断处理程序在设备挂起后未能准备好处理中断触发的问题。在某些情况下,它们会尝试访问已挂起设备的内存地址空间,导致结果不可预测的行为。不幸的是,这类问题非常难以调试,引入suspend_device_irqs()以及设备挂起和恢复的“noirq”阶段是缓解这些问题的唯一实际方法。

在系统恢复期间,设备中断会在“早期”阶段(即在开始执行设备的->resume_early回调之前)重新启用。执行此操作的函数是resume_device_irqs()。

IRQF_NO_SUSPEND标志

有些中断在整个系统挂起-恢复周期中都可以合法触发,包括设备挂起和恢复的“noirq”阶段,以及非引导CPU被下线和重新上线的时间。这主要适用于定时器中断,同时也适用于IPI和一些其他特殊用途的中断。

当请求特殊用途的中断时,IRQF_NO_SUSPEND标志用于向IRQ子系统指示这一点。它导致suspend_device_irqs()保持相应的IRQ启用,以便在挂起-恢复周期中使中断按预期工作,但并不保证中断会唤醒系统从挂起状态唤醒--对于这种情况,需要使用enable_irq_wake()。

请注意,IRQF_NO_SUSPEND标志影响整个IRQ,而不仅仅是它的一个用户。因此,如果IRQ是共享的,即使某些IRQ的用户没有将IRQF_NO_SUSPEND标志传递给request_irq()(或等效的函数),在suspend_device_irqs()之后仍将像往常一样执行为其安装的所有中断处理程序。因此,应避免同时使用IRQF_NO_SUSPEND和IRQF_SHARED。

系统唤醒中断、enable_irq_wake()和disable_irq_wake()

系统唤醒中断通常需要配置为从睡眠状态唤醒系统,特别是如果它们在工作状态中用于不同目的(例如作为I/O中断)。

这可能涉及在平台内部(如SoC)启用特殊的信号处理逻辑,以便在系统睡眠期间从给定线路接收的信号以不同的方式路由,以在需要时触发系统唤醒。例如,平台可能包括一个专用的中断控制器,专门用于处理系统唤醒事件。然后,如果给定的中断线路应该从睡眠状态唤醒系统,那么该中断控制器的相应输入需要被启用,以接收来自相关线路的信号。唤醒后,通常最好禁用该输入,以防止专用控制器不必要地触发中断。

IRQ子系统提供了两个辅助函数供设备驱动程序用于这些目的。即enable_irq_wake()用于启用平台处理给定IRQ作为系统唤醒中断线路的逻辑,而disable_irq_wake()用于关闭该逻辑。

调用enable_irq_wake()会导致suspend_device_irqs()以特殊方式处理给定的IRQ。即,IRQ保持启用,但在第一个中断时将被禁用,并标记为挂起,以便在随后的系统恢复期间由resume_device_irqs()重新启用。此外,PM核心会收到有关导致正在进行的系统挂起中止的事件的通知(这不一定会立即发生,而是在挂起线程寻找挂起唤醒事件的某个点上)。

这样,来自唤醒中断源的每个中断都会导致当前正在进行的系统挂起被中止,或者如果已经挂起,则唤醒系统。但是,在suspend_device_irqs()之后,系统唤醒IRQ的中断处理程序不会被执行。此时,它们只会为IRQF_NO_SUSPEND的IRQ执行,但这些IRQ不应使用enable_irq_wake()配置为系统唤醒。

中断和挂起到空闲状态

挂起到空闲状态(也称为“冻结”睡眠状态)是一种相对较新的系统睡眠状态,它通过使所有处理器处于空闲状态并在挂起设备的“noirq”阶段后等待中断来工作。

当然,这意味着所有设置了IRQF_NO_SUSPEND标志的中断都会在该状态下唤醒CPU,但它们不会导致IRQ子系统触发系统唤醒。

系统唤醒中断,反过来,将触发从挂起到空闲状态的唤醒,类似于它们在完全系统挂起情况下的作用。唯一的区别是,从挂起到空闲状态的唤醒是使用通常的工作状态中断传递机制进行信号传递的,并不需要平台使用任何特殊的中断处理逻辑来使其工作。

IRQF_NO_SUSPEND和enable_irq_wake()

几乎没有什么有效的理由同时在同一个IRQ上使用enable_irq_wake()和IRQF_NO_SUSPEND标志,而且在同一个设备上同时使用两者是无效的。

首先,如果IRQ不是共享的,处理IRQF_NO_SUSPEND中断的规则(在suspend_device_irqs()之后调用中断处理程序)与处理系统唤醒中断的规则(在suspend_device_irqs()之后不调用中断处理程序)直接相矛盾。

其次,enable_irq_wake()和IRQF_NO_SUSPEND都适用于整个IRQ,而不是单个中断处理程序,因此在系统唤醒中断源和IRQF_NO_SUSPEND中断源之间共享IRQ通常是没有意义的。

在极少数情况下,一个IRQ可以在唤醒设备驱动程序和使用IRQF_NO_SUSPEND的用户之间共享。为了确保安全,唤醒设备驱动程序必须能够区分虚假的中断和真正的唤醒事件(通过向核心发出pm_system_wakeup()信号),必须使用enable_irq_wake()来确保IRQ将作为唤醒源进行功能,并且必须使用IRQF_COND_SUSPEND请求IRQ以告知核心它满足这些要求。如果这些要求不满足,就不能使用IRQF_COND_SUSPEND。

标签:Suspend,NO,中断,IRQ,Interrupts,SUSPEND,Device,唤醒,IRQF
From: https://www.cnblogs.com/pengdonglin137/p/17895816.html

相关文章

  • Multi Fabrics/Admin - How to add the second controller to end device.
    HardwareRequired•  RaspberryPi4•  2xSilabsThunderboardSense2(TBS2--BRD4166A)•  AUbuntuLinuxdevelopmentenvironmentoraVirtualMachineused tobuildtheMatterenddevicefirmware.ConnectionsRequired•  Ethernet......
  • Linux“No space left on device”系统磁盘空间不足问题排查处理
    Linux“Nospaceleftondevice”系统磁盘空间不足问题排查处理目录Linux“Nospaceleftondevice”系统磁盘空间不足问题排查处理1问题2排查和处理2.1第一次排查处理2.2第二次排查处理1问题今天项目测试环境自动发版失败,确认日志发现提示磁盘空间不足,不能正常生成war......
  • xv6 device driver
    Interruptsanddevicedrivers驱动程序是操作系统中管理特定设备的代码:它配置设备硬件,告诉设备执行操作,处理由此产生的中断,并与可能等待设备I/O的进程进行交互。驱动程序需要与它所管理的设备并发执行并且必须理解设备的硬件接口,编写代码可能很棘手。设备通常可以产生中断,内核......
  • Device /dev/sdc excluded by a filter ?
    如何解决报错:Device/dev/sdcexcludedbyafilter$lsblk-d-oname,rotaNAMEROTAsda1sdb1sdc1sr01$grep^/sys/block/*/queue/rotational/sys/block/sda/queue/rotational:1/sys/block/sdb/queue/rotational:1/sys/block/sdc/queue/rotation......
  • 文件 inode 与 no space left on device 异常
    转载请注明出处:文件inode在Linux文件系统中,每一个文件或目录都会有一个inode,它是一个数据结构,用于存储文件的元数据,比如文件的权限、所有者、大小、创建和修改的时间等。inode不包含文件的实际内容,只包含文件的元数据。当你在文件系统中创建、修改或者删除文件时,实际上是在修......
  • 执行历史和suspend的快捷方式
    执行历史:感叹号+历史序号  suspend:ctrl+z是suspendfg+suspend序号回到前台 输入bg查询后台的程序 ......
  • dvwa解题(1)Ping a device
    选择上来先看sourceLOW<?php//检查是否提交了表单if(isset($_POST['Submit'])){//获取输入的目标IP地址$target=$_REQUEST['ip'];//确定操作系统并执行ping命令if(stristr(php_uname('s'),'WindowsNT')){//如果是W......
  • DEVICENET 从站转 MODBUS-TCP 网关操作案例
    兴达易控DEVICENET从站转MODBUS-TCP网关操作案例兴达易控DEVICENET从站转MODBUS-TCP网关(XD-ETHDE20)是一款DEVICENET从站功能的通讯网关。该产品主要功能是将DEVICENET总线和MODBUS-TCP网络连接起来。兴达易控DEVICENET从站转MODBUS-TCP网关连接到DEVICENET总......
  • 使用MediaDevices接口实现录屏技术
    摘要:本文将介绍如何使用JavaScript的MediaDevices接口实现录屏功能。我们将通过WebRTC技术捕获用户的屏幕或摄像头画面,并将其编码为MP4视频文件。在线录屏是指在互联网上进行屏幕录制的过程。它允许用户通过网络连接,将自己的屏幕活动记录下来,并可以在需要时进行播放、共享或存档......
  • kubernetes container device interface (CDI)
    CDI是什么?ContainerDeviceInterface(CDI)是一个提议的标准,它定义了如何在容器运行时环境中向容器提供设备。这个提议的目的是使得设备供应商能够更容易地将其设备集成到Kubernetes集群中,而不必修改Kubernetes核心代码。CDI插件通常负责:配置设备以供容器使用(例如,分配......