记一次由PCI BAR配置不正确引发的硬盘IO调度io_schedule阻塞的经历

五一前,接到一个bug,大意是说设备接固态硬盘时跑新内核会出现卡死导致WDT复位,使用旧内核没问题。新内核是去年年底别人编译的,旧内核是3年前现在已离职2年的人编译的,现在安排我解决这个问题。但其时正在进行其他部门的紧急测试任务,于是请求节后解决。我最近的计划是学习以太网驱动,而五一没什么计划就去看了,本来想研究SCSI的,但先等查问题后再说吧。

一、问题定位

 从信息分析,内核启动后在打印下面语句卡住了。

SCSI device sda: drive cache: write back
 sda:

我一直以为sda: sda1 sda2这种信息连着在一个函数里打印的,结果不是。跟踪代码后,发现SCSI太庞大了,一步一步跟踪。这个过程有点了解硬盘的驱动流程的东西。之后定位到check_partition函数有sda,然后卡死,缩小范围。该函数调用ldm_validate_privheads和msdos_partition,一开始以为是不支持ldm,直接使用msdos_partition,不过还是卡死。之后定位到read_cache_page,再定位到lock_page函数,该函数顾名思义,就是锁页,我将page的flags打印出现对比宏定义,发现是PG_locked。我甚至以为在此之前已经锁住了,所以一直在等待释放。但却不是。最终确认在io_schedule函数阻塞了。由此判断,内核读硬盘分区出现了问题。

二、问题解决

经本人掐指一算,并请教西池侠客,最终将bug成功指向PCI bar寄存器配置。不要问为什么,我能从VLC播放设备RTSP视频卡顿算到以太网暂停帖,也能从SCSI的IO调度阻塞算到PCI配置问题。

三、额外学习

1、sd初始化

sd_probe
--> sd_revalidate_disk
     --> sd_read_capacity // 读硬盘大小
     --> sd_read_cache_type // 打印SCSI device sda: drive cache: write back
     --> add_disk
          --> register_disk
          --> blk_register_queue
     --> 打印Attached scsi disk sda at scsi0, channel 0, id 0, lun 0	
    printk(KERN_NOTICE "Attached scsi %sdisk %s at scsi%d, channel %d, "
	       "id %d, lun %d\n", sdp->removable ? "removable " : "",
	       gd->disk_name, sdp->host->host_no, sdp->channel,
	       sdp->id, sdp->lun);

2、打印磁盘

register_disk
--> blkdev_get -> do_open -> rescan_partitions ->调用fops->revalidate_disk -> check_partition -> 打印硬盘(sda) printk(KERN_INFO " %s:", state->name);

进入分区调用,msdos_partition,该函数调用put_partition打印sda1、sda2等。

3、打印磁盘设备型号

scsi_probe_and_add_lun
--> scsi_probe_lun
-->scsi_add_lun
--> print_inquiry 
// print_inquiry 打印:
  Vendor: ATA       Model: XXXXXX  Rev: XXXX
  Type:   Direct-Access                      ANSI SCSI revision: 05

4、io_schedule跟踪

read_cache_page
- __read_cache_page // ok
- mark_page_accessed // ok
- lock_page // time out
     --> __lock_page
     --> __wait_on_bit_lock && sync_page
     
sync_page
->io_schedule
-> atomic_inc
-> schedule 
     --> schedule(调用__schedule) 此处阻塞
-> atomic_dec

套用最近发生的事件的话:我在内核方面还需要多加改进。

PS:

在解决过程中,一如既往地花很多时间找设备、串口接口(同时还要进行其它事务),向公司层面请求概要设计等资料,最终还是没得到,因为年隔多年,已然不在。

李迟,2015.5.8 周五 中午

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值