]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.10
authorSasha Levin <sashal@kernel.org>
Sat, 9 Jan 2021 15:00:43 +0000 (10:00 -0500)
committerSasha Levin <sashal@kernel.org>
Sat, 9 Jan 2021 15:00:43 +0000 (10:00 -0500)
Signed-off-by: Sasha Levin <sashal@kernel.org>
19 files changed:
queue-5.10/block-add-debugfs-stanza-for-queue_flag_nowait.patch [new file with mode: 0644]
queue-5.10/depmod-handle-the-case-of-sbin-depmod-without-sbin-i.patch [new file with mode: 0644]
queue-5.10/lib-genalloc-fix-the-overflow-when-size-is-too-big.patch [new file with mode: 0644]
queue-5.10/local64.h-make-asm-local64.h-mandatory.patch [new file with mode: 0644]
queue-5.10/scsi-block-introduce-blk_mq_req_pm.patch [new file with mode: 0644]
queue-5.10/scsi-core-only-process-pm-requests-if-rpm_status-rpm.patch [new file with mode: 0644]
queue-5.10/scsi-ide-do-not-set-the-rqf_preempt-flag-for-sense-r.patch [new file with mode: 0644]
queue-5.10/scsi-ide-mark-power-management-requests-with-rqf_pm-.patch [new file with mode: 0644]
queue-5.10/scsi-scsi_transport_spi-set-rqf_pm-for-domain-valida.patch [new file with mode: 0644]
queue-5.10/scsi-ufs-clear-uac-for-ffu-and-rpmb-luns.patch [new file with mode: 0644]
queue-5.10/scsi-ufs-clear-uac-for-rpmb-after-ufshcd-resets.patch [new file with mode: 0644]
queue-5.10/scsi-ufs-fix-wrong-print-message-in-dev_err.patch [new file with mode: 0644]
queue-5.10/scsi-ufs-pci-enable-ufshcd_cap_rpm_autosuspend-for-i.patch [new file with mode: 0644]
queue-5.10/scsi-ufs-pci-ensure-ufs-device-is-in-powerdown-mode-.patch [new file with mode: 0644]
queue-5.10/scsi-ufs-pci-fix-recovery-from-hibernate-exit-errors.patch [new file with mode: 0644]
queue-5.10/scsi-ufs-pci-fix-restore-from-s4-for-intel-controlle.patch [new file with mode: 0644]
queue-5.10/selftests-vm-fix-building-protection-keys-test.patch [new file with mode: 0644]
queue-5.10/series [new file with mode: 0644]
queue-5.10/workqueue-kick-a-worker-based-on-the-actual-activati.patch [new file with mode: 0644]

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 (file)
index 0000000..e89e016
--- /dev/null
@@ -0,0 +1,40 @@
+From 046ab31a70111f576b30e932dd3adfb81c0f8552 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 28 Dec 2020 11:27:18 -0800
+Subject: block: add debugfs stanza for QUEUE_FLAG_NOWAIT
+
+From: Andres Freund <andres@anarazel.de>
+
+[ 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 <khlebnikov@yandex-team.ru>
+Cc: Mike Snitzer <snitzer@redhat.com>
+Cc: Christoph Hellwig <hch@lst.de>
+Cc: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Andres Freund <andres@anarazel.de>
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..ea136c0
--- /dev/null
@@ -0,0 +1,40 @@
+From 5db5497e765ca1012777c86bc83b1d2e24b10758 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 28 Dec 2020 11:40:22 -0800
+Subject: depmod: handle the case of /sbin/depmod without /sbin in PATH
+
+From: Linus Torvalds <torvalds@linux-foundation.org>
+
+[ 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 <sedat.dilek@gmail.com>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..b18d38f
--- /dev/null
@@ -0,0 +1,131 @@
+From 9a65c64a32d7eab48884f48e076fb0fa0ad89660 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 29 Dec 2020 15:14:58 -0800
+Subject: lib/genalloc: fix the overflow when size is too big
+
+From: Huang Shijie <sjhuang@iluvatar.ai>
+
+[ 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 <sjhuang@iluvatar.ai>
+Reported-by: Shi Jiasheng <jiasheng.shi@iluvatar.ai>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..3d552a6
--- /dev/null
@@ -0,0 +1,291 @@
+From cb59d728f08f30e830333df4837cd877db971334 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 29 Dec 2020 15:14:49 -0800
+Subject: local64.h: make <asm/local64.h> mandatory
+
+From: Randy Dunlap <rdunlap@infradead.org>
+
+[ Upstream commit 87dbc209ea04645fd2351981f09eff5d23f8e2e9 ]
+
+Make <asm-generic/local64.h> mandatory in include/asm-generic/Kbuild and
+remove all arch/*/include/asm/local64.h arch-specific files since they
+only #include <asm-generic/local64.h>.
+
+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 <asm-generic/local64.h> to
+<linux/local64.h> and change all #includes to use
+<linux/local64.h> instead.
+
+Link: https://lkml.kernel.org/r/20201227024446.17018-1-rdunlap@infradead.org
+Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
+Suggested-by: Christoph Hellwig <hch@infradead.org>
+Reviewed-by: Masahiro Yamada <masahiroy@kernel.org>
+Cc: Jens Axboe <axboe@kernel.dk>
+Cc: Ley Foon Tan <ley.foon.tan@intel.com>
+Cc: Mark Salter <msalter@redhat.com>
+Cc: Aurelien Jacquiot <jacquiot.aurelien@gmail.com>
+Cc: Peter Zijlstra <peterz@infradead.org>
+Cc: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 <asm-generic/local64.h>
+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 <asm-generic/local64.h>
+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 <asm-generic/local64.h>
+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 (file)
index 0000000..858116e
--- /dev/null
@@ -0,0 +1,89 @@
+From a2cacef147f565df062d428bd20272151f1400cc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 8 Dec 2020 21:29:45 -0800
+Subject: scsi: block: Introduce BLK_MQ_REQ_PM
+
+From: Bart Van Assche <bvanassche@acm.org>
+
+[ 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 <stern@rowland.harvard.edu>
+Cc: Stanley Chu <stanley.chu@mediatek.com>
+Cc: Ming Lei <ming.lei@redhat.com>
+Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Cc: Can Guo <cang@codeaurora.org>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Reviewed-by: Jens Axboe <axboe@kernel.dk>
+Reviewed-by: Can Guo <cang@codeaurora.org>
+Signed-off-by: Bart Van Assche <bvanassche@acm.org>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..c89490e
--- /dev/null
@@ -0,0 +1,117 @@
+From 8d819d5b478f8c5f45c3c0a15b8d30a83b6aa701 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <bvanassche@acm.org>
+
+[ 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 <cang@codeaurora.org>
+Cc: Stanley Chu <stanley.chu@mediatek.com>
+Cc: Alan Stern <stern@rowland.harvard.edu>
+Cc: Ming Lei <ming.lei@redhat.com>
+Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Cc: Martin Kepplinger <martin.kepplinger@puri.sm>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Reviewed-by: Jens Axboe <axboe@kernel.dk>
+Reviewed-by: Can Guo <cang@codeaurora.org>
+Signed-off-by: Bart Van Assche <bvanassche@acm.org>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..0cbcbc0
--- /dev/null
@@ -0,0 +1,88 @@
+From 78d6087e93dd569349548647356e668fefa2b0ef Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <bvanassche@acm.org>
+
+[ 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 <davem@davemloft.net>
+Cc: Alan Stern <stern@rowland.harvard.edu>
+Cc: Can Guo <cang@codeaurora.org>
+Cc: Stanley Chu <stanley.chu@mediatek.com>
+Cc: Ming Lei <ming.lei@redhat.com>
+Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Reviewed-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Bart Van Assche <bvanassche@acm.org>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..7921bb3
--- /dev/null
@@ -0,0 +1,59 @@
+From 218900f5a0562f5f92c361b5da82d0a4df1b984e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <bvanassche@acm.org>
+
+[ 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 <davem@davemloft.net>
+Cc: Alan Stern <stern@rowland.harvard.edu>
+Cc: Can Guo <cang@codeaurora.org>
+Cc: Stanley Chu <stanley.chu@mediatek.com>
+Cc: Ming Lei <ming.lei@redhat.com>
+Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Reviewed-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Bart Van Assche <bvanassche@acm.org>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..84e2558
--- /dev/null
@@ -0,0 +1,108 @@
+From 065556eea8f39c6b7803e05ad4f5c74622f7e6b0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <bvanassche@acm.org>
+
+[ 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 <stern@rowland.harvard.edu>
+Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
+Cc: Woody Suwalski <terraluna977@gmail.com>
+Cc: Can Guo <cang@codeaurora.org>
+Cc: Stanley Chu <stanley.chu@mediatek.com>
+Cc: Ming Lei <ming.lei@redhat.com>
+Cc: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Cc: Stan Johnson <userm57@yahoo.com>
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Reviewed-by: Jens Axboe <axboe@kernel.dk>
+Reviewed-by: Hannes Reinecke <hare@suse.de>
+Signed-off-by: Bart Van Assche <bvanassche@acm.org>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..9fe7f4e
--- /dev/null
@@ -0,0 +1,142 @@
+From 4e56cae30597c6acd650a0b1a7410de83c4b12a5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 17 Nov 2020 08:58:35 -0800
+Subject: scsi: ufs: Clear UAC for FFU and RPMB LUNs
+
+From: Jaegeuk Kim <jaegeuk@google.com>
+
+[ 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 <jaegeuk@google.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..702e26d
--- /dev/null
@@ -0,0 +1,73 @@
+From 878a87fe90377b2bc94f8f07c353061fcea6a6bb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 30 Nov 2020 20:14:02 -0800
+Subject: scsi: ufs: Clear UAC for RPMB after ufshcd resets
+
+From: Randall Huang <huangrandall@google.com>
+
+[ 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 <lkp@intel.com>
+Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
+Signed-off-by: Randall Huang <huangrandall@google.com>
+Signed-off-by: Leo Liou <leoliou@google.com>
+Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..631262b
--- /dev/null
@@ -0,0 +1,38 @@
+From be202eec95caa1d32222b0d65a18c6cfa75700d8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 7 Dec 2020 20:01:37 +0100
+Subject: scsi: ufs: Fix wrong print message in dev_err()
+
+From: Bean Huo <beanhuo@micron.com>
+
+[ 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 <alim.akhtar@samsung.com>
+Acked-by: Avri Altman <avri.altman@wdc.com>
+Signed-off-by: Bean Huo <beanhuo@micron.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..071f176
--- /dev/null
@@ -0,0 +1,36 @@
+From f538956a11160cb039a9f45f212f0e420e4fb112 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 7 Dec 2020 10:31:20 +0200
+Subject: scsi: ufs-pci: Enable UFSHCD_CAP_RPM_AUTOSUSPEND for Intel
+ controllers
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+[ 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 <adrian.hunter@intel.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..2d96b73
--- /dev/null
@@ -0,0 +1,78 @@
+From 6d78d2312082a1ce871159caf8c40990cd25e4cb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <adrian.hunter@intel.com>
+
+[ 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 <adrian.hunter@intel.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..561f557
--- /dev/null
@@ -0,0 +1,53 @@
+From e68bfe6163562dc33f61229e79dc90ccc3a1a0db Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <adrian.hunter@intel.com>
+
+[ 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 <adrian.hunter@intel.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..a929bd1
--- /dev/null
@@ -0,0 +1,81 @@
+From ab183fbd28f827607f91275a3846a389566b0282 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 7 Dec 2020 10:31:17 +0200
+Subject: scsi: ufs-pci: Fix restore from S4 for Intel controllers
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+[ 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 <adrian.hunter@intel.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..5a18440
--- /dev/null
@@ -0,0 +1,83 @@
+From 5109c87d9acdce7cd5b4c2886786c83800470161 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 29 Dec 2020 15:14:22 -0800
+Subject: selftests/vm: fix building protection keys test
+
+From: Harish <harish@linux.ibm.com>
+
+[ 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 <harish@linux.ibm.com>
+Reviewed-by: Sandipan Das <sandipan@linux.ibm.com>
+Cc: Shuah Khan <shuah@kernel.org>
+Cc: Sandipan Das <sandipan@linux.ibm.com>
+Cc: John Hubbard <jhubbard@nvidia.com>
+Cc: Dave Hansen <dave.hansen@intel.com>
+Cc: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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 (file)
index 0000000..cf6c82a
--- /dev/null
@@ -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 (file)
index 0000000..c68aef2
--- /dev/null
@@ -0,0 +1,69 @@
+From 30eb0376b9e969792660180daf5ace1f9db21ccc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+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 <yeyunfeng@huawei.com>
+
+[ 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 <yeyunfeng@huawei.com>
+Reviewed-by: Lai Jiangshan <jiangshanlai@gmail.com>
+Signed-off-by: Tejun Heo <tj@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ 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
+