Megaraid 通用管理模块

概述

LSI Logic 的不同类别的控制器以类似的方式接受用户应用程序并作出响应。它们理解相同的固件控制命令。此外,应用程序还可以统一对待不同类别的控制器。因此,拥有一个单独的模块,在一侧与应用程序接口,在另一侧与所有底层驱动程序接口是合乎逻辑的。

虽然优势显而易见,但为了完整起见,在此列出:

  1. 避免底层驱动程序中的重复代码。

  2. 减轻底层驱动程序导出字符节点设备和相关处理的负担。

  3. 在一个地方实现任何策略机制。

  4. 应用程序只需与一个模块而不是多个底层驱动程序接口。

目前,此模块(称为通用管理模块)仅用于发出 ioctl 命令。但此模块被设想为处理所有用户空间级别的交互。因此,任何“proc”、“sysfs”实现都将在此通用模块中本地化。

鸣谢

"Shared code in a third module, a "library module", is an acceptable
solution. modprobe automatically loads dependent modules, so users
running "modprobe driver1" or "modprobe driver2" would automatically
load the shared library module."
"As Jeff hinted, if your userspace<->driver API is consistent between
your new MPT-based RAID controllers and your existing megaraid driver,
then perhaps you need a single small helper module (lsiioctl or some
better name), loaded by both mptraid and megaraid automatically, which
handles registering the /dev/megaraid node dynamically. In this case,
both mptraid and megaraid would register with lsiioctl for each
adapter discovered, and lsiioctl would essentially be a switch,
redirecting userspace tool ioctls to the appropriate driver."

设计

通用管理模块在 megaraid_mm.[ch] 文件中实现。此模块充当底层 hba 驱动程序的注册表。底层驱动程序(目前只有 megaraid)向通用模块注册每个控制器。

应用程序通过该模块导出的字符设备节点与通用模块接口。

较低级别的驱动程序现在只理解一种新的改进的 ioctl 数据包,称为 uioc_t。管理模块将旧应用程序的旧 ioctl 数据包转换为 uioc_t。在驱动程序处理 uioc_t 后,通用模块会在返回给应用程序之前将其转换回旧格式。

随着新应用程序的发展并取代旧应用程序,旧数据包格式将被淘汰。

通用模块为每个注册的控制器分配一个 uioc_t 数据包。这很容易超过一个。但由于 megaraid 是目前唯一的底层驱动程序,并且它只能处理一个 ioctl,因此没有理由拥有更多。但是,随着新控制器类别的添加,将对其进行适当的调整。