--- /dev/null
+From 2f917af777011c88e977b9b9a5d00b280d3a59ce Mon Sep 17 00:00:00 2001
+From: Xiao Yang <yangx.jy@fujitsu.com>
+Date: Sun, 10 Apr 2022 19:35:13 +0800
+Subject: RDMA/rxe: Generate a completion for unsupported/invalid opcode
+
+From: Xiao Yang <yangx.jy@fujitsu.com>
+
+commit 2f917af777011c88e977b9b9a5d00b280d3a59ce upstream.
+
+Current rxe_requester() doesn't generate a completion when processing an
+unsupported/invalid opcode. If rxe driver doesn't support a new opcode
+(e.g. RDMA Atomic Write) and RDMA library supports it, an application
+using the new opcode can reproduce this issue. Fix the issue by calling
+"goto err;".
+
+Fixes: 8700e3e7c485 ("Soft RoCE driver")
+Link: https://lore.kernel.org/r/20220410113513.27537-1-yangx.jy@fujitsu.com
+Signed-off-by: Xiao Yang <yangx.jy@fujitsu.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/infiniband/sw/rxe/rxe_req.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/infiniband/sw/rxe/rxe_req.c
++++ b/drivers/infiniband/sw/rxe/rxe_req.c
+@@ -680,7 +680,7 @@ next_wqe:
+ opcode = next_opcode(qp, wqe, wqe->wr.opcode);
+ if (unlikely(opcode < 0)) {
+ wqe->status = IB_WC_LOC_QP_OP_ERR;
+- goto exit;
++ goto err;
+ }
+
+ mask = rxe_opcode[opcode].mask;
+++ /dev/null
-From Jason@zx2c4.com Tue Jun 7 11:12:02 2022
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Date: Tue, 7 Jun 2022 10:40:05 +0200
-Subject: Revert "random: use static branch for crng_ready()"
-To: stable@vger.kernel.org, gregkh@linuxfoundation.org
-Cc: "Jason A. Donenfeld" <Jason@zx2c4.com>
-Message-ID: <20220607084005.666059-1-Jason@zx2c4.com>
-
-From: "Jason A. Donenfeld" <Jason@zx2c4.com>
-
-This reverts upstream commit f5bda35fba615ace70a656d4700423fa6c9bebee
-from stable. It's not essential and will take some time during 5.19 to
-work out properly.
-
-Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
----
- drivers/char/random.c | 12 ++----------
- 1 file changed, 2 insertions(+), 10 deletions(-)
-
-diff --git a/drivers/char/random.c b/drivers/char/random.c
-index 7a66eec08e37..0cfbfa8d5b50 100644
---- a/drivers/char/random.c
-+++ b/drivers/char/random.c
-@@ -78,8 +78,7 @@ static enum {
- CRNG_EARLY = 1, /* At least POOL_EARLY_BITS collected */
- CRNG_READY = 2 /* Fully initialized with POOL_READY_BITS collected */
- } crng_init __read_mostly = CRNG_EMPTY;
--static DEFINE_STATIC_KEY_FALSE(crng_is_ready);
--#define crng_ready() (static_branch_likely(&crng_is_ready) || crng_init >= CRNG_READY)
-+#define crng_ready() (likely(crng_init >= CRNG_READY))
- /* Various types of waiters for crng_init->CRNG_READY transition. */
- static DECLARE_WAIT_QUEUE_HEAD(crng_init_wait);
- static struct fasync_struct *fasync;
-@@ -109,11 +108,6 @@ bool rng_is_initialized(void)
- }
- EXPORT_SYMBOL(rng_is_initialized);
-
--static void __cold crng_set_ready(struct work_struct *work)
--{
-- static_branch_enable(&crng_is_ready);
--}
--
- /* Used by wait_for_random_bytes(), and considered an entropy collector, below. */
- static void try_to_generate_entropy(void);
-
-@@ -267,7 +261,7 @@ static void crng_reseed(void)
- ++next_gen;
- WRITE_ONCE(base_crng.generation, next_gen);
- WRITE_ONCE(base_crng.birth, jiffies);
-- if (!static_branch_likely(&crng_is_ready))
-+ if (!crng_ready())
- crng_init = CRNG_READY;
- spin_unlock_irqrestore(&base_crng.lock, flags);
- memzero_explicit(key, sizeof(key));
-@@ -710,7 +704,6 @@ static void extract_entropy(void *buf, size_t len)
-
- static void __cold _credit_init_bits(size_t bits)
- {
-- static struct execute_work set_ready;
- unsigned int new, orig, add;
- unsigned long flags;
-
-@@ -726,7 +719,6 @@ static void __cold _credit_init_bits(size_t bits)
-
- if (orig < POOL_READY_BITS && new >= POOL_READY_BITS) {
- crng_reseed(); /* Sets crng_init to CRNG_READY under base_crng.lock. */
-- execute_in_process_context(crng_set_ready, &set_ready);
- process_random_ready_list();
- wake_up_interruptible(&crng_init_wait);
- kill_fasync(&fasync, SIGIO, POLL_IN);
---
-2.35.1
-