免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: mfkp3
打印 上一主题 下一主题

[内核入门] make_request_fn 中能否调用wait_for_completion等bio完成. [复制链接]

论坛徽章:
0
11 [报告]
发表于 2014-12-09 14:05 |只看该作者
make_request_fn这个函数本来就是直接面对的BIO,一般在这个函数中直接处理BIO,不会再次调用submit_bio
你又调用一次submit_bio->generic_make_request(bio)
                       struct request_queue *q = bdev_get_queue(bio->bi_bdev);
                              return bdev->bd_disk->queue;
                        q->make_request_fn(q, bio);
以上那个歌请求队列如你所以,是从minidev->bdev里的gendisk里得到的,如果没记错,你在
static int init_minidev(struct minidev *dev)
      struct gendisk *d;
      dev->disk = d;
我看到的是你又会调用make_request_fn,和你之前调用的嵌套了吧。你既然要自己用make_request_fn,那么这个里面要做的就是直接进行数据移动
                              

论坛徽章:
0
12 [报告]
发表于 2014-12-09 14:12 |只看该作者
回复 8# mfkp3

这个make_request_fn是从gendisk里得到的,make_request_fn变不变是看gendisk变不变,gendisk是从block_device得到的
,看你的block_device好像是从minidev得到的,你的minidev一直没变。上层read write通过设备节点会找到block_device 进而找到gendisk,这些好像都没变,你重新赋值也没用吧
   

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
13 [报告]
发表于 2015-01-23 15:59 |只看该作者
请问这个问题搞定了么?

论坛徽章:
0
14 [报告]
发表于 2015-01-23 16:24 |只看该作者
回复 12# Yiran_Linux
谢谢你的回复。
在重新赋值后,request_queue, make_request_fn就变了的,会加到相应的底层设备。

   

论坛徽章:
0
15 [报告]
发表于 2015-01-23 16:29 |只看该作者
回复 13# humjb_1983
:) 谢谢你的热心,这段时间在忙其它的,这个问题放在那,悬而未决啊。
附件上的代码虽然有些问题,但是能跑的。 在make_request_fn中等待io完成的话,就会卡住,不知为何。

   

论坛徽章:
0
16 [报告]
发表于 2015-02-04 12:45 |只看该作者
本帖最后由 iamconan 于 2015-02-04 12:55 编辑

这个问题应该是因为你做submit_bio()后bio被直接添加到current->bio_list中了,内核没有调用下层的make_request_fn()就返回了,然后你又wait_for_completion(),bio始终没有被下层处理
所以最好不要在make_request_fn()对bio做阻塞等待
具体参考blk-core.c中generic_make_request()的代码
这个机制的目的是防止块设备堆叠的过深后,提交bio把栈搞溢出了
相关补丁是在2.6.22中引入的,所以按照网上有些老的范例做会出问题
参考git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/block/ll_rw_blk.c?id=d89d87965dcbe6fe4f96a2a7e8421b3a75f634d1

论坛徽章:
0
17 [报告]
发表于 2015-02-05 10:07 |只看该作者
回复 16# iamconan
Got it, Thank you, sir!

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP