From: Shaohua Li <shli@xxxxxx> Basically this is a copy of commit 001e4a8775f6(ext4: implement cgroup writeback support). Tested with a fio test, verified writeback is throttled against cgroup io.max write bandwidth, also verified moving the fio test to another cgroup and the writeback is throttled against new cgroup setting. This only controls the file data write for cgroup. For metadata, since xfs dispatches the metadata write in specific threads, it's possible low prio app's metadata could harm high prio app's metadata. A while back, Tejun has a patch to force metadata belonging to root cgroup for btrfs. I had a similiar patch for xfs too. But Since Tejun's patch isn't in upstream, I'll delay post the xfs patch. Cc: Tejun Heo <tj@xxxxxxxxxx> Cc: Darrick J. Wong <darrick.wong@xxxxxxxxxx> Cc: Dave Chinner <david@xxxxxxxxxxxxx> Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx> Signed-off-by: Shaohua Li <shli@xxxxxx> --- fs/xfs/xfs_aops.c | 13 +++++++++++-- fs/xfs/xfs_super.c | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/xfs/xfs_aops.c b/fs/xfs/xfs_aops.c index 19eadc8..5f70584 100644 --- a/fs/xfs/xfs_aops.c +++ b/fs/xfs/xfs_aops.c @@ -589,7 +589,8 @@ xfs_alloc_ioend( struct inode *inode, unsigned int type, xfs_off_t offset, - struct buffer_head *bh) + struct buffer_head *bh, + struct writeback_control *wbc) { struct xfs_ioend *ioend; struct bio *bio; @@ -606,6 +607,8 @@ xfs_alloc_ioend( INIT_WORK(&ioend->io_work, xfs_end_io); ioend->io_append_trans = NULL; ioend->io_bio = bio; + /* attach new bio to its cgroup */ + wbc_init_bio(wbc, bio); return ioend; } @@ -633,6 +636,8 @@ xfs_chain_bio( ioend->io_bio->bi_write_hint = ioend->io_inode->i_write_hint; submit_bio(ioend->io_bio); ioend->io_bio = new; + /* attach new bio to its cgroup */ + wbc_init_bio(wbc, new); } /* @@ -656,7 +661,8 @@ xfs_add_to_ioend( offset != wpc->ioend->io_offset + wpc->ioend->io_size) { if (wpc->ioend) list_add(&wpc->ioend->io_list, iolist); - wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type, offset, bh); + wpc->ioend = xfs_alloc_ioend(inode, wpc->io_type, offset, + bh, wbc); } /* @@ -666,6 +672,9 @@ xfs_add_to_ioend( while (xfs_bio_add_buffer(wpc->ioend->io_bio, bh) != bh->b_size) xfs_chain_bio(wpc->ioend, wbc, bh); + /* Charge write size to its cgroup for cgroup switching track */ + wbc_account_io(wbc, bh->b_page, bh->b_size); + wpc->ioend->io_size += bh->b_size; wpc->last_block = bh->b_blocknr; xfs_start_buffer_writeback(bh); diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 951271f..95c2d3d 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -1666,6 +1666,7 @@ xfs_fs_fill_super( sb->s_max_links = XFS_MAXLINK; sb->s_time_gran = 1; set_posix_acl_flag(sb); + sb->s_iflags |= SB_I_CGROUPWB; /* version 5 superblocks support inode version counters. */ if (XFS_SB_VERSION_NUM(&mp->m_sb) == XFS_SB_VERSION_5) -- 2.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html