【linux内核】用户写和后台写回writeback竞争关系

用户写和后台写回writeback竞争关系

问题本质:文件正在被写入 page cache(脏页变更多)与此同时后台 flusher 正在把同一文件的脏页写回。那内核如何并发处理?不会互相覆盖?不会 crash?不会写错数据?

如果两者同时操作,竞争如何解决?

Case 1:用户写入时 page 正被 writeback(PG_writeback=1)用户写路径:

lock_page(page);
if (PageWriteback(page))
    wait_on_page_writeback(page); // 阻塞
copy_from_iter();
set_page_dirty(page);
unlock_page(page);

用户写会等待写回结束(等待 PG_writeback 清除)结论:不会覆盖 writeback 数据,不会撕裂写回

 

📌 PageWriteback 的典型时序图:

用户写            writeback线程
  ↓                    ↓
lock_page              lock_page
set_page_dirty
unlock_page

                 test_clear_page_dirty
                 mark_page_writeback (PG_writeback=1)
                 writepage
                 ...
                 end_page_writeback (PG_writeback=0)
                 unlock_page


用户再次写入
lock_page
wait_on_page_writeback  ← 阻塞等待 writeback 完成
copy_from_iter
set_page_dirty
unlock_page

 

 

唤醒流程:

writeback IO 完成
    ↓
end_page_writeback(page)
    ↓
clear_page_writeback(page)
    ↓
wake_up_page(page, PG_writeback)
    ↓
wake_up_page_bit(page_waitqueue, PG_writeback)
    ↓
__wake_up_locked_key_bookmark()
    ↓
__wake_up_common()
    ↓
设置 WQ_FLAG_WOKEN
    ↓
wait_on_page_bit_common() 返回

 

posted @ 2025-12-16 16:41  苏格拉底的落泪  阅读(4)  评论(0)    收藏  举报