IO调度器(二) IO的中断返回
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的中断返回的更多相关文章
- IO调度器原理介绍
IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...
- Linux IO调度器相关算法介绍(转)
IO调度器(IO Scheduler)是操作系统用来决定块设备上IO操作提交顺序的方法.存在的目的有两个,一是提高IO吞吐量,二是降低IO响应时间.然而IO吞吐量和IO响应时间往往是矛盾的,为了尽量平 ...
- Linux IO Scheduler(Linux IO 调度器)
每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...
- Linux IO 调度器
Linux IO Scheduler(Linux IO 调度器) 每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交 ...
- Linux IO Scheduler(Linux IO 调度器)【转】
每个块设备或者块设备的分区,都对应有自身的请求队列(request_queue),而每个请求队列都可以选择一个I/O调度器来协调所递交的request.I/O调度器的基本目的是将请求按照它们对应在块设 ...
- 编写简单的ramdisk(选择IO调度器)
前言 目前linux中包含anticipatory.cfq.deadline和noop这4个I/O调度器.2.6.18之前的linux默认使用anticipatory,而之后的默认使用cfq.我们在前 ...
- IO调度器
由于对blktrace的好奇,来到了block层.通过阅读block层的代码,自己的几个错误认知被纠正,比如 一) 同步操作时,进程是在驱动中睡觉真实情况是:进程在文件系统睡觉 二) 对同一个数据块的 ...
- 如何选择IO调度器
概述 由于对multi-quque的IO调度算法不太熟悉,为了避免误人子弟,本文暂时只会介绍如何选择single-queue的IO调度算法.等将来对multi-queue有充分认识后再补充. 如果不清 ...
- Linux I/O 调度器
每个块设备或者块设备的分区,都对应有自身的请求队列, 而每个请求队列都可以选择一个I/O调度器来协调所递交的.I/O调度器的基本目的是将请求按照它们对应在块设备上的扇区号进行排列,以减少磁头的移动, ...
随机推荐
- OC中的字典NSDictionary
========================== 字典 ========================== NSDictionary * dict = [[NSDictionary alloc] ...
- java文件复制函数
在写代码中,经常会需要复制文件.这时候就可以把这些函数放到工具类里面. 下面是一个复制文件的函数: public class CopyFileUtil { private static String ...
- 记一次eclipse无法启动的排查过程
起因是本地为开发工程打包,总是提示 source 1.3 不支持注释.enum等等,但询问开发开发表示自己本地打包正常. 于是排查版本问题.开发的jdk是1.6版本,自己的是1.7,于是想要不降级吧, ...
- jQuery和ExtJS的timeOut超时问题和event事件处理问题
对jQuery来说,超时可以直接设置timeout参数,并在error事件中捕获第二个参数,如果是“timeout”则表明捕获了超时事件,非常清楚. 例子: $.ajax({ type ...
- 什么是XMLA-- XML for Analysis
在我刚开始接触OLAP时,同事就告诉我 XMLA会让他使用更方便. 什么是XMLA? Providers 供应商 ActivePivot Hyperion Essbase IBM Infosphere ...
- 跨域调用webapi web端跨域调用webapi
web端跨域调用webapi 在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案. 通过自己的研究以及在网上看了一些大神的博客,写了一个Demo 首先新建一个webap ...
- ASP.NET MVC Bootstrap极速开发框架
前言 每次新开发项目都要从头开始设计?有木有一个通用的快速开发框架?并且得是ASP.NET MVC And Bootstrap?数据库不要手工创建?框架对未来业务支持的扩展性好?这么简单的功能还需要 ...
- java 某字符串在另一字符串中是否存在
boolean a = 字符串a.contains("字符串b");
- Hibernate 缓存介绍
Hibernate中提供了两级缓存,一级缓存是Session级别的缓存,它属于事务范围的缓存,该级缓存由hibernate管理,应用程序无需干预:二级缓存是SessionFactory级别的缓存,该级 ...
- Adaptive Code Via C#读书笔记
原书链接: http://www.amazon.com/Adaptive-Code-via-principles-Developer-ebook/dp/B00OCLLYTY/ref=dp_kinw_s ...