• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * fs/hmdfs/client_writeback.h
4  *
5  * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
6  */
7 
8 #ifndef CLIENT_WRITEBACK_H
9 #define CLIENT_WRITEBACK_H
10 
11 #include "hmdfs.h"
12 
13 /*
14  * HM_DEFAULT_WRITEBACK_INTERVAL - centiseconds
15  * HMDFS_FILE_BG_WB_BYTES - background per-file threshold 10M
16  * HMDFS_FS_BG_WB_BYTES - background per-fs threshold 50M
17  * HMDFS_FILE_WB_BYTES - per-file throttle threshold
18  * HMDFS_FS_WB_BYTES - per-fs throttle threshold
19  */
20 #define HM_DEFAULT_WRITEBACK_INTERVAL	500
21 #define HMDFS_FILE_BG_WB_BYTES		(10 * 1024 * 1024)
22 #define HMDFS_FS_BG_WB_BYTES		(50 * 1024 * 1024)
23 #define HMDFS_FILE_WB_BYTES		(HMDFS_FILE_BG_WB_BYTES << 1)
24 #define HMDFS_FS_WB_BYTES		(HMDFS_FS_BG_WB_BYTES << 1)
25 
26 /* writeback time limit (default 5s) */
27 #define HMDFS_DEF_WB_TIMELIMIT		(5 * HZ)
28 #define HMDFS_MAX_WB_TIMELIMIT		(30 * HZ)
29 
30 /* bandwidth adjusted lower limit (default 1MB/s) */
31 #define HMDFS_BW_THRESH_MIN_LIMIT	(1 << (20 - PAGE_SHIFT))
32 #define HMDFS_BW_THRESH_MAX_LIMIT	(100 << (20 - PAGE_SHIFT))
33 #define HMDFS_BW_THRESH_DEF_LIMIT	HMDFS_BW_THRESH_MIN_LIMIT
34 
35 #define HMDFS_DIRTY_EXCEED_RATELIMIT	(32 >> (PAGE_SHIFT - 10))
36 #define HMDFS_RATELIMIT_PAGES_GAP	16
37 #define HMDFS_DEF_RATELIMIT_PAGES	32
38 #define HMDFS_MIN_RATELIMIT_PAGES	1
39 
40 struct hmdfs_dirty_throttle_control {
41 	struct hmdfs_writeback *hwb;
42 	/* last time threshes are updated */
43 	unsigned long thresh_time_stamp;
44 
45 	unsigned long file_bg_thresh;
46 	unsigned long fs_bg_thresh;
47 	unsigned long file_thresh;
48 	unsigned long fs_thresh;
49 
50 	unsigned long file_nr_dirty;
51 	unsigned long fs_nr_dirty;
52 	unsigned long file_nr_reclaimable;
53 	unsigned long fs_nr_reclaimable;
54 };
55 
56 struct hmdfs_writeback {
57 	struct hmdfs_sb_info *sbi;
58 	struct bdi_writeback *wb;
59 	/* enable hmdfs dirty writeback control */
60 	bool dirty_writeback_control;
61 
62 	/* writeback per-file inode list */
63 	struct list_head inode_list_head;
64 	spinlock_t inode_list_lock;
65 
66 	/* centiseconds */
67 	unsigned int dirty_writeback_interval;
68 	/* per-file background threshold */
69 	unsigned long dirty_file_bg_bytes;
70 	unsigned long dirty_file_bg_thresh;
71 	/* per-fs background threshold */
72 	unsigned long dirty_fs_bg_bytes;
73 	unsigned long dirty_fs_bg_thresh;
74 	/* per-file throttle threshold */
75 	unsigned long dirty_file_bytes;
76 	unsigned long dirty_file_thresh;
77 	/* per-fs throttle threshold */
78 	unsigned long dirty_fs_bytes;
79 	unsigned long dirty_fs_thresh;
80 	/* ratio between background thresh and throttle thresh */
81 	unsigned long fs_bg_ratio;
82 	unsigned long file_bg_ratio;
83 	/* ratio between file and fs throttle thresh */
84 	unsigned long fs_file_ratio;
85 
86 	/*
87 	 * Enable auto-thresh. If enabled, the background and throttle
88 	 * thresh are nolonger a fixed value storeed in dirty_*_bytes,
89 	 * they are determined by the bandwidth of the network and the
90 	 * writeback timelimit.
91 	 */
92 	bool dirty_auto_threshold;
93 	unsigned int writeback_timelimit;
94 	/* bandwitdh adjusted filesystem throttle thresh */
95 	unsigned long bw_fs_thresh;
96 	/* bandwidth adjusted per-file throttle thresh */
97 	unsigned long bw_file_thresh;
98 	/* bandwidth adjusted thresh lower limit */
99 	unsigned long bw_thresh_lowerlimit;
100 
101 	/* reclaimable pages exceed throttle thresh */
102 	bool dirty_exceeded;
103 	/* percpu dirty pages ratelimit */
104 	long ratelimit_pages;
105 	/* count percpu dirty pages */
106 	int __percpu *bdp_ratelimits;
107 
108 	/* per-fs writeback work */
109 	struct workqueue_struct *dirty_sb_writeback_wq;
110 	struct delayed_work dirty_sb_writeback_work;
111 	/* per-file writeback work */
112 	struct workqueue_struct *dirty_inode_writeback_wq;
113 	struct delayed_work dirty_inode_writeback_work;
114 
115 	/* per-fs writeback bandwidth */
116 	spinlock_t write_bandwidth_lock;
117 	unsigned long max_write_bandwidth;
118 	unsigned long min_write_bandwidth;
119 	unsigned long avg_write_bandwidth;
120 };
121 
122 void hmdfs_writeback_inodes_sb_handler(struct work_struct *work);
123 
124 void hmdfs_writeback_inode_handler(struct work_struct *work);
125 
126 void hmdfs_calculate_dirty_thresh(struct hmdfs_writeback *hwb);
127 
128 void hmdfs_update_ratelimit(struct hmdfs_writeback *hwb);
129 
130 void hmdfs_balance_dirty_pages_ratelimited(struct address_space *mapping);
131 
132 void hmdfs_destroy_writeback(struct hmdfs_sb_info *sbi);
133 
134 int hmdfs_init_writeback(struct hmdfs_sb_info *sbi);
135 
136 #endif
137