【linux内核】Page Cache Writeback脏页回写机制

Page Cache Writeback脏页回写机制

脏页回写与每个块设备的dwork紧密相关,先看下它的初始化:

static int wb_init(struct bdi_writeback *wb, struct backing_dev_info *bdi,
		   gfp_t gfp)
{
	int i, err;

	memset(wb, 0, sizeof(*wb));

	if (wb != &bdi->wb)
		bdi_get(bdi);
	wb->bdi = bdi;
	wb->last_old_flush = jiffies;
	INIT_LIST_HEAD(&wb->b_dirty);
	INIT_LIST_HEAD(&wb->b_io);
	INIT_LIST_HEAD(&wb->b_more_io);
	INIT_LIST_HEAD(&wb->b_dirty_time);
	spin_lock_init(&wb->list_lock);

	wb->bw_time_stamp = jiffies;
	wb->balanced_dirty_ratelimit = INIT_BW;
	wb->dirty_ratelimit = INIT_BW;
	wb->write_bandwidth = INIT_BW;
	wb->avg_write_bandwidth = INIT_BW;

	spin_lock_init(&wb->work_lock);
	INIT_LIST_HEAD(&wb->work_list);
     /*初始化wb->dwork, bdi_writeback_workfn 函数指针赋值于 
    dwork->work->func,并初始化dwork->timer定时器函数delayed_work_timer_fn()*/
	INIT_DELAYED_WORK(&wb->dwork, wb_workfn);
	wb->dirty_sleep = jiffies;

	err = fprop_local_init_percpu(&wb->completions, gfp);
	if (err)
		goto out_put_bdi;

	for (i = 0; i < NR_WB_STAT_ITEMS; i++) {
		err = percpu_counter_init(&wb->stat[i], 0, gfp);
		if (err)
			goto out_destroy_stat;
	}

	return 0;

out_destroy_stat:
	while (i--)
		percpu_counter_destroy(&wb->stat[i]);
	fprop_local_destroy_percpu(&wb->completions);
out_put_bdi:
	if (wb != &bdi->wb)
		bdi_put(bdi);
	return err;
}

 

参考资料

1. Page Cache Writeback脏页回写机制

2. linux内存回收 之 File page的 lru list算法原理

3. VFS源码分析-Page Cache Writeback脏页回写机制

4. writeback bdi脏页回写原理linux内核源码解析

5. Linux writeback机制

6. Linux页缓存、LinuxVFS中文件打开、读、写底层逻辑

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