部门测试环境最近出了个内核core,是宕机在了mpt3sas这个模块,以前没见过这个模块,怎么查这个core呢?以前没见过,现在见见就好了;)。这个模块是sas控制器的驱动,在之前的IO栈研究中,只了解到过通用块层,scsi往下的就没接触了,也正好趁此解这个bug的机会了解下IO栈scsi以下是什么。
从config描述可以看到,mpt3sas是SAS控制器驱动,特殊点在于它是基于Fusion-MPT 架构的。
config SCSI_MPT3SAS
tristate "LSI MPT Fusion SAS 3.0 Device Driver"
depends on PCI && SCSI
select SCSI_SAS_ATTRS
select RAID_ATTRS
---help---
This driver supports PCI-Express SAS 12Gb/s Host Adapters.
Fusion-MPT是什么呢?先看网络上的一段描述
Fusion-MPT 技术由 LSI Logic 开发,旨在为客户提供更为容易的实现 SCSI 和 Fibre Channel 的解决方案。
Fusion-MPT 技术主要包括 Fusion-MPT 固件,SAS、U320 SCSI、Fibre Channel硬核,和操作系统级的驱动程序等部分。
Fusion-MPT 架构中使用统一的固件及驱动来支持所有基于 Fusion-MPT 技术的 I/O 控制器。
Fusion-MPT 架构可分为操作系统层和硬件层两部分,而从驱动程序设计的角度,又可进一步将其分为驱动、固件和硬件三个功能层次。
Fusion-MPT 在硬件层之上构建独有的固件层,不同的固件为上层驱动程序提供对 SCSI 或 FC 的支持,以及高级的集成 RAID 等功能。固件层有效地将驱动程序同硬件隔离,对上层驱动程序提供统一的 MPI ( Message Passing Interface )接口,使同一驱动程序可以应用于不同的底层硬件系统,有助于加速应用开发。驱动层对上层操作系统提供功能函数接口,通过 MPI 访问固件层,实现操作系统对硬件的访问,并且按照通信协议实现相关的帧封装和拆解。消息传递接口 MPI 提供了一个消息传递传输架构,它定义了主机与 LSI Fusion-MPT 芯片组通信的接口。
上述描述的很明白了,概括来说,Fusion-MPT是个好东西,它在硬件上提供了一个固件,上层驱动程序可以用MPI接口访问固件,而固件可以接不同的硬件,这样简化了操作系统对不通硬件的访问。而mpt3sas这个驱动,是用了MPT固件,下面接的是sas接口,我们看下这个设备在系统中的位置,LSISAS 1068E就是用mpt3sas的一个设备
依据资料简单分析下mpt3sas驱动的结构,
static int __init
_mpt3sas_init(void)
{
int error;
#ifdef MPT2SAS_SCSI
pr_info("%s version %s loaded\n", MPT2SAS_DRIVER_NAME,
MPT2SAS_DRIVER_VERSION);
#else
pr_info("%s version %s loaded\n", MPT3SAS_DRIVER_NAME,
MPT3SAS_DRIVER_VERSION);
#endif /* MPT2SAS_SCSI */
mpt3sas_transport_template = //设置template
sas_attach_transport(&mpt3sas_transport_functions);
if (!mpt3sas_transport_template)
return -ENODEV;
#ifdef MPT2SAS_SCSI
mpt2sas_raid_template = rai