【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() 返回

浙公网安备 33010602011771号