From: Sasha Levin Date: Sat, 9 Jan 2021 15:00:43 +0000 (-0500) Subject: Fixes for 5.10 X-Git-Tag: v4.4.251~58 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0440560f8f804eb3dd380d0474523bb8918b6c6a;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.10 Signed-off-by: Sasha Levin --- diff --git a/queue-5.10/block-add-debugfs-stanza-for-queue_flag_nowait.patch b/queue-5.10/block-add-debugfs-stanza-for-queue_flag_nowait.patch new file mode 100644 index 00000000000..e89e01642e0 --- /dev/null +++ b/queue-5.10/block-add-debugfs-stanza-for-queue_flag_nowait.patch @@ -0,0 +1,40 @@ +From 046ab31a70111f576b30e932dd3adfb81c0f8552 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 28 Dec 2020 11:27:18 -0800 +Subject: block: add debugfs stanza for QUEUE_FLAG_NOWAIT + +From: Andres Freund + +[ Upstream commit dc30432605bbbd486dfede3852ea4d42c40a84b4 ] + +This was missed in 021a24460dc2. Leads to the numeric value of +QUEUE_FLAG_NOWAIT (i.e. 29) showing up in +/sys/kernel/debug/block/*/state. + +Fixes: 021a24460dc28e7412aecfae89f60e1847e685c0 +Cc: Konstantin Khlebnikov +Cc: Mike Snitzer +Cc: Christoph Hellwig +Cc: Jens Axboe +Signed-off-by: Andres Freund +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + block/blk-mq-debugfs.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c +index 3094542e12ae0..e21eed20a1551 100644 +--- a/block/blk-mq-debugfs.c ++++ b/block/blk-mq-debugfs.c +@@ -129,6 +129,7 @@ static const char *const blk_queue_flag_name[] = { + QUEUE_FLAG_NAME(PCI_P2PDMA), + QUEUE_FLAG_NAME(ZONE_RESETALL), + QUEUE_FLAG_NAME(RQ_ALLOC_TIME), ++ QUEUE_FLAG_NAME(NOWAIT), + }; + #undef QUEUE_FLAG_NAME + +-- +2.27.0 + diff --git a/queue-5.10/depmod-handle-the-case-of-sbin-depmod-without-sbin-i.patch b/queue-5.10/depmod-handle-the-case-of-sbin-depmod-without-sbin-i.patch new file mode 100644 index 00000000000..ea136c0493b --- /dev/null +++ b/queue-5.10/depmod-handle-the-case-of-sbin-depmod-without-sbin-i.patch @@ -0,0 +1,40 @@ +From 5db5497e765ca1012777c86bc83b1d2e24b10758 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 28 Dec 2020 11:40:22 -0800 +Subject: depmod: handle the case of /sbin/depmod without /sbin in PATH + +From: Linus Torvalds + +[ Upstream commit cedd1862be7e666be87ec824dabc6a2b05618f36 ] + +Commit 436e980e2ed5 ("kbuild: don't hardcode depmod path") stopped +hard-coding the path of depmod, but in the process caused trouble for +distributions that had that /sbin location, but didn't have it in the +PATH (generally because /sbin is limited to the super-user path). + +Work around it for now by just adding /sbin to the end of PATH in the +depmod.sh script. + +Reported-and-tested-by: Sedat Dilek +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + scripts/depmod.sh | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/scripts/depmod.sh b/scripts/depmod.sh +index e083bcae343f3..3643b4f896ede 100755 +--- a/scripts/depmod.sh ++++ b/scripts/depmod.sh +@@ -15,6 +15,8 @@ if ! test -r System.map ; then + exit 0 + fi + ++# legacy behavior: "depmod" in /sbin, no /sbin in PATH ++PATH="$PATH:/sbin" + if [ -z $(command -v $DEPMOD) ]; then + echo "Warning: 'make modules_install' requires $DEPMOD. Please install it." >&2 + echo "This is probably in the kmod package." >&2 +-- +2.27.0 + diff --git a/queue-5.10/lib-genalloc-fix-the-overflow-when-size-is-too-big.patch b/queue-5.10/lib-genalloc-fix-the-overflow-when-size-is-too-big.patch new file mode 100644 index 00000000000..b18d38f7fe0 --- /dev/null +++ b/queue-5.10/lib-genalloc-fix-the-overflow-when-size-is-too-big.patch @@ -0,0 +1,131 @@ +From 9a65c64a32d7eab48884f48e076fb0fa0ad89660 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 29 Dec 2020 15:14:58 -0800 +Subject: lib/genalloc: fix the overflow when size is too big + +From: Huang Shijie + +[ Upstream commit 36845663843fc59c5d794e3dc0641472e3e572da ] + +Some graphic card has very big memory on chip, such as 32G bytes. + +In the following case, it will cause overflow: + + pool = gen_pool_create(PAGE_SHIFT, NUMA_NO_NODE); + ret = gen_pool_add(pool, 0x1000000, SZ_32G, NUMA_NO_NODE); + + va = gen_pool_alloc(pool, SZ_4G); + +The overflow occurs in gen_pool_alloc_algo_owner(): + + .... + size = nbits << order; + .... + +The @nbits is "int" type, so it will overflow. +Then the gen_pool_avail() will return the wrong value. + +This patch converts some "int" to "unsigned long", and +changes the compare code in while. + +Link: https://lkml.kernel.org/r/20201229060657.3389-1-sjhuang@iluvatar.ai +Signed-off-by: Huang Shijie +Reported-by: Shi Jiasheng +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + lib/genalloc.c | 25 +++++++++++++------------ + 1 file changed, 13 insertions(+), 12 deletions(-) + +diff --git a/lib/genalloc.c b/lib/genalloc.c +index 7f1244b5294a8..dab97bb69df63 100644 +--- a/lib/genalloc.c ++++ b/lib/genalloc.c +@@ -81,14 +81,14 @@ static int clear_bits_ll(unsigned long *addr, unsigned long mask_to_clear) + * users set the same bit, one user will return remain bits, otherwise + * return 0. + */ +-static int bitmap_set_ll(unsigned long *map, int start, int nr) ++static int bitmap_set_ll(unsigned long *map, unsigned long start, unsigned long nr) + { + unsigned long *p = map + BIT_WORD(start); +- const int size = start + nr; ++ const unsigned long size = start + nr; + int bits_to_set = BITS_PER_LONG - (start % BITS_PER_LONG); + unsigned long mask_to_set = BITMAP_FIRST_WORD_MASK(start); + +- while (nr - bits_to_set >= 0) { ++ while (nr >= bits_to_set) { + if (set_bits_ll(p, mask_to_set)) + return nr; + nr -= bits_to_set; +@@ -116,14 +116,15 @@ static int bitmap_set_ll(unsigned long *map, int start, int nr) + * users clear the same bit, one user will return remain bits, + * otherwise return 0. + */ +-static int bitmap_clear_ll(unsigned long *map, int start, int nr) ++static unsigned long ++bitmap_clear_ll(unsigned long *map, unsigned long start, unsigned long nr) + { + unsigned long *p = map + BIT_WORD(start); +- const int size = start + nr; ++ const unsigned long size = start + nr; + int bits_to_clear = BITS_PER_LONG - (start % BITS_PER_LONG); + unsigned long mask_to_clear = BITMAP_FIRST_WORD_MASK(start); + +- while (nr - bits_to_clear >= 0) { ++ while (nr >= bits_to_clear) { + if (clear_bits_ll(p, mask_to_clear)) + return nr; + nr -= bits_to_clear; +@@ -183,8 +184,8 @@ int gen_pool_add_owner(struct gen_pool *pool, unsigned long virt, phys_addr_t ph + size_t size, int nid, void *owner) + { + struct gen_pool_chunk *chunk; +- int nbits = size >> pool->min_alloc_order; +- int nbytes = sizeof(struct gen_pool_chunk) + ++ unsigned long nbits = size >> pool->min_alloc_order; ++ unsigned long nbytes = sizeof(struct gen_pool_chunk) + + BITS_TO_LONGS(nbits) * sizeof(long); + + chunk = vzalloc_node(nbytes, nid); +@@ -242,7 +243,7 @@ void gen_pool_destroy(struct gen_pool *pool) + struct list_head *_chunk, *_next_chunk; + struct gen_pool_chunk *chunk; + int order = pool->min_alloc_order; +- int bit, end_bit; ++ unsigned long bit, end_bit; + + list_for_each_safe(_chunk, _next_chunk, &pool->chunks) { + chunk = list_entry(_chunk, struct gen_pool_chunk, next_chunk); +@@ -278,7 +279,7 @@ unsigned long gen_pool_alloc_algo_owner(struct gen_pool *pool, size_t size, + struct gen_pool_chunk *chunk; + unsigned long addr = 0; + int order = pool->min_alloc_order; +- int nbits, start_bit, end_bit, remain; ++ unsigned long nbits, start_bit, end_bit, remain; + + #ifndef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG + BUG_ON(in_nmi()); +@@ -487,7 +488,7 @@ void gen_pool_free_owner(struct gen_pool *pool, unsigned long addr, size_t size, + { + struct gen_pool_chunk *chunk; + int order = pool->min_alloc_order; +- int start_bit, nbits, remain; ++ unsigned long start_bit, nbits, remain; + + #ifndef CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG + BUG_ON(in_nmi()); +@@ -755,7 +756,7 @@ unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size, + index = bitmap_find_next_zero_area(map, size, start, nr, 0); + + while (index < size) { +- int next_bit = find_next_bit(map, size, index + nr); ++ unsigned long next_bit = find_next_bit(map, size, index + nr); + if ((next_bit - index) < len) { + len = next_bit - index; + start_bit = index; +-- +2.27.0 + diff --git a/queue-5.10/local64.h-make-asm-local64.h-mandatory.patch b/queue-5.10/local64.h-make-asm-local64.h-mandatory.patch new file mode 100644 index 00000000000..3d552a6b9f7 --- /dev/null +++ b/queue-5.10/local64.h-make-asm-local64.h-mandatory.patch @@ -0,0 +1,291 @@ +From cb59d728f08f30e830333df4837cd877db971334 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 29 Dec 2020 15:14:49 -0800 +Subject: local64.h: make mandatory + +From: Randy Dunlap + +[ Upstream commit 87dbc209ea04645fd2351981f09eff5d23f8e2e9 ] + +Make mandatory in include/asm-generic/Kbuild and +remove all arch/*/include/asm/local64.h arch-specific files since they +only #include . + +This fixes build errors on arch/c6x/ and arch/nios2/ for +block/blk-iocost.c. + +Build-tested on 21 of 25 arch-es. (tools problems on the others) + +Yes, we could even rename to + and change all #includes to use + instead. + +Link: https://lkml.kernel.org/r/20201227024446.17018-1-rdunlap@infradead.org +Signed-off-by: Randy Dunlap +Suggested-by: Christoph Hellwig +Reviewed-by: Masahiro Yamada +Cc: Jens Axboe +Cc: Ley Foon Tan +Cc: Mark Salter +Cc: Aurelien Jacquiot +Cc: Peter Zijlstra +Cc: Arnd Bergmann +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + arch/alpha/include/asm/local64.h | 1 - + arch/arc/include/asm/Kbuild | 1 - + arch/arm/include/asm/Kbuild | 1 - + arch/arm64/include/asm/Kbuild | 1 - + arch/csky/include/asm/Kbuild | 1 - + arch/h8300/include/asm/Kbuild | 1 - + arch/hexagon/include/asm/Kbuild | 1 - + arch/ia64/include/asm/local64.h | 1 - + arch/m68k/include/asm/Kbuild | 1 - + arch/microblaze/include/asm/Kbuild | 1 - + arch/mips/include/asm/Kbuild | 1 - + arch/nds32/include/asm/Kbuild | 1 - + arch/parisc/include/asm/Kbuild | 1 - + arch/powerpc/include/asm/Kbuild | 1 - + arch/riscv/include/asm/Kbuild | 1 - + arch/s390/include/asm/Kbuild | 1 - + arch/sh/include/asm/Kbuild | 1 - + arch/sparc/include/asm/Kbuild | 1 - + arch/x86/include/asm/local64.h | 1 - + arch/xtensa/include/asm/Kbuild | 1 - + include/asm-generic/Kbuild | 1 + + 21 files changed, 1 insertion(+), 20 deletions(-) + delete mode 100644 arch/alpha/include/asm/local64.h + delete mode 100644 arch/ia64/include/asm/local64.h + delete mode 100644 arch/x86/include/asm/local64.h + +diff --git a/arch/alpha/include/asm/local64.h b/arch/alpha/include/asm/local64.h +deleted file mode 100644 +index 36c93b5cc239b..0000000000000 +--- a/arch/alpha/include/asm/local64.h ++++ /dev/null +@@ -1 +0,0 @@ +-#include +diff --git a/arch/arc/include/asm/Kbuild b/arch/arc/include/asm/Kbuild +index 81f4edec0c2a9..3c1afa524b9c2 100644 +--- a/arch/arc/include/asm/Kbuild ++++ b/arch/arc/include/asm/Kbuild +@@ -1,7 +1,6 @@ + # SPDX-License-Identifier: GPL-2.0 + generic-y += extable.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += mcs_spinlock.h + generic-y += parport.h + generic-y += user.h +diff --git a/arch/arm/include/asm/Kbuild b/arch/arm/include/asm/Kbuild +index 383635b68763c..f1398b9267c08 100644 +--- a/arch/arm/include/asm/Kbuild ++++ b/arch/arm/include/asm/Kbuild +@@ -2,7 +2,6 @@ + generic-y += early_ioremap.h + generic-y += extable.h + generic-y += flat.h +-generic-y += local64.h + generic-y += parport.h + generic-y += seccomp.h + +diff --git a/arch/arm64/include/asm/Kbuild b/arch/arm64/include/asm/Kbuild +index ff9cbb6312128..07ac208edc894 100644 +--- a/arch/arm64/include/asm/Kbuild ++++ b/arch/arm64/include/asm/Kbuild +@@ -1,6 +1,5 @@ + # SPDX-License-Identifier: GPL-2.0 + generic-y += early_ioremap.h +-generic-y += local64.h + generic-y += mcs_spinlock.h + generic-y += qrwlock.h + generic-y += qspinlock.h +diff --git a/arch/csky/include/asm/Kbuild b/arch/csky/include/asm/Kbuild +index 64876e59e2ef9..2a5a4d94fafad 100644 +--- a/arch/csky/include/asm/Kbuild ++++ b/arch/csky/include/asm/Kbuild +@@ -2,7 +2,6 @@ + generic-y += asm-offsets.h + generic-y += gpio.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += qrwlock.h + generic-y += seccomp.h + generic-y += user.h +diff --git a/arch/h8300/include/asm/Kbuild b/arch/h8300/include/asm/Kbuild +index ddf04f32b5467..60ee7f0d60a8f 100644 +--- a/arch/h8300/include/asm/Kbuild ++++ b/arch/h8300/include/asm/Kbuild +@@ -2,7 +2,6 @@ + generic-y += asm-offsets.h + generic-y += extable.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += mcs_spinlock.h + generic-y += parport.h + generic-y += spinlock.h +diff --git a/arch/hexagon/include/asm/Kbuild b/arch/hexagon/include/asm/Kbuild +index 373964bb177e4..3ece3c93fe086 100644 +--- a/arch/hexagon/include/asm/Kbuild ++++ b/arch/hexagon/include/asm/Kbuild +@@ -2,5 +2,4 @@ + generic-y += extable.h + generic-y += iomap.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += mcs_spinlock.h +diff --git a/arch/ia64/include/asm/local64.h b/arch/ia64/include/asm/local64.h +deleted file mode 100644 +index 36c93b5cc239b..0000000000000 +--- a/arch/ia64/include/asm/local64.h ++++ /dev/null +@@ -1 +0,0 @@ +-#include +diff --git a/arch/m68k/include/asm/Kbuild b/arch/m68k/include/asm/Kbuild +index 1bff55aa2d54e..0dbf9c5c6faeb 100644 +--- a/arch/m68k/include/asm/Kbuild ++++ b/arch/m68k/include/asm/Kbuild +@@ -2,6 +2,5 @@ + generated-y += syscall_table.h + generic-y += extable.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += mcs_spinlock.h + generic-y += spinlock.h +diff --git a/arch/microblaze/include/asm/Kbuild b/arch/microblaze/include/asm/Kbuild +index 63bce836b9f10..29b0e557aa7c5 100644 +--- a/arch/microblaze/include/asm/Kbuild ++++ b/arch/microblaze/include/asm/Kbuild +@@ -2,7 +2,6 @@ + generated-y += syscall_table.h + generic-y += extable.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += mcs_spinlock.h + generic-y += parport.h + generic-y += syscalls.h +diff --git a/arch/mips/include/asm/Kbuild b/arch/mips/include/asm/Kbuild +index 198b3bafdac97..95b4fa7bd0d1f 100644 +--- a/arch/mips/include/asm/Kbuild ++++ b/arch/mips/include/asm/Kbuild +@@ -6,7 +6,6 @@ generated-y += syscall_table_64_n64.h + generated-y += syscall_table_64_o32.h + generic-y += export.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += mcs_spinlock.h + generic-y += parport.h + generic-y += qrwlock.h +diff --git a/arch/nds32/include/asm/Kbuild b/arch/nds32/include/asm/Kbuild +index ff1e94299317d..82a4453c9c2d5 100644 +--- a/arch/nds32/include/asm/Kbuild ++++ b/arch/nds32/include/asm/Kbuild +@@ -4,6 +4,5 @@ generic-y += cmpxchg.h + generic-y += export.h + generic-y += gpio.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += parport.h + generic-y += user.h +diff --git a/arch/parisc/include/asm/Kbuild b/arch/parisc/include/asm/Kbuild +index e3ee5c0bfe80f..a1bd2adc63e3a 100644 +--- a/arch/parisc/include/asm/Kbuild ++++ b/arch/parisc/include/asm/Kbuild +@@ -3,7 +3,6 @@ generated-y += syscall_table_32.h + generated-y += syscall_table_64.h + generated-y += syscall_table_c32.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += mcs_spinlock.h + generic-y += seccomp.h + generic-y += user.h +diff --git a/arch/powerpc/include/asm/Kbuild b/arch/powerpc/include/asm/Kbuild +index 90cd5c53af666..e1f9b4ea1c537 100644 +--- a/arch/powerpc/include/asm/Kbuild ++++ b/arch/powerpc/include/asm/Kbuild +@@ -5,7 +5,6 @@ generated-y += syscall_table_c32.h + generated-y += syscall_table_spu.h + generic-y += export.h + generic-y += kvm_types.h +-generic-y += local64.h + generic-y += mcs_spinlock.h + generic-y += qrwlock.h + generic-y += vtime.h +diff --git a/arch/riscv/include/asm/Kbuild b/arch/riscv/include/asm/Kbuild +index 59dd7be550054..445ccc97305a5 100644 +--- a/arch/riscv/include/asm/Kbuild ++++ b/arch/riscv/include/asm/Kbuild +@@ -3,6 +3,5 @@ generic-y += early_ioremap.h + generic-y += extable.h + generic-y += flat.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += user.h + generic-y += vmlinux.lds.h +diff --git a/arch/s390/include/asm/Kbuild b/arch/s390/include/asm/Kbuild +index 319efa0e6d024..1a18d7b82f86d 100644 +--- a/arch/s390/include/asm/Kbuild ++++ b/arch/s390/include/asm/Kbuild +@@ -7,5 +7,4 @@ generated-y += unistd_nr.h + generic-y += asm-offsets.h + generic-y += export.h + generic-y += kvm_types.h +-generic-y += local64.h + generic-y += mcs_spinlock.h +diff --git a/arch/sh/include/asm/Kbuild b/arch/sh/include/asm/Kbuild +index 7435182ef8465..fc44d9c88b419 100644 +--- a/arch/sh/include/asm/Kbuild ++++ b/arch/sh/include/asm/Kbuild +@@ -1,6 +1,5 @@ + # SPDX-License-Identifier: GPL-2.0 + generated-y += syscall_table.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += mcs_spinlock.h + generic-y += parport.h +diff --git a/arch/sparc/include/asm/Kbuild b/arch/sparc/include/asm/Kbuild +index 5269a704801fa..3688fdae50e45 100644 +--- a/arch/sparc/include/asm/Kbuild ++++ b/arch/sparc/include/asm/Kbuild +@@ -6,5 +6,4 @@ generated-y += syscall_table_64.h + generated-y += syscall_table_c32.h + generic-y += export.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += mcs_spinlock.h +diff --git a/arch/x86/include/asm/local64.h b/arch/x86/include/asm/local64.h +deleted file mode 100644 +index 36c93b5cc239b..0000000000000 +--- a/arch/x86/include/asm/local64.h ++++ /dev/null +@@ -1 +0,0 @@ +-#include +diff --git a/arch/xtensa/include/asm/Kbuild b/arch/xtensa/include/asm/Kbuild +index c59c42a1221a8..adefb1636f7ae 100644 +--- a/arch/xtensa/include/asm/Kbuild ++++ b/arch/xtensa/include/asm/Kbuild +@@ -2,7 +2,6 @@ + generated-y += syscall_table.h + generic-y += extable.h + generic-y += kvm_para.h +-generic-y += local64.h + generic-y += mcs_spinlock.h + generic-y += param.h + generic-y += qrwlock.h +diff --git a/include/asm-generic/Kbuild b/include/asm-generic/Kbuild +index e78bbb9a07e90..d1300c6e0a471 100644 +--- a/include/asm-generic/Kbuild ++++ b/include/asm-generic/Kbuild +@@ -34,6 +34,7 @@ mandatory-y += kmap_types.h + mandatory-y += kprobes.h + mandatory-y += linkage.h + mandatory-y += local.h ++mandatory-y += local64.h + mandatory-y += mm-arch-hooks.h + mandatory-y += mmiowb.h + mandatory-y += mmu.h +-- +2.27.0 + diff --git a/queue-5.10/scsi-block-introduce-blk_mq_req_pm.patch b/queue-5.10/scsi-block-introduce-blk_mq_req_pm.patch new file mode 100644 index 00000000000..858116e63e6 --- /dev/null +++ b/queue-5.10/scsi-block-introduce-blk_mq_req_pm.patch @@ -0,0 +1,89 @@ +From a2cacef147f565df062d428bd20272151f1400cc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Dec 2020 21:29:45 -0800 +Subject: scsi: block: Introduce BLK_MQ_REQ_PM + +From: Bart Van Assche + +[ Upstream commit 0854bcdcdec26aecdc92c303816f349ee1fba2bc ] + +Introduce the BLK_MQ_REQ_PM flag. This flag makes the request allocation +functions set RQF_PM. This is the first step towards removing +BLK_MQ_REQ_PREEMPT. + +Link: https://lore.kernel.org/r/20201209052951.16136-3-bvanassche@acm.org +Cc: Alan Stern +Cc: Stanley Chu +Cc: Ming Lei +Cc: Rafael J. Wysocki +Cc: Can Guo +Reviewed-by: Christoph Hellwig +Reviewed-by: Hannes Reinecke +Reviewed-by: Jens Axboe +Reviewed-by: Can Guo +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + block/blk-core.c | 7 ++++--- + block/blk-mq.c | 2 ++ + include/linux/blk-mq.h | 2 ++ + 3 files changed, 8 insertions(+), 3 deletions(-) + +diff --git a/block/blk-core.c b/block/blk-core.c +index 2db8bda43b6e6..10696f9fb6ac6 100644 +--- a/block/blk-core.c ++++ b/block/blk-core.c +@@ -424,11 +424,11 @@ EXPORT_SYMBOL(blk_cleanup_queue); + /** + * blk_queue_enter() - try to increase q->q_usage_counter + * @q: request queue pointer +- * @flags: BLK_MQ_REQ_NOWAIT and/or BLK_MQ_REQ_PREEMPT ++ * @flags: BLK_MQ_REQ_NOWAIT, BLK_MQ_REQ_PM and/or BLK_MQ_REQ_PREEMPT + */ + int blk_queue_enter(struct request_queue *q, blk_mq_req_flags_t flags) + { +- const bool pm = flags & BLK_MQ_REQ_PREEMPT; ++ const bool pm = flags & (BLK_MQ_REQ_PM | BLK_MQ_REQ_PREEMPT); + + while (true) { + bool success = false; +@@ -630,7 +630,8 @@ struct request *blk_get_request(struct request_queue *q, unsigned int op, + struct request *req; + + WARN_ON_ONCE(op & REQ_NOWAIT); +- WARN_ON_ONCE(flags & ~(BLK_MQ_REQ_NOWAIT | BLK_MQ_REQ_PREEMPT)); ++ WARN_ON_ONCE(flags & ~(BLK_MQ_REQ_NOWAIT | BLK_MQ_REQ_PM | ++ BLK_MQ_REQ_PREEMPT)); + + req = blk_mq_alloc_request(q, op, flags); + if (!IS_ERR(req) && q->mq_ops->initialize_rq_fn) +diff --git a/block/blk-mq.c b/block/blk-mq.c +index 55bcee5dc0320..0072ffa50b46e 100644 +--- a/block/blk-mq.c ++++ b/block/blk-mq.c +@@ -292,6 +292,8 @@ static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data, + rq->mq_hctx = data->hctx; + rq->rq_flags = 0; + rq->cmd_flags = data->cmd_flags; ++ if (data->flags & BLK_MQ_REQ_PM) ++ rq->rq_flags |= RQF_PM; + if (data->flags & BLK_MQ_REQ_PREEMPT) + rq->rq_flags |= RQF_PREEMPT; + if (blk_queue_io_stat(data->q)) +diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h +index 794b2a33a2c36..c9ecfd8b03381 100644 +--- a/include/linux/blk-mq.h ++++ b/include/linux/blk-mq.h +@@ -446,6 +446,8 @@ enum { + BLK_MQ_REQ_NOWAIT = (__force blk_mq_req_flags_t)(1 << 0), + /* allocate from reserved pool */ + BLK_MQ_REQ_RESERVED = (__force blk_mq_req_flags_t)(1 << 1), ++ /* set RQF_PM */ ++ BLK_MQ_REQ_PM = (__force blk_mq_req_flags_t)(1 << 2), + /* set RQF_PREEMPT */ + BLK_MQ_REQ_PREEMPT = (__force blk_mq_req_flags_t)(1 << 3), + }; +-- +2.27.0 + diff --git a/queue-5.10/scsi-core-only-process-pm-requests-if-rpm_status-rpm.patch b/queue-5.10/scsi-core-only-process-pm-requests-if-rpm_status-rpm.patch new file mode 100644 index 00000000000..c89490e17be --- /dev/null +++ b/queue-5.10/scsi-core-only-process-pm-requests-if-rpm_status-rpm.patch @@ -0,0 +1,117 @@ +From 8d819d5b478f8c5f45c3c0a15b8d30a83b6aa701 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Dec 2020 21:29:49 -0800 +Subject: scsi: core: Only process PM requests if rpm_status != RPM_ACTIVE + +From: Bart Van Assche + +[ Upstream commit e6044f714b256259df9611ff49af433e5411c5c8 ] + +Instead of submitting all SCSI commands submitted with scsi_execute() to a +SCSI device if rpm_status != RPM_ACTIVE, only submit RQF_PM (power +management requests) if rpm_status != RPM_ACTIVE. This patch makes the SCSI +core handle the runtime power management status (rpm_status) as it should +be handled. + +Link: https://lore.kernel.org/r/20201209052951.16136-7-bvanassche@acm.org +Cc: Can Guo +Cc: Stanley Chu +Cc: Alan Stern +Cc: Ming Lei +Cc: Rafael J. Wysocki +Cc: Martin Kepplinger +Reviewed-by: Christoph Hellwig +Reviewed-by: Hannes Reinecke +Reviewed-by: Jens Axboe +Reviewed-by: Can Guo +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/scsi_lib.c | 27 ++++++++++++++------------- + 1 file changed, 14 insertions(+), 13 deletions(-) + +diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c +index 2d17137f8ff3b..31d7a6ddc9db7 100644 +--- a/drivers/scsi/scsi_lib.c ++++ b/drivers/scsi/scsi_lib.c +@@ -249,7 +249,8 @@ int __scsi_execute(struct scsi_device *sdev, const unsigned char *cmd, + + req = blk_get_request(sdev->request_queue, + data_direction == DMA_TO_DEVICE ? +- REQ_OP_SCSI_OUT : REQ_OP_SCSI_IN, BLK_MQ_REQ_PREEMPT); ++ REQ_OP_SCSI_OUT : REQ_OP_SCSI_IN, ++ rq_flags & RQF_PM ? BLK_MQ_REQ_PM : 0); + if (IS_ERR(req)) + return ret; + rq = scsi_req(req); +@@ -1203,6 +1204,8 @@ static blk_status_t + scsi_device_state_check(struct scsi_device *sdev, struct request *req) + { + switch (sdev->sdev_state) { ++ case SDEV_CREATED: ++ return BLK_STS_OK; + case SDEV_OFFLINE: + case SDEV_TRANSPORT_OFFLINE: + /* +@@ -1229,18 +1232,18 @@ scsi_device_state_check(struct scsi_device *sdev, struct request *req) + return BLK_STS_RESOURCE; + case SDEV_QUIESCE: + /* +- * If the devices is blocked we defer normal commands. ++ * If the device is blocked we only accept power management ++ * commands. + */ +- if (req && !(req->rq_flags & RQF_PREEMPT)) ++ if (req && WARN_ON_ONCE(!(req->rq_flags & RQF_PM))) + return BLK_STS_RESOURCE; + return BLK_STS_OK; + default: + /* + * For any other not fully online state we only allow +- * special commands. In particular any user initiated +- * command is not allowed. ++ * power management commands. + */ +- if (req && !(req->rq_flags & RQF_PREEMPT)) ++ if (req && !(req->rq_flags & RQF_PM)) + return BLK_STS_IOERR; + return BLK_STS_OK; + } +@@ -2508,15 +2511,13 @@ void sdev_evt_send_simple(struct scsi_device *sdev, + EXPORT_SYMBOL_GPL(sdev_evt_send_simple); + + /** +- * scsi_device_quiesce - Block user issued commands. ++ * scsi_device_quiesce - Block all commands except power management. + * @sdev: scsi device to quiesce. + * + * This works by trying to transition to the SDEV_QUIESCE state + * (which must be a legal transition). When the device is in this +- * state, only special requests will be accepted, all others will +- * be deferred. Since special requests may also be requeued requests, +- * a successful return doesn't guarantee the device will be +- * totally quiescent. ++ * state, only power management requests will be accepted, all others will ++ * be deferred. + * + * Must be called with user context, may sleep. + * +@@ -2578,12 +2579,12 @@ void scsi_device_resume(struct scsi_device *sdev) + * device deleted during suspend) + */ + mutex_lock(&sdev->state_mutex); ++ if (sdev->sdev_state == SDEV_QUIESCE) ++ scsi_device_set_state(sdev, SDEV_RUNNING); + if (sdev->quiesced_by) { + sdev->quiesced_by = NULL; + blk_clear_pm_only(sdev->request_queue); + } +- if (sdev->sdev_state == SDEV_QUIESCE) +- scsi_device_set_state(sdev, SDEV_RUNNING); + mutex_unlock(&sdev->state_mutex); + } + EXPORT_SYMBOL(scsi_device_resume); +-- +2.27.0 + diff --git a/queue-5.10/scsi-ide-do-not-set-the-rqf_preempt-flag-for-sense-r.patch b/queue-5.10/scsi-ide-do-not-set-the-rqf_preempt-flag-for-sense-r.patch new file mode 100644 index 00000000000..0cbcbc00ff1 --- /dev/null +++ b/queue-5.10/scsi-ide-do-not-set-the-rqf_preempt-flag-for-sense-r.patch @@ -0,0 +1,88 @@ +From 78d6087e93dd569349548647356e668fefa2b0ef Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Dec 2020 21:29:46 -0800 +Subject: scsi: ide: Do not set the RQF_PREEMPT flag for sense requests + +From: Bart Van Assche + +[ Upstream commit 96d86e6a80a3ab9aff81d12f9f1f2a0da2917d38 ] + +RQF_PREEMPT is used for two different purposes in the legacy IDE code: + + 1. To mark power management requests. + + 2. To mark requests that should preempt another request. An (old) + explanation of that feature is as follows: "The IDE driver in the Linux + kernel normally uses a series of busywait delays during its + initialization. When the driver executes these busywaits, the kernel + does nothing for the duration of the wait. The time spent in these + waits could be used for other initialization activities, if they could + be run concurrently with these waits. + + More specifically, busywait-style delays such as udelay() in module + init functions inhibit kernel preemption because the Big Kernel Lock is + held, while yielding APIs such as schedule_timeout() allow + preemption. This is true because the kernel handles the BKL specially + and releases and reacquires it across reschedules allowed by the + current thread. + + This IDE-preempt specification requires that the driver eliminate these + busywaits and replace them with a mechanism that allows other work to + proceed while the IDE driver is initializing." + +Since I haven't found an implementation of (2), do not set the PREEMPT flag +for sense requests. This patch causes sense requests to be postponed while +a drive is suspended instead of being submitted to ide_queue_rq(). + +If it would ever be necessary to restore the IDE PREEMPT functionality, +that can be done by introducing a new flag in struct ide_request. + +Link: https://lore.kernel.org/r/20201209052951.16136-4-bvanassche@acm.org +Cc: David S. Miller +Cc: Alan Stern +Cc: Can Guo +Cc: Stanley Chu +Cc: Ming Lei +Cc: Rafael J. Wysocki +Reviewed-by: Christoph Hellwig +Reviewed-by: Hannes Reinecke +Reviewed-by: Jens Axboe +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/ide/ide-atapi.c | 1 - + drivers/ide/ide-io.c | 5 ----- + 2 files changed, 6 deletions(-) + +diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c +index 2162bc80f09e0..013ad33fbbc81 100644 +--- a/drivers/ide/ide-atapi.c ++++ b/drivers/ide/ide-atapi.c +@@ -223,7 +223,6 @@ void ide_prep_sense(ide_drive_t *drive, struct request *rq) + sense_rq->rq_disk = rq->rq_disk; + sense_rq->cmd_flags = REQ_OP_DRV_IN; + ide_req(sense_rq)->type = ATA_PRIV_SENSE; +- sense_rq->rq_flags |= RQF_PREEMPT; + + req->cmd[0] = GPCMD_REQUEST_SENSE; + req->cmd[4] = cmd_len; +diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c +index 1a53c7a752244..c210ea3bd02fa 100644 +--- a/drivers/ide/ide-io.c ++++ b/drivers/ide/ide-io.c +@@ -515,11 +515,6 @@ repeat: + * above to return us whatever is in the queue. Since we call + * ide_do_request() ourselves, we end up taking requests while + * the queue is blocked... +- * +- * We let requests forced at head of queue with ide-preempt +- * though. I hope that doesn't happen too much, hopefully not +- * unless the subdriver triggers such a thing in its own PM +- * state machine. + */ + if ((drive->dev_flags & IDE_DFLAG_BLOCKED) && + ata_pm_request(rq) == 0 && +-- +2.27.0 + diff --git a/queue-5.10/scsi-ide-mark-power-management-requests-with-rqf_pm-.patch b/queue-5.10/scsi-ide-mark-power-management-requests-with-rqf_pm-.patch new file mode 100644 index 00000000000..7921bb3ee0c --- /dev/null +++ b/queue-5.10/scsi-ide-mark-power-management-requests-with-rqf_pm-.patch @@ -0,0 +1,59 @@ +From 218900f5a0562f5f92c361b5da82d0a4df1b984e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Dec 2020 21:29:47 -0800 +Subject: scsi: ide: Mark power management requests with RQF_PM instead of + RQF_PREEMPT + +From: Bart Van Assche + +[ Upstream commit 5ae65383fc7633e0247c31b0c8bf0e6ea63b95a3 ] + +This is another step that prepares for the removal of RQF_PREEMPT. + +Link: https://lore.kernel.org/r/20201209052951.16136-5-bvanassche@acm.org +Cc: David S. Miller +Cc: Alan Stern +Cc: Can Guo +Cc: Stanley Chu +Cc: Ming Lei +Cc: Rafael J. Wysocki +Reviewed-by: Christoph Hellwig +Reviewed-by: Hannes Reinecke +Reviewed-by: Jens Axboe +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/ide/ide-io.c | 2 +- + drivers/ide/ide-pm.c | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c +index c210ea3bd02fa..4867b67b60d69 100644 +--- a/drivers/ide/ide-io.c ++++ b/drivers/ide/ide-io.c +@@ -518,7 +518,7 @@ repeat: + */ + if ((drive->dev_flags & IDE_DFLAG_BLOCKED) && + ata_pm_request(rq) == 0 && +- (rq->rq_flags & RQF_PREEMPT) == 0) { ++ (rq->rq_flags & RQF_PM) == 0) { + /* there should be no pending command at this point */ + ide_unlock_port(hwif); + goto plug_device; +diff --git a/drivers/ide/ide-pm.c b/drivers/ide/ide-pm.c +index 192e6c65d34e7..82ab308f1aafe 100644 +--- a/drivers/ide/ide-pm.c ++++ b/drivers/ide/ide-pm.c +@@ -77,7 +77,7 @@ int generic_ide_resume(struct device *dev) + } + + memset(&rqpm, 0, sizeof(rqpm)); +- rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, BLK_MQ_REQ_PREEMPT); ++ rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, BLK_MQ_REQ_PM); + ide_req(rq)->type = ATA_PRIV_PM_RESUME; + ide_req(rq)->special = &rqpm; + rqpm.pm_step = IDE_PM_START_RESUME; +-- +2.27.0 + diff --git a/queue-5.10/scsi-scsi_transport_spi-set-rqf_pm-for-domain-valida.patch b/queue-5.10/scsi-scsi_transport_spi-set-rqf_pm-for-domain-valida.patch new file mode 100644 index 00000000000..84e25582727 --- /dev/null +++ b/queue-5.10/scsi-scsi_transport_spi-set-rqf_pm-for-domain-valida.patch @@ -0,0 +1,108 @@ +From 065556eea8f39c6b7803e05ad4f5c74622f7e6b0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Dec 2020 21:29:48 -0800 +Subject: scsi: scsi_transport_spi: Set RQF_PM for domain validation commands + +From: Bart Van Assche + +[ Upstream commit cfefd9f8240a7b9fdd96fcd54cb029870b6d8d88 ] + +Disable runtime power management during domain validation. Since a later +patch removes RQF_PREEMPT, set RQF_PM for domain validation commands such +that these are executed in the quiesced SCSI device state. + +Link: https://lore.kernel.org/r/20201209052951.16136-6-bvanassche@acm.org +Cc: Alan Stern +Cc: James Bottomley +Cc: Woody Suwalski +Cc: Can Guo +Cc: Stanley Chu +Cc: Ming Lei +Cc: Rafael J. Wysocki +Cc: Stan Johnson +Reviewed-by: Christoph Hellwig +Reviewed-by: Jens Axboe +Reviewed-by: Hannes Reinecke +Signed-off-by: Bart Van Assche +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/scsi_transport_spi.c | 27 +++++++++++++++++++-------- + 1 file changed, 19 insertions(+), 8 deletions(-) + +diff --git a/drivers/scsi/scsi_transport_spi.c b/drivers/scsi/scsi_transport_spi.c +index f3d5b1bbd5aa7..c37dd15d16d24 100644 +--- a/drivers/scsi/scsi_transport_spi.c ++++ b/drivers/scsi/scsi_transport_spi.c +@@ -117,12 +117,16 @@ static int spi_execute(struct scsi_device *sdev, const void *cmd, + sshdr = &sshdr_tmp; + + for(i = 0; i < DV_RETRIES; i++) { ++ /* ++ * The purpose of the RQF_PM flag below is to bypass the ++ * SDEV_QUIESCE state. ++ */ + result = scsi_execute(sdev, cmd, dir, buffer, bufflen, sense, + sshdr, DV_TIMEOUT, /* retries */ 1, + REQ_FAILFAST_DEV | + REQ_FAILFAST_TRANSPORT | + REQ_FAILFAST_DRIVER, +- 0, NULL); ++ RQF_PM, NULL); + if (driver_byte(result) != DRIVER_SENSE || + sshdr->sense_key != UNIT_ATTENTION) + break; +@@ -1005,23 +1009,26 @@ spi_dv_device(struct scsi_device *sdev) + */ + lock_system_sleep(); + ++ if (scsi_autopm_get_device(sdev)) ++ goto unlock_system_sleep; ++ + if (unlikely(spi_dv_in_progress(starget))) +- goto unlock; ++ goto put_autopm; + + if (unlikely(scsi_device_get(sdev))) +- goto unlock; ++ goto put_autopm; + + spi_dv_in_progress(starget) = 1; + + buffer = kzalloc(len, GFP_KERNEL); + + if (unlikely(!buffer)) +- goto out_put; ++ goto put_sdev; + + /* We need to verify that the actual device will quiesce; the + * later target quiesce is just a nice to have */ + if (unlikely(scsi_device_quiesce(sdev))) +- goto out_free; ++ goto free_buffer; + + scsi_target_quiesce(starget); + +@@ -1041,12 +1048,16 @@ spi_dv_device(struct scsi_device *sdev) + + spi_initial_dv(starget) = 1; + +- out_free: ++free_buffer: + kfree(buffer); +- out_put: ++ ++put_sdev: + spi_dv_in_progress(starget) = 0; + scsi_device_put(sdev); +-unlock: ++put_autopm: ++ scsi_autopm_put_device(sdev); ++ ++unlock_system_sleep: + unlock_system_sleep(); + } + EXPORT_SYMBOL(spi_dv_device); +-- +2.27.0 + diff --git a/queue-5.10/scsi-ufs-clear-uac-for-ffu-and-rpmb-luns.patch b/queue-5.10/scsi-ufs-clear-uac-for-ffu-and-rpmb-luns.patch new file mode 100644 index 00000000000..9fe7f4e2ec5 --- /dev/null +++ b/queue-5.10/scsi-ufs-clear-uac-for-ffu-and-rpmb-luns.patch @@ -0,0 +1,142 @@ +From 4e56cae30597c6acd650a0b1a7410de83c4b12a5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 17 Nov 2020 08:58:35 -0800 +Subject: scsi: ufs: Clear UAC for FFU and RPMB LUNs + +From: Jaegeuk Kim + +[ Upstream commit 4f3e900b628226011a5f71c19e53b175c014eb58 ] + +In order to conduct FFU or RPMB operations, UFS needs to clear UNIT +ATTENTION condition. Clear it explicitly so that we get no failures during +initialization. + +Link: https://lore.kernel.org/r/20201117165839.1643377-4-jaegeuk@kernel.org +Signed-off-by: Jaegeuk Kim +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/ufs/ufshcd.c | 70 +++++++++++++++++++++++++++++++++++---- + drivers/scsi/ufs/ufshcd.h | 1 + + 2 files changed, 65 insertions(+), 6 deletions(-) + +diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c +index ec7005bcf61d8..a6382e688082d 100644 +--- a/drivers/scsi/ufs/ufshcd.c ++++ b/drivers/scsi/ufs/ufshcd.c +@@ -7095,7 +7095,6 @@ static inline void ufshcd_blk_pm_runtime_init(struct scsi_device *sdev) + static int ufshcd_scsi_add_wlus(struct ufs_hba *hba) + { + int ret = 0; +- struct scsi_device *sdev_rpmb; + struct scsi_device *sdev_boot; + + hba->sdev_ufs_device = __scsi_add_device(hba->host, 0, 0, +@@ -7108,14 +7107,14 @@ static int ufshcd_scsi_add_wlus(struct ufs_hba *hba) + ufshcd_blk_pm_runtime_init(hba->sdev_ufs_device); + scsi_device_put(hba->sdev_ufs_device); + +- sdev_rpmb = __scsi_add_device(hba->host, 0, 0, ++ hba->sdev_rpmb = __scsi_add_device(hba->host, 0, 0, + ufshcd_upiu_wlun_to_scsi_wlun(UFS_UPIU_RPMB_WLUN), NULL); +- if (IS_ERR(sdev_rpmb)) { +- ret = PTR_ERR(sdev_rpmb); ++ if (IS_ERR(hba->sdev_rpmb)) { ++ ret = PTR_ERR(hba->sdev_rpmb); + goto remove_sdev_ufs_device; + } +- ufshcd_blk_pm_runtime_init(sdev_rpmb); +- scsi_device_put(sdev_rpmb); ++ ufshcd_blk_pm_runtime_init(hba->sdev_rpmb); ++ scsi_device_put(hba->sdev_rpmb); + + sdev_boot = __scsi_add_device(hba->host, 0, 0, + ufshcd_upiu_wlun_to_scsi_wlun(UFS_UPIU_BOOT_WLUN), NULL); +@@ -7639,6 +7638,63 @@ out: + return ret; + } + ++static int ++ufshcd_send_request_sense(struct ufs_hba *hba, struct scsi_device *sdp); ++ ++static int ufshcd_clear_ua_wlun(struct ufs_hba *hba, u8 wlun) ++{ ++ struct scsi_device *sdp; ++ unsigned long flags; ++ int ret = 0; ++ ++ spin_lock_irqsave(hba->host->host_lock, flags); ++ if (wlun == UFS_UPIU_UFS_DEVICE_WLUN) ++ sdp = hba->sdev_ufs_device; ++ else if (wlun == UFS_UPIU_RPMB_WLUN) ++ sdp = hba->sdev_rpmb; ++ else ++ BUG_ON(1); ++ if (sdp) { ++ ret = scsi_device_get(sdp); ++ if (!ret && !scsi_device_online(sdp)) { ++ ret = -ENODEV; ++ scsi_device_put(sdp); ++ } ++ } else { ++ ret = -ENODEV; ++ } ++ spin_unlock_irqrestore(hba->host->host_lock, flags); ++ if (ret) ++ goto out_err; ++ ++ ret = ufshcd_send_request_sense(hba, sdp); ++ scsi_device_put(sdp); ++out_err: ++ if (ret) ++ dev_err(hba->dev, "%s: UAC clear LU=%x ret = %d\n", ++ __func__, wlun, ret); ++ return ret; ++} ++ ++static int ufshcd_clear_ua_wluns(struct ufs_hba *hba) ++{ ++ int ret = 0; ++ ++ if (!hba->wlun_dev_clr_ua) ++ goto out; ++ ++ ret = ufshcd_clear_ua_wlun(hba, UFS_UPIU_UFS_DEVICE_WLUN); ++ if (!ret) ++ ret = ufshcd_clear_ua_wlun(hba, UFS_UPIU_RPMB_WLUN); ++ if (!ret) ++ hba->wlun_dev_clr_ua = false; ++out: ++ if (ret) ++ dev_err(hba->dev, "%s: Failed to clear UAC WLUNS ret = %d\n", ++ __func__, ret); ++ return ret; ++} ++ + /** + * ufshcd_probe_hba - probe hba to detect device and initialize + * @hba: per-adapter instance +@@ -7758,6 +7814,8 @@ out: + pm_runtime_put_sync(hba->dev); + ufshcd_exit_clk_scaling(hba); + ufshcd_hba_exit(hba); ++ } else { ++ ufshcd_clear_ua_wluns(hba); + } + } + +diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h +index cd51553e522da..6c62a281c8631 100644 +--- a/drivers/scsi/ufs/ufshcd.h ++++ b/drivers/scsi/ufs/ufshcd.h +@@ -683,6 +683,7 @@ struct ufs_hba { + * "UFS device" W-LU. + */ + struct scsi_device *sdev_ufs_device; ++ struct scsi_device *sdev_rpmb; + + enum ufs_dev_pwr_mode curr_dev_pwr_mode; + enum uic_link_state uic_link_state; +-- +2.27.0 + diff --git a/queue-5.10/scsi-ufs-clear-uac-for-rpmb-after-ufshcd-resets.patch b/queue-5.10/scsi-ufs-clear-uac-for-rpmb-after-ufshcd-resets.patch new file mode 100644 index 00000000000..702e26d65d9 --- /dev/null +++ b/queue-5.10/scsi-ufs-clear-uac-for-rpmb-after-ufshcd-resets.patch @@ -0,0 +1,73 @@ +From 878a87fe90377b2bc94f8f07c353061fcea6a6bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 30 Nov 2020 20:14:02 -0800 +Subject: scsi: ufs: Clear UAC for RPMB after ufshcd resets + +From: Randall Huang + +[ Upstream commit 1918651f2d7e8d58c9b7c49755c61e41ed655009 ] + +If RPMB is not provisioned, we may see RPMB failure after UFS +suspend/resume. Inject request_sense to clear uac in ufshcd reset flow. + +Link: https://lore.kernel.org/r/20201201041402.3860525-1-jaegeuk@kernel.org +Reported-by: kernel test robot +Reviewed-by: Stanley Chu +Signed-off-by: Randall Huang +Signed-off-by: Leo Liou +Signed-off-by: Jaegeuk Kim +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/ufs/ufshcd.c | 14 +++++--------- + 1 file changed, 5 insertions(+), 9 deletions(-) + +diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c +index d7e9c4bc80478..ec7005bcf61d8 100644 +--- a/drivers/scsi/ufs/ufshcd.c ++++ b/drivers/scsi/ufs/ufshcd.c +@@ -220,6 +220,7 @@ static int ufshcd_reset_and_restore(struct ufs_hba *hba); + static int ufshcd_eh_host_reset_handler(struct scsi_cmnd *cmd); + static int ufshcd_clear_tm_cmd(struct ufs_hba *hba, int tag); + static void ufshcd_hba_exit(struct ufs_hba *hba); ++static int ufshcd_clear_ua_wluns(struct ufs_hba *hba); + static int ufshcd_probe_hba(struct ufs_hba *hba, bool async); + static int __ufshcd_setup_clocks(struct ufs_hba *hba, bool on, + bool skip_ref_clk); +@@ -6842,7 +6843,8 @@ static int ufshcd_host_reset_and_restore(struct ufs_hba *hba) + + /* Establish the link again and restore the device */ + err = ufshcd_probe_hba(hba, false); +- ++ if (!err) ++ ufshcd_clear_ua_wluns(hba); + out: + if (err) + dev_err(hba->dev, "%s: Host init failed %d\n", __func__, err); +@@ -8274,13 +8276,7 @@ static int ufshcd_set_dev_pwr_mode(struct ufs_hba *hba, + * handling context. + */ + hba->host->eh_noresume = 1; +- if (hba->wlun_dev_clr_ua) { +- ret = ufshcd_send_request_sense(hba, sdp); +- if (ret) +- goto out; +- /* Unit attention condition is cleared now */ +- hba->wlun_dev_clr_ua = false; +- } ++ ufshcd_clear_ua_wluns(hba); + + cmd[4] = pwr_mode << 4; + +@@ -8301,7 +8297,7 @@ static int ufshcd_set_dev_pwr_mode(struct ufs_hba *hba, + + if (!ret) + hba->curr_dev_pwr_mode = pwr_mode; +-out: ++ + scsi_device_put(sdp); + hba->host->eh_noresume = 0; + return ret; +-- +2.27.0 + diff --git a/queue-5.10/scsi-ufs-fix-wrong-print-message-in-dev_err.patch b/queue-5.10/scsi-ufs-fix-wrong-print-message-in-dev_err.patch new file mode 100644 index 00000000000..631262b0e68 --- /dev/null +++ b/queue-5.10/scsi-ufs-fix-wrong-print-message-in-dev_err.patch @@ -0,0 +1,38 @@ +From be202eec95caa1d32222b0d65a18c6cfa75700d8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 7 Dec 2020 20:01:37 +0100 +Subject: scsi: ufs: Fix wrong print message in dev_err() + +From: Bean Huo + +[ Upstream commit 1fa0570002e3f66db9b58c32c60de4183b857a19 ] + +Change dev_err() print message from "dme-reset" to "dme_enable" in function +ufshcd_dme_enable(). + +Link: https://lore.kernel.org/r/20201207190137.6858-3-huobean@gmail.com +Acked-by: Alim Akhtar +Acked-by: Avri Altman +Signed-off-by: Bean Huo +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/ufs/ufshcd.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c +index 911aba3e7675c..d7e9c4bc80478 100644 +--- a/drivers/scsi/ufs/ufshcd.c ++++ b/drivers/scsi/ufs/ufshcd.c +@@ -3620,7 +3620,7 @@ static int ufshcd_dme_enable(struct ufs_hba *hba) + ret = ufshcd_send_uic_cmd(hba, &uic_cmd); + if (ret) + dev_err(hba->dev, +- "dme-reset: error code %d\n", ret); ++ "dme-enable: error code %d\n", ret); + + return ret; + } +-- +2.27.0 + diff --git a/queue-5.10/scsi-ufs-pci-enable-ufshcd_cap_rpm_autosuspend-for-i.patch b/queue-5.10/scsi-ufs-pci-enable-ufshcd_cap_rpm_autosuspend-for-i.patch new file mode 100644 index 00000000000..071f17693d8 --- /dev/null +++ b/queue-5.10/scsi-ufs-pci-enable-ufshcd_cap_rpm_autosuspend-for-i.patch @@ -0,0 +1,36 @@ +From f538956a11160cb039a9f45f212f0e420e4fb112 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 7 Dec 2020 10:31:20 +0200 +Subject: scsi: ufs-pci: Enable UFSHCD_CAP_RPM_AUTOSUSPEND for Intel + controllers + +From: Adrian Hunter + +[ Upstream commit dd78bdb6f810bdcb173b42379af558c676c8e0aa ] + +Enable runtime PM auto-suspend by default for Intel host controllers. + +Link: https://lore.kernel.org/r/20201207083120.26732-5-adrian.hunter@intel.com +Signed-off-by: Adrian Hunter +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/ufs/ufshcd-pci.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/scsi/ufs/ufshcd-pci.c b/drivers/scsi/ufs/ufshcd-pci.c +index 888d8c9ca3a55..fadd566025b86 100644 +--- a/drivers/scsi/ufs/ufshcd-pci.c ++++ b/drivers/scsi/ufs/ufshcd-pci.c +@@ -148,6 +148,8 @@ static int ufs_intel_common_init(struct ufs_hba *hba) + { + struct intel_host *host; + ++ hba->caps |= UFSHCD_CAP_RPM_AUTOSUSPEND; ++ + host = devm_kzalloc(hba->dev, sizeof(*host), GFP_KERNEL); + if (!host) + return -ENOMEM; +-- +2.27.0 + diff --git a/queue-5.10/scsi-ufs-pci-ensure-ufs-device-is-in-powerdown-mode-.patch b/queue-5.10/scsi-ufs-pci-ensure-ufs-device-is-in-powerdown-mode-.patch new file mode 100644 index 00000000000..2d96b73fd17 --- /dev/null +++ b/queue-5.10/scsi-ufs-pci-ensure-ufs-device-is-in-powerdown-mode-.patch @@ -0,0 +1,78 @@ +From 6d78d2312082a1ce871159caf8c40990cd25e4cb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 7 Dec 2020 10:31:18 +0200 +Subject: scsi: ufs-pci: Ensure UFS device is in PowerDown mode for + suspend-to-disk ->poweroff() + +From: Adrian Hunter + +[ Upstream commit af423534d2de86cd0db729a5ac41f056ca8717de ] + +The expectation for suspend-to-disk is that devices will be powered-off, so +the UFS device should be put in PowerDown mode. If spm_lvl is not 5, then +that will not happen. Change the pm callbacks to force spm_lvl 5 for +suspend-to-disk poweroff. + +Link: https://lore.kernel.org/r/20201207083120.26732-3-adrian.hunter@intel.com +Signed-off-by: Adrian Hunter +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/ufs/ufshcd-pci.c | 34 ++++++++++++++++++++++++++++++++-- + 1 file changed, 32 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/ufs/ufshcd-pci.c b/drivers/scsi/ufs/ufshcd-pci.c +index 360c25f1f061a..5d33c39fa82f0 100644 +--- a/drivers/scsi/ufs/ufshcd-pci.c ++++ b/drivers/scsi/ufs/ufshcd-pci.c +@@ -227,6 +227,30 @@ static int ufshcd_pci_resume(struct device *dev) + { + return ufshcd_system_resume(dev_get_drvdata(dev)); + } ++ ++/** ++ * ufshcd_pci_poweroff - suspend-to-disk poweroff function ++ * @dev: pointer to PCI device handle ++ * ++ * Returns 0 if successful ++ * Returns non-zero otherwise ++ */ ++static int ufshcd_pci_poweroff(struct device *dev) ++{ ++ struct ufs_hba *hba = dev_get_drvdata(dev); ++ int spm_lvl = hba->spm_lvl; ++ int ret; ++ ++ /* ++ * For poweroff we need to set the UFS device to PowerDown mode. ++ * Force spm_lvl to ensure that. ++ */ ++ hba->spm_lvl = 5; ++ ret = ufshcd_system_suspend(hba); ++ hba->spm_lvl = spm_lvl; ++ return ret; ++} ++ + #endif /* !CONFIG_PM_SLEEP */ + + #ifdef CONFIG_PM +@@ -322,8 +346,14 @@ ufshcd_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) + } + + static const struct dev_pm_ops ufshcd_pci_pm_ops = { +- SET_SYSTEM_SLEEP_PM_OPS(ufshcd_pci_suspend, +- ufshcd_pci_resume) ++#ifdef CONFIG_PM_SLEEP ++ .suspend = ufshcd_pci_suspend, ++ .resume = ufshcd_pci_resume, ++ .freeze = ufshcd_pci_suspend, ++ .thaw = ufshcd_pci_resume, ++ .poweroff = ufshcd_pci_poweroff, ++ .restore = ufshcd_pci_resume, ++#endif + SET_RUNTIME_PM_OPS(ufshcd_pci_runtime_suspend, + ufshcd_pci_runtime_resume, + ufshcd_pci_runtime_idle) +-- +2.27.0 + diff --git a/queue-5.10/scsi-ufs-pci-fix-recovery-from-hibernate-exit-errors.patch b/queue-5.10/scsi-ufs-pci-fix-recovery-from-hibernate-exit-errors.patch new file mode 100644 index 00000000000..561f55761ef --- /dev/null +++ b/queue-5.10/scsi-ufs-pci-fix-recovery-from-hibernate-exit-errors.patch @@ -0,0 +1,53 @@ +From e68bfe6163562dc33f61229e79dc90ccc3a1a0db Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 7 Dec 2020 10:31:19 +0200 +Subject: scsi: ufs-pci: Fix recovery from hibernate exit errors for Intel + controllers + +From: Adrian Hunter + +[ Upstream commit 044d5bda7117891d6d0d56f2f807b7b11e120abd ] + +Intel controllers can end up in an unrecoverable state after a hibernate +exit error unless a full reset and restore is done before anything else. +Force that to happen. + +Link: https://lore.kernel.org/r/20201207083120.26732-4-adrian.hunter@intel.com +Signed-off-by: Adrian Hunter +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/ufs/ufshcd-pci.c | 17 +++++++++++++++++ + 1 file changed, 17 insertions(+) + +diff --git a/drivers/scsi/ufs/ufshcd-pci.c b/drivers/scsi/ufs/ufshcd-pci.c +index 5d33c39fa82f0..888d8c9ca3a55 100644 +--- a/drivers/scsi/ufs/ufshcd-pci.c ++++ b/drivers/scsi/ufs/ufshcd-pci.c +@@ -178,6 +178,23 @@ static int ufs_intel_resume(struct ufs_hba *hba, enum ufs_pm_op op) + REG_UTP_TASK_REQ_LIST_BASE_L); + ufshcd_writel(hba, upper_32_bits(hba->utmrdl_dma_addr), + REG_UTP_TASK_REQ_LIST_BASE_H); ++ ++ if (ufshcd_is_link_hibern8(hba)) { ++ int ret = ufshcd_uic_hibern8_exit(hba); ++ ++ if (!ret) { ++ ufshcd_set_link_active(hba); ++ } else { ++ dev_err(hba->dev, "%s: hibern8 exit failed %d\n", ++ __func__, ret); ++ /* ++ * Force reset and restore. Any other actions can lead ++ * to an unrecoverable state. ++ */ ++ ufshcd_set_link_off(hba); ++ } ++ } ++ + return 0; + } + +-- +2.27.0 + diff --git a/queue-5.10/scsi-ufs-pci-fix-restore-from-s4-for-intel-controlle.patch b/queue-5.10/scsi-ufs-pci-fix-restore-from-s4-for-intel-controlle.patch new file mode 100644 index 00000000000..a929bd11982 --- /dev/null +++ b/queue-5.10/scsi-ufs-pci-fix-restore-from-s4-for-intel-controlle.patch @@ -0,0 +1,81 @@ +From ab183fbd28f827607f91275a3846a389566b0282 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 7 Dec 2020 10:31:17 +0200 +Subject: scsi: ufs-pci: Fix restore from S4 for Intel controllers + +From: Adrian Hunter + +[ Upstream commit c763729a10e538d997744317cf4a1c4f25266066 ] + +Currently, ufshcd-pci is the only UFS driver with support for +suspend-to-disk PM callbacks (i.e. freeze/thaw/restore/poweroff). These +callbacks are set by the macro SET_SYSTEM_SLEEP_PM_OPS to the same +functions as system suspend/resume. That will work with spm_lvl 5 because +spm_lvl 5 will result in a full restore for the ->restore() callback. In +the absence of a full restore, the host controller registers will have +values set up by the restore kernel (the kernel that boots and loads the +restore image) which are not necessarily the same. However it turns out, +the only registers that sometimes need restore are the base address +registers. This has gone un-noticed because, depending on IOMMU settings, +the kernel can end up allocating the same addresses every time. + +For Intel controllers, an spm_lvl other than 5 can be used, so to support +S4 (suspend-to-disk) with spm_lvl other than 5, restore the base address +registers. + +Link: https://lore.kernel.org/r/20201207083120.26732-2-adrian.hunter@intel.com +Signed-off-by: Adrian Hunter +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/ufs/ufshcd-pci.c | 20 ++++++++++++++++++++ + 1 file changed, 20 insertions(+) + +diff --git a/drivers/scsi/ufs/ufshcd-pci.c b/drivers/scsi/ufs/ufshcd-pci.c +index df3a564c3e334..360c25f1f061a 100644 +--- a/drivers/scsi/ufs/ufshcd-pci.c ++++ b/drivers/scsi/ufs/ufshcd-pci.c +@@ -163,6 +163,24 @@ static void ufs_intel_common_exit(struct ufs_hba *hba) + intel_ltr_hide(hba->dev); + } + ++static int ufs_intel_resume(struct ufs_hba *hba, enum ufs_pm_op op) ++{ ++ /* ++ * To support S4 (suspend-to-disk) with spm_lvl other than 5, the base ++ * address registers must be restored because the restore kernel can ++ * have used different addresses. ++ */ ++ ufshcd_writel(hba, lower_32_bits(hba->utrdl_dma_addr), ++ REG_UTP_TRANSFER_REQ_LIST_BASE_L); ++ ufshcd_writel(hba, upper_32_bits(hba->utrdl_dma_addr), ++ REG_UTP_TRANSFER_REQ_LIST_BASE_H); ++ ufshcd_writel(hba, lower_32_bits(hba->utmrdl_dma_addr), ++ REG_UTP_TASK_REQ_LIST_BASE_L); ++ ufshcd_writel(hba, upper_32_bits(hba->utmrdl_dma_addr), ++ REG_UTP_TASK_REQ_LIST_BASE_H); ++ return 0; ++} ++ + static int ufs_intel_ehl_init(struct ufs_hba *hba) + { + hba->quirks |= UFSHCD_QUIRK_BROKEN_AUTO_HIBERN8; +@@ -174,6 +192,7 @@ static struct ufs_hba_variant_ops ufs_intel_cnl_hba_vops = { + .init = ufs_intel_common_init, + .exit = ufs_intel_common_exit, + .link_startup_notify = ufs_intel_link_startup_notify, ++ .resume = ufs_intel_resume, + }; + + static struct ufs_hba_variant_ops ufs_intel_ehl_hba_vops = { +@@ -181,6 +200,7 @@ static struct ufs_hba_variant_ops ufs_intel_ehl_hba_vops = { + .init = ufs_intel_ehl_init, + .exit = ufs_intel_common_exit, + .link_startup_notify = ufs_intel_link_startup_notify, ++ .resume = ufs_intel_resume, + }; + + #ifdef CONFIG_PM_SLEEP +-- +2.27.0 + diff --git a/queue-5.10/selftests-vm-fix-building-protection-keys-test.patch b/queue-5.10/selftests-vm-fix-building-protection-keys-test.patch new file mode 100644 index 00000000000..5a184404bf4 --- /dev/null +++ b/queue-5.10/selftests-vm-fix-building-protection-keys-test.patch @@ -0,0 +1,83 @@ +From 5109c87d9acdce7cd5b4c2886786c83800470161 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 29 Dec 2020 15:14:22 -0800 +Subject: selftests/vm: fix building protection keys test + +From: Harish + +[ Upstream commit 7cf22a1c88c05ea3807f95b1edfebb729016ae52 ] + +Commit d8cbe8bfa7d ("tools/testing/selftests/vm: fix build error") tried +to include a ARCH check for powerpc, however ARCH is not defined in the +Makefile before including lib.mk. This makes test building to skip on +both x86 and powerpc. + +Fix the arch check by replacing it using machine type as it is already +defined and used in the test. + +Link: https://lkml.kernel.org/r/20201215100402.257376-1-harish@linux.ibm.com +Fixes: d8cbe8bfa7d ("tools/testing/selftests/vm: fix build error") +Signed-off-by: Harish +Reviewed-by: Sandipan Das +Cc: Shuah Khan +Cc: Sandipan Das +Cc: John Hubbard +Cc: Dave Hansen +Cc: Kirill A. Shutemov +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + tools/testing/selftests/vm/Makefile | 10 +++++----- + 1 file changed, 5 insertions(+), 5 deletions(-) + +diff --git a/tools/testing/selftests/vm/Makefile b/tools/testing/selftests/vm/Makefile +index 691893afc15d8..e63f316327080 100644 +--- a/tools/testing/selftests/vm/Makefile ++++ b/tools/testing/selftests/vm/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + # Makefile for vm selftests + uname_M := $(shell uname -m 2>/dev/null || echo not) +-MACHINE ?= $(shell echo $(uname_M) | sed -e 's/aarch64.*/arm64/') ++MACHINE ?= $(shell echo $(uname_M) | sed -e 's/aarch64.*/arm64/' -e 's/ppc64.*/ppc64/') + + # Without this, failed build products remain, with up-to-date timestamps, + # thus tricking Make (and you!) into believing that All Is Well, in subsequent +@@ -39,7 +39,7 @@ TEST_GEN_FILES += transhuge-stress + TEST_GEN_FILES += userfaultfd + TEST_GEN_FILES += khugepaged + +-ifeq ($(ARCH),x86_64) ++ifeq ($(MACHINE),x86_64) + CAN_BUILD_I386 := $(shell ./../x86/check_cc.sh $(CC) ../x86/trivial_32bit_program.c -m32) + CAN_BUILD_X86_64 := $(shell ./../x86/check_cc.sh $(CC) ../x86/trivial_64bit_program.c) + CAN_BUILD_WITH_NOPIE := $(shell ./../x86/check_cc.sh $(CC) ../x86/trivial_program.c -no-pie) +@@ -61,13 +61,13 @@ TEST_GEN_FILES += $(BINARIES_64) + endif + else + +-ifneq (,$(findstring $(ARCH),powerpc)) ++ifneq (,$(findstring $(MACHINE),ppc64)) + TEST_GEN_FILES += protection_keys + endif + + endif + +-ifneq (,$(filter $(MACHINE),arm64 ia64 mips64 parisc64 ppc64 ppc64le riscv64 s390x sh64 sparc64 x86_64)) ++ifneq (,$(filter $(MACHINE),arm64 ia64 mips64 parisc64 ppc64 riscv64 s390x sh64 sparc64 x86_64)) + TEST_GEN_FILES += va_128TBswitch + TEST_GEN_FILES += virtual_address_range + TEST_GEN_FILES += write_to_hugetlbfs +@@ -82,7 +82,7 @@ include ../lib.mk + + $(OUTPUT)/hmm-tests: LDLIBS += -lhugetlbfs -lpthread + +-ifeq ($(ARCH),x86_64) ++ifeq ($(MACHINE),x86_64) + BINARIES_32 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_32)) + BINARIES_64 := $(patsubst %,$(OUTPUT)/%,$(BINARIES_64)) + +-- +2.27.0 + diff --git a/queue-5.10/series b/queue-5.10/series new file mode 100644 index 00000000000..cf6c82a8b7d --- /dev/null +++ b/queue-5.10/series @@ -0,0 +1,18 @@ +selftests-vm-fix-building-protection-keys-test.patch +block-add-debugfs-stanza-for-queue_flag_nowait.patch +workqueue-kick-a-worker-based-on-the-actual-activati.patch +scsi-ufs-fix-wrong-print-message-in-dev_err.patch +scsi-ufs-clear-uac-for-rpmb-after-ufshcd-resets.patch +scsi-ufs-pci-fix-restore-from-s4-for-intel-controlle.patch +scsi-ufs-pci-ensure-ufs-device-is-in-powerdown-mode-.patch +scsi-ufs-pci-fix-recovery-from-hibernate-exit-errors.patch +scsi-ufs-pci-enable-ufshcd_cap_rpm_autosuspend-for-i.patch +scsi-block-introduce-blk_mq_req_pm.patch +scsi-ide-do-not-set-the-rqf_preempt-flag-for-sense-r.patch +scsi-ide-mark-power-management-requests-with-rqf_pm-.patch +scsi-scsi_transport_spi-set-rqf_pm-for-domain-valida.patch +scsi-core-only-process-pm-requests-if-rpm_status-rpm.patch +local64.h-make-asm-local64.h-mandatory.patch +lib-genalloc-fix-the-overflow-when-size-is-too-big.patch +depmod-handle-the-case-of-sbin-depmod-without-sbin-i.patch +scsi-ufs-clear-uac-for-ffu-and-rpmb-luns.patch diff --git a/queue-5.10/workqueue-kick-a-worker-based-on-the-actual-activati.patch b/queue-5.10/workqueue-kick-a-worker-based-on-the-actual-activati.patch new file mode 100644 index 00000000000..c68aef2bdf4 --- /dev/null +++ b/queue-5.10/workqueue-kick-a-worker-based-on-the-actual-activati.patch @@ -0,0 +1,69 @@ +From 30eb0376b9e969792660180daf5ace1f9db21ccc Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 19 Nov 2020 14:21:25 +0800 +Subject: workqueue: Kick a worker based on the actual activation of delayed + works + +From: Yunfeng Ye + +[ Upstream commit 01341fbd0d8d4e717fc1231cdffe00343088ce0b ] + +In realtime scenario, We do not want to have interference on the +isolated cpu cores. but when invoking alloc_workqueue() for percpu wq +on the housekeeping cpu, it kick a kworker on the isolated cpu. + + alloc_workqueue + pwq_adjust_max_active + wake_up_worker + +The comment in pwq_adjust_max_active() said: + "Need to kick a worker after thawed or an unbound wq's + max_active is bumped" + +So it is unnecessary to kick a kworker for percpu's wq when invoking +alloc_workqueue(). this patch only kick a worker based on the actual +activation of delayed works. + +Signed-off-by: Yunfeng Ye +Reviewed-by: Lai Jiangshan +Signed-off-by: Tejun Heo +Signed-off-by: Sasha Levin +--- + kernel/workqueue.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +diff --git a/kernel/workqueue.c b/kernel/workqueue.c +index 437935e7a1991..0695c7895c892 100644 +--- a/kernel/workqueue.c ++++ b/kernel/workqueue.c +@@ -3728,17 +3728,24 @@ static void pwq_adjust_max_active(struct pool_workqueue *pwq) + * is updated and visible. + */ + if (!freezable || !workqueue_freezing) { ++ bool kick = false; ++ + pwq->max_active = wq->saved_max_active; + + while (!list_empty(&pwq->delayed_works) && +- pwq->nr_active < pwq->max_active) ++ pwq->nr_active < pwq->max_active) { + pwq_activate_first_delayed(pwq); ++ kick = true; ++ } + + /* + * Need to kick a worker after thawed or an unbound wq's +- * max_active is bumped. It's a slow path. Do it always. ++ * max_active is bumped. In realtime scenarios, always kicking a ++ * worker will cause interference on the isolated cpu cores, so ++ * let's kick iff work items were activated. + */ +- wake_up_worker(pwq->pool); ++ if (kick) ++ wake_up_worker(pwq->pool); + } else { + pwq->max_active = 0; + } +-- +2.27.0 +