From: Sasha Levin Date: Thu, 23 Apr 2020 18:58:23 +0000 (-0400) Subject: Partially drop ext4-fix-extent_status-fragmentation-for-plain-files.patch X-Git-Tag: v4.19.119~61^2 X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=7bbd6a38e1fd935e0650b414785270ed6e448632;p=thirdparty%2Fkernel%2Fstable-queue.git Partially drop ext4-fix-extent_status-fragmentation-for-plain-files.patch Drop ext4-fix-extent_status-fragmentation-for-plain-files.patch from 4.14, 4.9, and 4.4. The patch will be re-added once the current release goes out. --- diff --git a/queue-4.14/ext4-fix-extent_status-fragmentation-for-plain-files.patch b/queue-4.14/ext4-fix-extent_status-fragmentation-for-plain-files.patch deleted file mode 100644 index 40acf77416f..00000000000 --- a/queue-4.14/ext4-fix-extent_status-fragmentation-for-plain-files.patch +++ /dev/null @@ -1,122 +0,0 @@ -From a5cdb45e6d63a0515da470b1c9a42f41866d3dce Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 6 Nov 2019 12:25:02 +0000 -Subject: ext4: fix extent_status fragmentation for plain files - -From: Dmitry Monakhov - -[ Upstream commit 4068664e3cd2312610ceac05b74c4cf1853b8325 ] - -Extents are cached in read_extent_tree_block(); as a result, extents -are not cached for inodes with depth == 0 when we try to find the -extent using ext4_find_extent(). The result of the lookup is cached -in ext4_map_blocks() but is only a subset of the extent on disk. As a -result, the contents of extents status cache can get very badly -fragmented for certain workloads, such as a random 4k read workload. - -File size of /mnt/test is 33554432 (8192 blocks of 4096 bytes) - ext: logical_offset: physical_offset: length: expected: flags: - 0: 0.. 8191: 40960.. 49151: 8192: last,eof - -$ perf record -e 'ext4:ext4_es_*' /root/bin/fio --name=t --direct=0 --rw=randread --bs=4k --filesize=32M --size=32M --filename=/mnt/test -$ perf script | grep ext4_es_insert_extent | head -n 10 - fio 131 [000] 13.975421: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [494/1) mapped 41454 status W - fio 131 [000] 13.975939: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [6064/1) mapped 47024 status W - fio 131 [000] 13.976467: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [6907/1) mapped 47867 status W - fio 131 [000] 13.976937: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [3850/1) mapped 44810 status W - fio 131 [000] 13.977440: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [3292/1) mapped 44252 status W - fio 131 [000] 13.977931: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [6882/1) mapped 47842 status W - fio 131 [000] 13.978376: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [3117/1) mapped 44077 status W - fio 131 [000] 13.978957: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [2896/1) mapped 43856 status W - fio 131 [000] 13.979474: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [7479/1) mapped 48439 status W - -Fix this by caching the extents for inodes with depth == 0 in -ext4_find_extent(). - -[ Renamed ext4_es_cache_extents() to ext4_cache_extents() since this - newly added function is not in extents_cache.c, and to avoid - potential visual confusion with ext4_es_cache_extent(). -TYT ] - -Signed-off-by: Dmitry Monakhov -Link: https://lore.kernel.org/r/20191106122502.19986-1-dmonakhov@gmail.com -Signed-off-by: Theodore Ts'o -Signed-off-by: Sasha Levin ---- - fs/ext4/extents.c | 47 +++++++++++++++++++++++++++-------------------- - 1 file changed, 27 insertions(+), 20 deletions(-) - -diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c -index fa6ae9014e8f6..34b79825efdc3 100644 ---- a/fs/ext4/extents.c -+++ b/fs/ext4/extents.c -@@ -510,6 +510,30 @@ int ext4_ext_check_inode(struct inode *inode) - return ext4_ext_check(inode, ext_inode_hdr(inode), ext_depth(inode), 0); - } - -+static void ext4_cache_extents(struct inode *inode, -+ struct ext4_extent_header *eh) -+{ -+ struct ext4_extent *ex = EXT_FIRST_EXTENT(eh); -+ ext4_lblk_t prev = 0; -+ int i; -+ -+ for (i = le16_to_cpu(eh->eh_entries); i > 0; i--, ex++) { -+ unsigned int status = EXTENT_STATUS_WRITTEN; -+ ext4_lblk_t lblk = le32_to_cpu(ex->ee_block); -+ int len = ext4_ext_get_actual_len(ex); -+ -+ if (prev && (prev != lblk)) -+ ext4_es_cache_extent(inode, prev, lblk - prev, ~0, -+ EXTENT_STATUS_HOLE); -+ -+ if (ext4_ext_is_unwritten(ex)) -+ status = EXTENT_STATUS_UNWRITTEN; -+ ext4_es_cache_extent(inode, lblk, len, -+ ext4_ext_pblock(ex), status); -+ prev = lblk + len; -+ } -+} -+ - static struct buffer_head * - __read_extent_tree_block(const char *function, unsigned int line, - struct inode *inode, ext4_fsblk_t pblk, int depth, -@@ -540,26 +564,7 @@ __read_extent_tree_block(const char *function, unsigned int line, - */ - if (!(flags & EXT4_EX_NOCACHE) && depth == 0) { - struct ext4_extent_header *eh = ext_block_hdr(bh); -- struct ext4_extent *ex = EXT_FIRST_EXTENT(eh); -- ext4_lblk_t prev = 0; -- int i; -- -- for (i = le16_to_cpu(eh->eh_entries); i > 0; i--, ex++) { -- unsigned int status = EXTENT_STATUS_WRITTEN; -- ext4_lblk_t lblk = le32_to_cpu(ex->ee_block); -- int len = ext4_ext_get_actual_len(ex); -- -- if (prev && (prev != lblk)) -- ext4_es_cache_extent(inode, prev, -- lblk - prev, ~0, -- EXTENT_STATUS_HOLE); -- -- if (ext4_ext_is_unwritten(ex)) -- status = EXTENT_STATUS_UNWRITTEN; -- ext4_es_cache_extent(inode, lblk, len, -- ext4_ext_pblock(ex), status); -- prev = lblk + len; -- } -+ ext4_cache_extents(inode, eh); - } - return bh; - errout: -@@ -907,6 +912,8 @@ ext4_find_extent(struct inode *inode, ext4_lblk_t block, - path[0].p_bh = NULL; - - i = depth; -+ if (!(flags & EXT4_EX_NOCACHE) && depth == 0) -+ ext4_cache_extents(inode, eh); - /* walk through the tree */ - while (i) { - ext_debug("depth %d: num %d, max %d\n", --- -2.20.1 - diff --git a/queue-4.14/series b/queue-4.14/series index e7f3b6896f3..41c50bcb7c3 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -196,4 +196,3 @@ mtd-lpddr-fix-a-double-free-in-probe.patch mtd-phram-fix-a-double-free-issue-in-error-path.patch keys-use-individual-pages-in-big_key-for-crypto-buffers.patch keys-don-t-write-out-to-userspace-while-holding-key-semaphore.patch -ext4-fix-extent_status-fragmentation-for-plain-files.patch diff --git a/queue-4.4/ext4-fix-extent_status-fragmentation-for-plain-files.patch b/queue-4.4/ext4-fix-extent_status-fragmentation-for-plain-files.patch deleted file mode 100644 index a458382317a..00000000000 --- a/queue-4.4/ext4-fix-extent_status-fragmentation-for-plain-files.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 122cf8e8ff888855ccc675d1e7d3ab73458160e2 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 6 Nov 2019 12:25:02 +0000 -Subject: ext4: fix extent_status fragmentation for plain files - -From: Dmitry Monakhov - -[ Upstream commit 4068664e3cd2312610ceac05b74c4cf1853b8325 ] - -Extents are cached in read_extent_tree_block(); as a result, extents -are not cached for inodes with depth == 0 when we try to find the -extent using ext4_find_extent(). The result of the lookup is cached -in ext4_map_blocks() but is only a subset of the extent on disk. As a -result, the contents of extents status cache can get very badly -fragmented for certain workloads, such as a random 4k read workload. - -File size of /mnt/test is 33554432 (8192 blocks of 4096 bytes) - ext: logical_offset: physical_offset: length: expected: flags: - 0: 0.. 8191: 40960.. 49151: 8192: last,eof - -$ perf record -e 'ext4:ext4_es_*' /root/bin/fio --name=t --direct=0 --rw=randread --bs=4k --filesize=32M --size=32M --filename=/mnt/test -$ perf script | grep ext4_es_insert_extent | head -n 10 - fio 131 [000] 13.975421: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [494/1) mapped 41454 status W - fio 131 [000] 13.975939: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [6064/1) mapped 47024 status W - fio 131 [000] 13.976467: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [6907/1) mapped 47867 status W - fio 131 [000] 13.976937: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [3850/1) mapped 44810 status W - fio 131 [000] 13.977440: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [3292/1) mapped 44252 status W - fio 131 [000] 13.977931: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [6882/1) mapped 47842 status W - fio 131 [000] 13.978376: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [3117/1) mapped 44077 status W - fio 131 [000] 13.978957: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [2896/1) mapped 43856 status W - fio 131 [000] 13.979474: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [7479/1) mapped 48439 status W - -Fix this by caching the extents for inodes with depth == 0 in -ext4_find_extent(). - -[ Renamed ext4_es_cache_extents() to ext4_cache_extents() since this - newly added function is not in extents_cache.c, and to avoid - potential visual confusion with ext4_es_cache_extent(). -TYT ] - -Signed-off-by: Dmitry Monakhov -Link: https://lore.kernel.org/r/20191106122502.19986-1-dmonakhov@gmail.com -Signed-off-by: Theodore Ts'o -Signed-off-by: Sasha Levin ---- - fs/ext4/extents.c | 47 +++++++++++++++++++++++++++-------------------- - 1 file changed, 27 insertions(+), 20 deletions(-) - -diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c -index 7414bfd5a58e7..a11283553abac 100644 ---- a/fs/ext4/extents.c -+++ b/fs/ext4/extents.c -@@ -505,6 +505,30 @@ int ext4_ext_check_inode(struct inode *inode) - return ext4_ext_check(inode, ext_inode_hdr(inode), ext_depth(inode), 0); - } - -+static void ext4_cache_extents(struct inode *inode, -+ struct ext4_extent_header *eh) -+{ -+ struct ext4_extent *ex = EXT_FIRST_EXTENT(eh); -+ ext4_lblk_t prev = 0; -+ int i; -+ -+ for (i = le16_to_cpu(eh->eh_entries); i > 0; i--, ex++) { -+ unsigned int status = EXTENT_STATUS_WRITTEN; -+ ext4_lblk_t lblk = le32_to_cpu(ex->ee_block); -+ int len = ext4_ext_get_actual_len(ex); -+ -+ if (prev && (prev != lblk)) -+ ext4_es_cache_extent(inode, prev, lblk - prev, ~0, -+ EXTENT_STATUS_HOLE); -+ -+ if (ext4_ext_is_unwritten(ex)) -+ status = EXTENT_STATUS_UNWRITTEN; -+ ext4_es_cache_extent(inode, lblk, len, -+ ext4_ext_pblock(ex), status); -+ prev = lblk + len; -+ } -+} -+ - static struct buffer_head * - __read_extent_tree_block(const char *function, unsigned int line, - struct inode *inode, ext4_fsblk_t pblk, int depth, -@@ -535,26 +559,7 @@ __read_extent_tree_block(const char *function, unsigned int line, - */ - if (!(flags & EXT4_EX_NOCACHE) && depth == 0) { - struct ext4_extent_header *eh = ext_block_hdr(bh); -- struct ext4_extent *ex = EXT_FIRST_EXTENT(eh); -- ext4_lblk_t prev = 0; -- int i; -- -- for (i = le16_to_cpu(eh->eh_entries); i > 0; i--, ex++) { -- unsigned int status = EXTENT_STATUS_WRITTEN; -- ext4_lblk_t lblk = le32_to_cpu(ex->ee_block); -- int len = ext4_ext_get_actual_len(ex); -- -- if (prev && (prev != lblk)) -- ext4_es_cache_extent(inode, prev, -- lblk - prev, ~0, -- EXTENT_STATUS_HOLE); -- -- if (ext4_ext_is_unwritten(ex)) -- status = EXTENT_STATUS_UNWRITTEN; -- ext4_es_cache_extent(inode, lblk, len, -- ext4_ext_pblock(ex), status); -- prev = lblk + len; -- } -+ ext4_cache_extents(inode, eh); - } - return bh; - errout: -@@ -902,6 +907,8 @@ ext4_find_extent(struct inode *inode, ext4_lblk_t block, - path[0].p_bh = NULL; - - i = depth; -+ if (!(flags & EXT4_EX_NOCACHE) && depth == 0) -+ ext4_cache_extents(inode, eh); - /* walk through the tree */ - while (i) { - ext_debug("depth %d: num %d, max %d\n", --- -2.20.1 - diff --git a/queue-4.4/series b/queue-4.4/series index 355dfa1c0bb..f31ee19b47f 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -97,4 +97,3 @@ mtd-phram-fix-a-double-free-issue-in-error-path.patch x86-cpu-add-native-cpuid-variants-returning-a-single-datum.patch x86-microcode-intel-replace-sync_core-with-native_cpuid_reg-eax.patch x86-vdso-fix-lsl-operand-order.patch -ext4-fix-extent_status-fragmentation-for-plain-files.patch diff --git a/queue-4.9/ext4-fix-extent_status-fragmentation-for-plain-files.patch b/queue-4.9/ext4-fix-extent_status-fragmentation-for-plain-files.patch deleted file mode 100644 index 7a1f3d68a41..00000000000 --- a/queue-4.9/ext4-fix-extent_status-fragmentation-for-plain-files.patch +++ /dev/null @@ -1,122 +0,0 @@ -From c61885c6d2299b795586963cd782fe461caf8a08 Mon Sep 17 00:00:00 2001 -From: Sasha Levin -Date: Wed, 6 Nov 2019 12:25:02 +0000 -Subject: ext4: fix extent_status fragmentation for plain files - -From: Dmitry Monakhov - -[ Upstream commit 4068664e3cd2312610ceac05b74c4cf1853b8325 ] - -Extents are cached in read_extent_tree_block(); as a result, extents -are not cached for inodes with depth == 0 when we try to find the -extent using ext4_find_extent(). The result of the lookup is cached -in ext4_map_blocks() but is only a subset of the extent on disk. As a -result, the contents of extents status cache can get very badly -fragmented for certain workloads, such as a random 4k read workload. - -File size of /mnt/test is 33554432 (8192 blocks of 4096 bytes) - ext: logical_offset: physical_offset: length: expected: flags: - 0: 0.. 8191: 40960.. 49151: 8192: last,eof - -$ perf record -e 'ext4:ext4_es_*' /root/bin/fio --name=t --direct=0 --rw=randread --bs=4k --filesize=32M --size=32M --filename=/mnt/test -$ perf script | grep ext4_es_insert_extent | head -n 10 - fio 131 [000] 13.975421: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [494/1) mapped 41454 status W - fio 131 [000] 13.975939: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [6064/1) mapped 47024 status W - fio 131 [000] 13.976467: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [6907/1) mapped 47867 status W - fio 131 [000] 13.976937: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [3850/1) mapped 44810 status W - fio 131 [000] 13.977440: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [3292/1) mapped 44252 status W - fio 131 [000] 13.977931: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [6882/1) mapped 47842 status W - fio 131 [000] 13.978376: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [3117/1) mapped 44077 status W - fio 131 [000] 13.978957: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [2896/1) mapped 43856 status W - fio 131 [000] 13.979474: ext4:ext4_es_insert_extent: dev 253,0 ino 12 es [7479/1) mapped 48439 status W - -Fix this by caching the extents for inodes with depth == 0 in -ext4_find_extent(). - -[ Renamed ext4_es_cache_extents() to ext4_cache_extents() since this - newly added function is not in extents_cache.c, and to avoid - potential visual confusion with ext4_es_cache_extent(). -TYT ] - -Signed-off-by: Dmitry Monakhov -Link: https://lore.kernel.org/r/20191106122502.19986-1-dmonakhov@gmail.com -Signed-off-by: Theodore Ts'o -Signed-off-by: Sasha Levin ---- - fs/ext4/extents.c | 47 +++++++++++++++++++++++++++-------------------- - 1 file changed, 27 insertions(+), 20 deletions(-) - -diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c -index 999d2a54297dc..5e51bf1193283 100644 ---- a/fs/ext4/extents.c -+++ b/fs/ext4/extents.c -@@ -510,6 +510,30 @@ int ext4_ext_check_inode(struct inode *inode) - return ext4_ext_check(inode, ext_inode_hdr(inode), ext_depth(inode), 0); - } - -+static void ext4_cache_extents(struct inode *inode, -+ struct ext4_extent_header *eh) -+{ -+ struct ext4_extent *ex = EXT_FIRST_EXTENT(eh); -+ ext4_lblk_t prev = 0; -+ int i; -+ -+ for (i = le16_to_cpu(eh->eh_entries); i > 0; i--, ex++) { -+ unsigned int status = EXTENT_STATUS_WRITTEN; -+ ext4_lblk_t lblk = le32_to_cpu(ex->ee_block); -+ int len = ext4_ext_get_actual_len(ex); -+ -+ if (prev && (prev != lblk)) -+ ext4_es_cache_extent(inode, prev, lblk - prev, ~0, -+ EXTENT_STATUS_HOLE); -+ -+ if (ext4_ext_is_unwritten(ex)) -+ status = EXTENT_STATUS_UNWRITTEN; -+ ext4_es_cache_extent(inode, lblk, len, -+ ext4_ext_pblock(ex), status); -+ prev = lblk + len; -+ } -+} -+ - static struct buffer_head * - __read_extent_tree_block(const char *function, unsigned int line, - struct inode *inode, ext4_fsblk_t pblk, int depth, -@@ -540,26 +564,7 @@ __read_extent_tree_block(const char *function, unsigned int line, - */ - if (!(flags & EXT4_EX_NOCACHE) && depth == 0) { - struct ext4_extent_header *eh = ext_block_hdr(bh); -- struct ext4_extent *ex = EXT_FIRST_EXTENT(eh); -- ext4_lblk_t prev = 0; -- int i; -- -- for (i = le16_to_cpu(eh->eh_entries); i > 0; i--, ex++) { -- unsigned int status = EXTENT_STATUS_WRITTEN; -- ext4_lblk_t lblk = le32_to_cpu(ex->ee_block); -- int len = ext4_ext_get_actual_len(ex); -- -- if (prev && (prev != lblk)) -- ext4_es_cache_extent(inode, prev, -- lblk - prev, ~0, -- EXTENT_STATUS_HOLE); -- -- if (ext4_ext_is_unwritten(ex)) -- status = EXTENT_STATUS_UNWRITTEN; -- ext4_es_cache_extent(inode, lblk, len, -- ext4_ext_pblock(ex), status); -- prev = lblk + len; -- } -+ ext4_cache_extents(inode, eh); - } - return bh; - errout: -@@ -907,6 +912,8 @@ ext4_find_extent(struct inode *inode, ext4_lblk_t block, - path[0].p_bh = NULL; - - i = depth; -+ if (!(flags & EXT4_EX_NOCACHE) && depth == 0) -+ ext4_cache_extents(inode, eh); - /* walk through the tree */ - while (i) { - ext_debug("depth %d: num %d, max %d\n", --- -2.20.1 - diff --git a/queue-4.9/series b/queue-4.9/series index 60e2c69a140..c8430981d49 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -122,4 +122,3 @@ mtd-phram-fix-a-double-free-issue-in-error-path.patch x86-cpu-add-native-cpuid-variants-returning-a-single-datum.patch x86-microcode-intel-replace-sync_core-with-native_cpuid_reg-eax.patch x86-vdso-fix-lsl-operand-order.patch -ext4-fix-extent_status-fragmentation-for-plain-files.patch