- 论坛徽章:
- 0
|
原帖由 pennyliang 于 2008-2-23 20:59 发表
小弟初学,最近有两个问题,请大家指点一下:
1. 在系统发起一个sys_read调用后,经过VFS,到具体文件系统,再到mpage_readpage,在提交完bio之后就返回了,请问一个读磁盘操作在什么地方被阻塞?然后又是在 ...
1. 补充一下:
- mm/filemap.c
- readpage:
- /* Start the actual read. The read will unlock the page. */
- error = mapping->a_ops->readpage(filp, page);
- if (unlikely(error)) {
- if (error == AOP_TRUNCATED_PAGE) {
- page_cache_release(page);
- goto find_page;
- }
- goto readpage_error;
- }
- if (!PageUptodate(page)) {
- lock_page(page) //HERE XXXXXXXXXXXXXXXXXXXX
- if (!PageUptodate(page)) {
- if (page->mapping == NULL) {
- /*
- * invalidate_inode_pages got it
- */
- unlock_page(page);
- page_cache_release(page);
- goto find_page;
- }
- unlock_page(page);
- error = -EIO;
- shrink_readahead_size_eio(filp, &ra);
- goto readpage_error;
- }
- unlock_page(page);
- }
- /*
复制代码
注释标出的lock_page有睡眠进程的作用。在这段代码之前,read_page()被调用前已经调用过lock_page,执行到注释处时表示用于读数据的page的PG_update标志仍然没被设上,于是对一个已经lock的page再次调用lock_page将使进程睡眠。
2. 如塑料袋兄所说,要考虑多处理器情况。
[ 本帖最后由 zx_wing 于 2008-2-23 22:31 编辑 ] |
|