]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.15-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 12 Jun 2024 14:46:44 +0000 (16:46 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 12 Jun 2024 14:46:44 +0000 (16:46 +0200)
added patches:
sunrpc-exclude-from-freezer-when-waiting-for-requests.patch

queue-5.15/series
queue-5.15/sunrpc-exclude-from-freezer-when-waiting-for-requests.patch [new file with mode: 0644]

index 8c1394dde1db56d07ca8116db949201259130b82..2039643e954edc76bd65f4671aa63fff0c158b3e 100644 (file)
@@ -349,3 +349,4 @@ vxlan-fix-regression-when-dropping-packets-due-to-invalid-src-addresses.patch
 net-dsa-sja1105-always-enable-the-incl_srcpt-option.patch
 net-dsa-tag_sja1105-always-prefer-source-port-information-from-incl_srcpt.patch
 scripts-gdb-fix-sb_-constants-parsing.patch
+sunrpc-exclude-from-freezer-when-waiting-for-requests.patch
diff --git a/queue-5.15/sunrpc-exclude-from-freezer-when-waiting-for-requests.patch b/queue-5.15/sunrpc-exclude-from-freezer-when-waiting-for-requests.patch
new file mode 100644 (file)
index 0000000..7324f32
--- /dev/null
@@ -0,0 +1,79 @@
+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);