--- /dev/null
+From cel@kernel.org Wed Jun 12 16:46:09 2024
+From: cel@kernel.org
+Date: Fri, 7 Jun 2024 09:10:48 -0400
+Subject: sunrpc: exclude from freezer when waiting for requests:
+To: <stable@vger.kernel.org>, <linux-nfs@vger.kernel.org>
+Cc: NeilBrown <neilb@suse.de>, Jon Hunter <jonathanh@nvidia.com>
+Message-ID: <20240607131048.8795-1-cel@kernel.org>
+
+From: NeilBrown <neilb@suse.de>
+
+Prior to v6.1, the freezer will only wake a kernel thread from an
+uninterruptible sleep. Since we changed svc_get_next_xprt() to use and
+IDLE sleep the freezer cannot wake it. We need to tell the freezer to
+ignore it instead.
+
+To make this work with only upstream commits, 5.15.y would need
+commit f5d39b020809 ("freezer,sched: Rewrite core freezer logic")
+which allows non-interruptible sleeps to be woken by the freezer.
+
+Fixes: 9b8a8e5e8129 ("nfsd: don't allow nfsd threads to be signalled.")
+Tested-by: Jon Hunter <jonathanh@nvidia.com>
+Signed-off-by: NeilBrown <neilb@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/nfs/callback.c | 2 +-
+ fs/nfsd/nfs4proc.c | 3 ++-
+ net/sunrpc/svc_xprt.c | 4 ++--
+ 3 files changed, 5 insertions(+), 4 deletions(-)
+
+--- a/fs/nfs/callback.c
++++ b/fs/nfs/callback.c
+@@ -124,7 +124,7 @@ nfs41_callback_svc(void *vrqstp)
+ } else {
+ spin_unlock_bh(&serv->sv_cb_lock);
+ if (!kthread_should_stop())
+- schedule();
++ freezable_schedule();
+ finish_wait(&serv->sv_cb_waitq, &wq);
+ }
+ }
+--- a/fs/nfsd/nfs4proc.c
++++ b/fs/nfsd/nfs4proc.c
+@@ -38,6 +38,7 @@
+ #include <linux/slab.h>
+ #include <linux/kthread.h>
+ #include <linux/namei.h>
++#include <linux/freezer.h>
+
+ #include <linux/sunrpc/addr.h>
+ #include <linux/nfs_ssc.h>
+@@ -1322,7 +1323,7 @@ try_again:
+
+ /* allow 20secs for mount/unmount for now - revisit */
+ if (kthread_should_stop() ||
+- (schedule_timeout(20*HZ) == 0)) {
++ (freezable_schedule_timeout(20*HZ) == 0)) {
+ finish_wait(&nn->nfsd_ssc_waitq, &wait);
+ kfree(work);
+ return nfserr_eagain;
+--- a/net/sunrpc/svc_xprt.c
++++ b/net/sunrpc/svc_xprt.c
+@@ -705,7 +705,7 @@ static int svc_alloc_arg(struct svc_rqst
+ set_current_state(TASK_RUNNING);
+ return -EINTR;
+ }
+- schedule_timeout(msecs_to_jiffies(500));
++ freezable_schedule_timeout(msecs_to_jiffies(500));
+ }
+ rqstp->rq_page_end = &rqstp->rq_pages[pages];
+ rqstp->rq_pages[pages] = NULL; /* this might be seen in nfsd_splice_actor() */
+@@ -765,7 +765,7 @@ static struct svc_xprt *svc_get_next_xpr
+ smp_mb__after_atomic();
+
+ if (likely(rqst_should_sleep(rqstp)))
+- time_left = schedule_timeout(timeout);
++ time_left = freezable_schedule_timeout(timeout);
+ else
+ __set_current_state(TASK_RUNNING);
+