From cfada41f935582de7d344794143fd62ed875b627 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 11 Nov 2019 17:35:06 +0100 Subject: [PATCH] 4.14-stable patches added patches: cgroup-writeback-don-t-switch-wbs-immediately-on-dead-wbs-if-the-memcg-is-dead.patch mm-filemap.c-don-t-initiate-writeback-if-mapping-has-no-dirty-pages.patch --- ...ely-on-dead-wbs-if-the-memcg-is-dead.patch | 62 +++++++++++++++++++ ...teback-if-mapping-has-no-dirty-pages.patch | 49 +++++++++++++++ queue-4.14/series | 2 + 3 files changed, 113 insertions(+) create mode 100644 queue-4.14/cgroup-writeback-don-t-switch-wbs-immediately-on-dead-wbs-if-the-memcg-is-dead.patch create mode 100644 queue-4.14/mm-filemap.c-don-t-initiate-writeback-if-mapping-has-no-dirty-pages.patch diff --git a/queue-4.14/cgroup-writeback-don-t-switch-wbs-immediately-on-dead-wbs-if-the-memcg-is-dead.patch b/queue-4.14/cgroup-writeback-don-t-switch-wbs-immediately-on-dead-wbs-if-the-memcg-is-dead.patch new file mode 100644 index 00000000000..f28145e9b8c --- /dev/null +++ b/queue-4.14/cgroup-writeback-don-t-switch-wbs-immediately-on-dead-wbs-if-the-memcg-is-dead.patch @@ -0,0 +1,62 @@ +From 65de03e251382306a4575b1779c57c87889eee49 Mon Sep 17 00:00:00 2001 +From: Tejun Heo +Date: Fri, 8 Nov 2019 12:18:29 -0800 +Subject: cgroup,writeback: don't switch wbs immediately on dead wbs if the memcg is dead + +From: Tejun Heo + +commit 65de03e251382306a4575b1779c57c87889eee49 upstream. + +cgroup writeback tries to refresh the associated wb immediately if the +current wb is dead. This is to avoid keeping issuing IOs on the stale +wb after memcg - blkcg association has changed (ie. when blkcg got +disabled / enabled higher up in the hierarchy). + +Unfortunately, the logic gets triggered spuriously on inodes which are +associated with dead cgroups. When the logic is triggered on dead +cgroups, the attempt fails only after doing quite a bit of work +allocating and initializing a new wb. + +While c3aab9a0bd91 ("mm/filemap.c: don't initiate writeback if mapping +has no dirty pages") alleviated the issue significantly as it now only +triggers when the inode has dirty pages. However, the condition can +still be triggered before the inode is switched to a different cgroup +and the logic simply doesn't make sense. + +Skip the immediate switching if the associated memcg is dying. + +This is a simplified version of the following two patches: + + * https://lore.kernel.org/linux-mm/20190513183053.GA73423@dennisz-mbp/ + * http://lkml.kernel.org/r/156355839560.2063.5265687291430814589.stgit@buzz + +Cc: Konstantin Khlebnikov +Fixes: e8a7abf5a5bd ("writeback: disassociate inodes from dying bdi_writebacks") +Acked-by: Dennis Zhou +Signed-off-by: Tejun Heo +Signed-off-by: Jens Axboe +Signed-off-by: Greg Kroah-Hartman + +--- + fs/fs-writeback.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +--- a/fs/fs-writeback.c ++++ b/fs/fs-writeback.c +@@ -582,10 +582,13 @@ void wbc_attach_and_unlock_inode(struct + spin_unlock(&inode->i_lock); + + /* +- * A dying wb indicates that the memcg-blkcg mapping has changed +- * and a new wb is already serving the memcg. Switch immediately. ++ * A dying wb indicates that either the blkcg associated with the ++ * memcg changed or the associated memcg is dying. In the first ++ * case, a replacement wb should already be available and we should ++ * refresh the wb immediately. In the second case, trying to ++ * refresh will keep failing. + */ +- if (unlikely(wb_dying(wbc->wb))) ++ if (unlikely(wb_dying(wbc->wb) && !css_is_dying(wbc->wb->memcg_css))) + inode_switch_wbs(inode, wbc->wb_id); + } + diff --git a/queue-4.14/mm-filemap.c-don-t-initiate-writeback-if-mapping-has-no-dirty-pages.patch b/queue-4.14/mm-filemap.c-don-t-initiate-writeback-if-mapping-has-no-dirty-pages.patch new file mode 100644 index 00000000000..5be1d327339 --- /dev/null +++ b/queue-4.14/mm-filemap.c-don-t-initiate-writeback-if-mapping-has-no-dirty-pages.patch @@ -0,0 +1,49 @@ +From c3aab9a0bd91b696a852169479b7db1ece6cbf8c Mon Sep 17 00:00:00 2001 +From: Konstantin Khlebnikov +Date: Mon, 23 Sep 2019 15:34:45 -0700 +Subject: mm/filemap.c: don't initiate writeback if mapping has no dirty pages + +From: Konstantin Khlebnikov + +commit c3aab9a0bd91b696a852169479b7db1ece6cbf8c upstream. + +Functions like filemap_write_and_wait_range() should do nothing if inode +has no dirty pages or pages currently under writeback. But they anyway +construct struct writeback_control and this does some atomic operations if +CONFIG_CGROUP_WRITEBACK=y - on fast path it locks inode->i_lock and +updates state of writeback ownership, on slow path might be more work. +Current this path is safely avoided only when inode mapping has no pages. + +For example generic_file_read_iter() calls filemap_write_and_wait_range() +at each O_DIRECT read - pretty hot path. + +This patch skips starting new writeback if mapping has no dirty tags set. +If writeback is already in progress filemap_write_and_wait_range() will +wait for it. + +Link: http://lkml.kernel.org/r/156378816804.1087.8607636317907921438.stgit@buzz +Signed-off-by: Konstantin Khlebnikov +Reviewed-by: Jan Kara +Cc: Tejun Heo +Cc: Jens Axboe +Cc: Johannes Weiner +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/filemap.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/mm/filemap.c ++++ b/mm/filemap.c +@@ -338,7 +338,8 @@ int __filemap_fdatawrite_range(struct ad + .range_end = end, + }; + +- if (!mapping_cap_writeback_dirty(mapping)) ++ if (!mapping_cap_writeback_dirty(mapping) || ++ !mapping_tagged(mapping, PAGECACHE_TAG_DIRTY)) + return 0; + + wbc_attach_fdatawrite_inode(&wbc, mapping->host); diff --git a/queue-4.14/series b/queue-4.14/series index b184ca9d452..a348a2d96e8 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -101,3 +101,5 @@ x86-apic-move-pending-interrupt-check-code-into-it-s.patch x86-apic-drop-logical_smp_processor_id-inline.patch x86-apic-32-avoid-bogus-ldr-warnings.patch can-flexcan-disable-completely-the-ecc-mechanism.patch +mm-filemap.c-don-t-initiate-writeback-if-mapping-has-no-dirty-pages.patch +cgroup-writeback-don-t-switch-wbs-immediately-on-dead-wbs-if-the-memcg-is-dead.patch -- 2.47.3