gpt4 book ai didi

并发 I/O - 缓冲区损坏、 block 设备驱动程序

转载 作者:IT王子 更新时间:2023-10-29 00:37:06 25 4
gpt4 key购买 nike

我正在开发 block 分层设备驱动程序。因此,我拦截WRITE 请求并加密数据,并在end_bio() 例程中解密数据(在处理和READ 请求期间)。所以在单流中一切正常。但是如果尝试同时从两个或多个进程执行 I/O,我会得到缓冲区内容损坏。我没有任何本地缓冲区存储空间。

我是否需要在我的驱动程序中计算 BIO 合并?

Linux I/O 子系统是否有一些与并发 I/O 请求相关的要求?

是否有一些栈使用或编译相关的技巧和窍门?

这是在内核 4.15 下。

当时我使用下一个收缩来运行磁盘扇区:

    /*
* A portion of the bio_copy_data() ...
*/
for (vcnt = 0, src_iter = src->bi_iter; ; vcnt++)
{
if ( !src_iter.bi_size)
{
if ( !(src = src->bi_next) )
break;

src_iter = src->bi_iter;
}

src_bv = bio_iter_iovec(src, src_iter);

src_p = bv_page = kmap_atomic(src_bv.bv_page);
src_p += src_bv.bv_offset;

nlbn = src_bv.bv_len512;
for ( ; nlbn--; lbn++ , src_p += 512 )
{
{
/* Simulate a processing of data in the I/O buffer */
char *srcp = src_p, *dstp = src_p;
int count = DUDRV$K_SECTORSZ;

while ( count--)
{
*(dstp++) = ~ (*(srcp++));
}

}
}
kunmap_atomic(bv_page);
**bio_advance_iter**(src, &src_iter, src_bv.bv_len);
}

这是正确的吗?或者我需要使用类似 **bio_for_each_segment(bvl, bio, iter) ** 的东西?

最佳答案

问题的根源是 block I/O 方法的一个“特性”。特别是(参见 Linex 网站上的描述 reference )

** Biovecs 可以在多个 bios 之间共享 - 一个 bvec iter 可以代表一个 现有 biovec 的任意范围,包括中途开始和结束 通过 biovecs。这就是实现任意有效分割的原因 传记。请注意,这意味着我们使用 bi_size 来确定我们何时 到达了 bio 的末尾,而不是 bi_vcnt - 并且 bio_iovec() 宏需要 构建 biovecs 时考虑 bi_size。*

所以,在我的例子中,这是缓冲区磁盘扇区溢出的原因。

技巧是在将 BIO 发送到支持的设备驱动程序之前在 .bi_opf 中设置 REQ_NOMERGE_FLAGS

第二个原因是非实际的 .bi_iter 由支持的设备驱动程序返回。因此,我们需要保存它(在向后端提交 BIO 请求之前)并在我们的“bio_endio()”例程中恢复它。

关于并发 I/O - 缓冲区损坏、 block 设备驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52005791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com