Skip to content

Commit 89e9b9e

Browse files
htejunaxboe
authored andcommitted
writeback: add {CONFIG|BDI_CAP|FS}_CGROUP_WRITEBACK
cgroup writeback requires support from both bdi and filesystem sides. Add BDI_CAP_CGROUP_WRITEBACK and FS_CGROUP_WRITEBACK to indicate support and enable BDI_CAP_CGROUP_WRITEBACK on block based bdi's by default. Also, define CONFIG_CGROUP_WRITEBACK which is enabled if both MEMCG and BLK_CGROUP are enabled. inode_cgwb_enabled() which determines whether a given inode's both bdi and fs support cgroup writeback is added. Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Jens Axboe <axboe@kernel.dk> Cc: Jan Kara <jack@suse.cz> Signed-off-by: Jens Axboe <axboe@fb.com>
1 parent 4aa9c69 commit 89e9b9e

File tree

4 files changed

+38
-2
lines changed

4 files changed

+38
-2
lines changed

block/blk-core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -621,7 +621,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)
621621

622622
q->backing_dev_info.ra_pages =
623623
(VM_MAX_READAHEAD * 1024) / PAGE_CACHE_SIZE;
624-
q->backing_dev_info.capabilities = 0;
624+
q->backing_dev_info.capabilities = BDI_CAP_CGROUP_WRITEBACK;
625625
q->backing_dev_info.name = "block";
626626
q->node = node_id;
627627

include/linux/backing-dev.h

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,12 +134,15 @@ int bdi_set_max_ratio(struct backing_dev_info *bdi, unsigned int max_ratio);
134134
* BDI_CAP_NO_WRITEBACK: Don't write pages back
135135
* BDI_CAP_NO_ACCT_WB: Don't automatically account writeback pages
136136
* BDI_CAP_STRICTLIMIT: Keep number of dirty pages below bdi threshold.
137+
*
138+
* BDI_CAP_CGROUP_WRITEBACK: Supports cgroup-aware writeback.
137139
*/
138140
#define BDI_CAP_NO_ACCT_DIRTY 0x00000001
139141
#define BDI_CAP_NO_WRITEBACK 0x00000002
140142
#define BDI_CAP_NO_ACCT_WB 0x00000004
141143
#define BDI_CAP_STABLE_WRITES 0x00000008
142144
#define BDI_CAP_STRICTLIMIT 0x00000010
145+
#define BDI_CAP_CGROUP_WRITEBACK 0x00000020
143146

144147
#define BDI_CAP_NO_ACCT_AND_WRITEBACK \
145148
(BDI_CAP_NO_WRITEBACK | BDI_CAP_NO_ACCT_DIRTY | BDI_CAP_NO_ACCT_WB)
@@ -229,4 +232,31 @@ static inline int bdi_sched_wait(void *word)
229232
return 0;
230233
}
231234

232-
#endif /* _LINUX_BACKING_DEV_H */
235+
#ifdef CONFIG_CGROUP_WRITEBACK
236+
237+
/**
238+
* inode_cgwb_enabled - test whether cgroup writeback is enabled on an inode
239+
* @inode: inode of interest
240+
*
241+
* cgroup writeback requires support from both the bdi and filesystem.
242+
* Test whether @inode has both.
243+
*/
244+
static inline bool inode_cgwb_enabled(struct inode *inode)
245+
{
246+
struct backing_dev_info *bdi = inode_to_bdi(inode);
247+
248+
return bdi_cap_account_dirty(bdi) &&
249+
(bdi->capabilities & BDI_CAP_CGROUP_WRITEBACK) &&
250+
(inode->i_sb->s_type->fs_flags & FS_CGROUP_WRITEBACK);
251+
}
252+
253+
#else /* CONFIG_CGROUP_WRITEBACK */
254+
255+
static inline bool inode_cgwb_enabled(struct inode *inode)
256+
{
257+
return false;
258+
}
259+
260+
#endif /* CONFIG_CGROUP_WRITEBACK */
261+
262+
#endif /* _LINUX_BACKING_DEV_H */

include/linux/fs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,6 +1897,7 @@ struct file_system_type {
18971897
#define FS_HAS_SUBTYPE 4
18981898
#define FS_USERNS_MOUNT 8 /* Can be mounted by userns root */
18991899
#define FS_USERNS_DEV_MOUNT 16 /* A userns mount does not imply MNT_NODEV */
1900+
#define FS_CGROUP_WRITEBACK 32 /* Supports cgroup-aware writeback */
19001901
#define FS_RENAME_DOES_D_MOVE 32768 /* FS will handle d_move() during rename() internally. */
19011902
struct dentry *(*mount) (struct file_system_type *, int,
19021903
const char *, void *);

init/Kconfig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1141,6 +1141,11 @@ config DEBUG_BLK_CGROUP
11411141
Enable some debugging help. Currently it exports additional stat
11421142
files in a cgroup which can be useful for debugging.
11431143

1144+
config CGROUP_WRITEBACK
1145+
bool
1146+
depends on MEMCG && BLK_CGROUP
1147+
default y
1148+
11441149
endif # CGROUPS
11451150

11461151
config CHECKPOINT_RESTORE

0 commit comments

Comments
 (0)