IO的中断返回也是相当让人激动的一件事情:

28470  1)               |        handle_irq() {
 28471  1)   0.237 us    |          irq_to_desc();
 28472  1)               |          handle_edge_irq() {
 28473  1)   0.060 us    |            _raw_spin_lock();
 28474  1)               |            ack_apic_edge() {
 28475  1)   0.051 us    |              irq_complete_move();
 28476  1)   0.044 us    |              irq_move_irq();
 28477  1)   1.288 us    |            }
 28478  1)               |            handle_irq_event() {
 28479  1)   0.045 us    |              _raw_spin_unlock();
 28480  1)               |              handle_irq_event_percpu() {
 28481  1)               |                ahci_interrupt [libahci]() {
 28482  1)   0.046 us    |                  _raw_spin_lock();
 28483  1)               |                  ahci_handle_port_interrupt [libahci]() {
 28484  1)               |                    ata_qc_complete_multiple() {        // qc = ata_qc_from_tag(ap, tag); (会得到最终的command)
 28485  1)               |                      ata_qc_complete() {
 28486  1)               |                        __ata_qc_complete() {
 28487  1)   0.321 us    |                          ata_sg_clean();
 28488  1)               |                          ata_scsi_qc_complete() {
 28489  1)               |                            scsi_done() {
 28490  1)               |                              blk_complete_request() {
 28491  1)               |                                __blk_complete_request() {
 28492  1)   0.046 us    |                                  cpus_share_cache();
 28493  1)   0.588 us    |                                }
 28494  1)   0.961 us    |                              }
 28495  1)   1.342 us    |                            }
 28496  1)   0.051 us    |                            ata_qc_free();
 28497  1)   2.146 us    |                          }
 28498  1)   3.

上面是我lenovo笔记本上ATA硬盘中断返回的代码, 其中断处理函数是ata_qc_complete,

发现, 环环相扣的结构体,从中断的scsi指令,我们能追溯到block层封装的request, 然后把这个request放到软中断中去了, 然后该赢中断平安返回,

下面就是软中断处理主场了!

28512  1)               |        irq_exit() {
 28513  1)               |          __do_softirq() {
 28514  1)   0.044 us    |            msecs_to_jiffies();
 28515  1)               |            blk_done_softirq() {
 28516  1)               |              scsi_softirq_done() {
 28517  1)               |                scsi_decide_disposition() {
 28518  1)   0.125 us    |                  scsi_handle_queue_ramp_up();
 28519  1)   0.563 us    |                }
 28520  1)   0.070 us    |                scsi_log_completion();
 28521  1)               |                scsi_finish_command() {
 28522  1)               |                  scsi_device_unbusy() {
 28523  1)   0.044 us    |                    _raw_spin_lock_irqsave();
 28524  1)   0.042 us    |                    _raw_spin_unlock();
 28525  1)   0.049 us    |                    _raw_spin_lock();
 28526  1)   0.059 us    |                    _raw_spin_unlock_irqrestore();
 28527  1)   1.474 us    |                  }
 28528  1)   0.086 us    |                  sd_done();
 28529  1)               |                  scsi_io_completion() {
 28530  1)               |                    blk_end_request() {
 28531  1)               |                      blk_end_bidi_request() {
 28532  1)               |                        blk_update_bidi_request() {
 28533  1)               |                          blk_update_request() {
 28534  1)   0.154 us    |                            blk_account_io_completion();
 28535  1)   0.132 us    |                            bio_advance();
 28536  1)               |                            bio_endio() {

IO调度器(二) IO的中断返回的更多相关文章

  1. IO调度器原理介绍

    IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...

  2. Linux IO调度器相关算法介绍(转)

    IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...

  3. Linux IO Scheduler(Linux IO 调度器)

    每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...

  4. Linux IO 调度器

    Linux IO Scheduler(Linux IO 调度器) 每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交 ...

  5. Linux IO Scheduler(Linux IO 调度器)【转】

    每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...

  6. 编写简单的ramdisk(选择IO调度器)

    前言 目前linux中包含anticipatory.cfq.deadline和noop这4个I/O调度器.2.6.18之前的linux默认使用anticipatory,而之后的默认使用cfq.我们在前 ...

  7. IO调度器

    由于对blktrace的好奇,来到了block层.通过阅读block层的代码,自己的几个错误认知被纠正,比如 一) 同步操作时,进程是在驱动中睡觉真实情况是:进程在文件系统睡觉 二) 对同一个数据块的 ...

  8. 如何选择IO调度器

    概述 由于对multi-quque的IO调度算法不太熟悉,为了避免误人子弟,本文暂时只会介绍如何选择single-queue的IO调度算法.等将来对multi-queue有充分认识后再补充. 如果不清 ...

  9. Linux I/O 调度器

    每个块设备或者块设备的分区,都对应有自身的请求队列,  而每个请求队列都可以选择一个I/O调度器来协调所递交的.I/O调度器的基本目的是将请求按照它们对应在块设备上的扇区号进行排列,以减少磁头的移动, ...

随机推荐

  1. iOS tableView 静态单元格的实现

    本文转自:http://home.cnblogs.com/u/wendingding/ iOS开发UI篇—简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一 ...

  2. rabbitmq_management 安装失败

    安装rabbitmq_management的时候出现错误 不能连接rabbit,所以查看状态 看意思感觉好像是rabbit没有运行,但是安装的时候都是默认安装的,所以安装完以后服务的名字就是Rabbi ...

  3. msbuild ConfuserEx.Build 加密

    https://www.nuget.org/packages/ConfuserEx.Build/ <?xml version="1.0" encoding="utf ...

  4. jQuery代码优化:事件委托篇

    推荐阅读原文:http://www.ituring.com.cn/article/467# 推荐11收藏 随着DOM结构的复杂化和Ajax等动态脚本技术的运用,事件委托自然浮出了水面.jQuery为绑 ...

  5. yii2 输出xml格式数据

    作者:白狼 出处:http://www.manks.top/yii2_xml_response.html.html本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文 ...

  6. ksvcreate: Process(m000) creation failed

    一测试服务器数据库(Oracle Database 10g Release 10.2.0.5.0 - 64bit Production)突然访问不了,检查发现数据库处于挂起模式(hang mode), ...

  7. ERROR [org.apache.hadoop.security.UserGroupInformation] - PriviledgedActionExcep

    换了个环境,出现此异常 016-10-18 23:54:01,334 WARN [org.apache.hadoop.util.NativeCodeLoader] - Unable to load n ...

  8. InnoDB的WAL方式学习

    之前写过一篇博文,<不好的MySQL过程编写习惯>(http://www.cnblogs.com/wingsless/p/5041838.html).这篇博文里强调了不要循环的提交事务,尽 ...

  9. Javascript Function()中的降龙十八掌

    原文地址:http://tutorialzine.com/2014/08/what-does-this-function-do/ 下面列出十八个JS function,看你知道这些函数是干嘛用的,你能 ...

  10. DuiLib学习笔记(二) 扩展CScrollbar属性

    DuiLib学习笔记(二) 扩展CScrollbar属性 Duilib的滚动条滑块默认最小值为滚动条的高度(HScrollbar)或者宽度(VScrollbar).并且这个值默认为16.当采用系统样式 ...