BDMA XOR使用参考¶
REVISION HISTORY¶
| Revision No. | Description |
Date |
|---|---|---|
| 1.0 | 01/29/2026 |
1. 概述¶
在RAID5/RAID6应用中,需要进行大量XOR计算。若使用CPU进行XOR计算,则会占用大量CPU资源,降低系统性能。使用BDMA XOR硬件进行XOR计算,可以让CPU从XOR计算中解放出来,降低CPU的负载。
BDMA XOR驱动基于Linux标准的DMA引擎子系统框架,主要用于RAID5/RAID6等需要XOR计算的存储应用场景,通过硬件加速来提升数据处理的效率。
主要特性:
- 支持DMA_MEMCPY和DMA_XOR操作
- 支持最多8个源缓冲区的XOR运算
- 支持Scatter-Gather List,可批量处理多个描述符
- 支持ACP(Accelerator Coherency Port)
- 基于Linux DMA引擎框架,兼容标准异步传输API
2. 关键字说明¶
-
BDMA (Byte-aligned data transfer DMA engine)
主要用于外设与存储器之间、存储器与存储器之间的高速数据传输,并且不需要CPU的参与。
-
XOR计算
异或运算,在RAID5/RAID6等存储系统中用于计算和校验数据。例如:对于n个源缓冲区,XOR计算会将所有源数据按位异或后写入目标缓冲区。
-
Scatter-Gather List
分散-聚集列表,允许DMA控制器在一次操作中处理多个非连续的内存区域。
-
ACP (Accelerator Coherency Port)
加速器一致性端口,用于实现外部加速器(如DMA控制器)与CPU缓存之间的内存一致性访问。启用ACP后,可减少手动刷写cache的操作,提升性能。
3. 功能描述¶
3.1 硬件特性¶
| 参数名称 | 规格 | 说明 |
|---|---|---|
| 最大源缓冲区数量 | 8 | 单次XOR计算最多支持8个源缓冲区 |
| 描述符队列深度 | 1024 | 支持最多1024个待处理的硬件描述符 |
| Scatter-Gather List大小 | 16KB | 用于存储Scatter-Gather表项 |
| 数据传输大小范围 | 1字节 - 4096字节 | 单次操作的数据大小范围 |
| Burst长度 | 支持16和32字节 | 可配置的DMA传输突发长度 |
3.2 工作模式¶
BDMA XOR驱动支持以下工作模式:
-
ACP模式
- 启用ACP
- 自动处理缓存一致性,无需手动刷写cache
- 配置方式:在DTS中设置
acp-enable = <1>;
-
非ACP模式
- 手动管理缓存一致性
- 需要在传输前flush源数据cache
- 需要在传输后invalidate目标数据cache
- 配置方式:在DTS中设置
acp-enable = <0>;
3.3 支持的操作¶
| 操作类型 | 描述 | API接口 |
|---|---|---|
| DMA_MEMCPY | 内存到内存的拷贝操作 | device_prep_dma_memcpy |
| DMA_XOR | 多源缓冲区异或运算 | device_prep_dma_xor |
4. Kernel用法介绍¶
4.1. Kernel Config配置¶
在编译Kernel时需要选择的配置如下:
Kconfig配置详情:
config SGS_BDMA_XOR
bool "Sgs BDMA XOR driver"
select DMADEVICES
select DMA_ENGINE
select DMA_VIRTUAL_CHANNELS
select DMA_ENGINE_RAID
select ASYNC_TX_DMA
select ASYNC_TX_ENABLE_CHANNEL_SWITCH
select ASYNC_CORE
select ASYNC_XOR
select ASYNC_MEMCPY
default y if ARCH_MHERA
help
Sgs BDMA XOR driver function
4.2. DTS配置说明¶
可以在dtsi中配置BDMA XOR驱动,示例如下:
bdma_xor {
compatible = "sgs,bdma_xor";
interrupts = <GIC_SPI INT_IRQ_BDMA3 IRQ_TYPE_LEVEL_HIGH>;
reg = <0x0 0x1F201800 0x100>, /* BDMA寄存器基地址 */
<0x0 0x1F220C00 0x100>; /* XOR寄存器基地址 */
acp-enable = <1>; /* ACP使能标志:1=启用,0=禁用 */
clocks = <&xtal>; /* 时钟源 */
status = "okay"; /* 状态:okay=启用,disabled=禁用 */
};
参数说明:
| 参数 | 释义 | 备注 |
|---|---|---|
| compatible | 驱动兼容性字符串,用于匹配驱动 | 必须为"sgs,bdma_xor" |
| interrupts | 中断号和中断触发方式 | 使用GIC SPI中断,电平触发 |
| reg | 寄存器基地址和大小 | 第一个是BDMA基地址,第二个是XOR基地址 |
| acp-enable | ACP加速器一致性端口使能 | 1表示启用,0表示禁用,默认启用 |
| clocks | 时钟源引用 | 指向xtal时钟 |
| status | 设备状态 | okay表示启用,disabled表示禁用 |
4.3. 使用方法¶
使能BDMA XOR驱动后,Kernel启动log会有如下打印,表示BDMA XOR驱动初始化成功。在RAID5读写时,系统会自动使用BDMA XOR硬件来进行DMA_MEMCPY和DMA_XOR的计算。
sgs,bdma_xor 1f201800.bdma_xor: DMA use 64-bit address mask
sgs,bdma_xor 1f201800.bdma_xor: sg_list_virt:0xffffffc009195000
sgs,bdma_xor 1f201800.bdma_xor: acp enabled
5. RAID5性能测试¶
本节介绍RAID5性能测试的方法,包括如何配置Kernel Config,以及测试RAID5的命令。
5.1. 配置Kernel相关Config¶
涉及RAID5的Kernel Config主要包含三部分:
- 开启RAID5 Config配置
- 配置组建RAID5的设备
- 配置DMA_MEMCPY/DMA_XOR计算的硬件
5.1.1 开启RAID5 Config配置¶
Device Drivers --->
[*] Multiple devices driver support (RAID and LVM) --->
<*> RAID support
[*] Autodetect RAID arrays during kernel boot
<*> RAID-4/RAID-5/RAID-6 mode
5.1.2 配置组建RAID5的设备¶
可以使用SATA硬盘组建RAID5。如果你没有SATA硬盘,也可以使用内存块设备来组建RAID5进行测试。
5.1.2.1. 开启SATA Config配置¶
具体配置选项请参考SATA相关文档。
5.1.2.2. 开启内存块设备Config配置¶
Device Drivers --->
[*] Block devices --->
<*> RAM block device support
(4) Default number of RAM disks /* 配置4个内存块设备 */
(102400) Default RAM disk size (kbytes) /* 配置每个内存块设备的size为100MB */
5.1.3 配置DMA_MEMCPY/DMA_XOR计算的硬件¶
在RAID5读写时会有大量的DMA_MEMCPY/DMA_XOR计算,使能BDMA XOR驱动时,这部分计算会由BDMA XOR硬件来完成。禁用BDMA XOR驱动时,这部分计算会由CPU来完成。
使能BDMA XOR驱动的方法请参考上文。
5.2. 测试RAID5性能¶
Step 1. 使用mdadm工具组建RAID,具体命令参数请参考相关文档
## 使用SATA硬盘/dev/sda1~/dev/sda4分区组建RAID5
./mdadm -C /dev/md1 -l5 -c128 -binternal -n4 /dev/sda[1-4] --assume-clean
或
## 使用内存块设备/dev/ram0~/dev/ram3组建RAID5
./mdadm -C /dev/md1 -l5 -c128 -binternal -n4 /dev/ram[0-3] --assume-clean
Step 2. 生成随机数据,并写入RAID5
dd if=/dev/random of=/tmp/data.bin bs=4096 count=80000
dd if=/tmp/data.bin of=/dev/md1 bs=4096 count=80000
Step 3. 从RAID5读取数据
Step 4. 校验原始数据和RAID5中的数据是否一致