blkcg, writeback: dead memcgs shouldn't contribute to writeback ownership arbitration
authorTejun Heo <tj@kernel.org>
Thu, 13 Jun 2019 22:30:41 +0000 (15:30 -0700)
committerJens Axboe <axboe@kernel.dk>
Sat, 15 Jun 2019 16:39:42 +0000 (10:39 -0600)
wbc_account_io() collects information on cgroup ownership of writeback
pages to determine which cgroup should own the inode.  Pages can stay
associated with dead memcgs but we want to avoid attributing IOs to
dead blkcgs as much as possible as the association is likely to be
stale.  However, currently, pages associated with dead memcgs
contribute to the accounting delaying and/or confusing the
arbitration.

Fix it by ignoring pages associated with dead memcgs.

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/fs-writeback.c

index e41cbe8e81b9b439863fe8404d91943b908c2a01..9ebfb1b2843077af8c003c94ec6eb35f16b47591 100644 (file)
@@ -715,6 +715,7 @@ void wbc_detach_inode(struct writeback_control *wbc)
 void wbc_account_io(struct writeback_control *wbc, struct page *page,
                    size_t bytes)
 {
+       struct cgroup_subsys_state *css;
        int id;
 
        /*
@@ -726,7 +727,12 @@ void wbc_account_io(struct writeback_control *wbc, struct page *page,
        if (!wbc->wb)
                return;
 
-       id = mem_cgroup_css_from_page(page)->id;
+       css = mem_cgroup_css_from_page(page);
+       /* dead cgroups shouldn't contribute to inode ownership arbitration */
+       if (!(css->flags & CSS_ONLINE))
+               return;
+
+       id = css->id;
 
        if (id == wbc->wb_id) {
                wbc->wb_bytes += bytes;