sunrpc: exclude from freezer when waiting for requests:
Subsystems (3)
[email protected]
maintainerPATCH 1/1 sunrpc: exclude from freezer when waiting for requests:
From: NeilBrown <[email protected]>
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.
--- fs/nfs/callback.c | 2 +- fs/nfsd/nfs4proc.c | 3 ++- net/sunrpc/svc_xprt.c | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-)
fs/nfs/callback.c +1 -1
@@ -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); } }
fs/nfsd/nfs4proc.c +2 -1
@@ -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 @@ static __be32 nfsd4_ssc_setup_dul(struct nfsd_net *nn, char *ipaddr,/* 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;
net/sunrpc/svc_xprt.c +2 -2
@@ -705,7 +705,7 @@ static int svc_alloc_arg(struct svc_rqst *rqstp)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_xprt(struct svc_rqst *rqstp, long timeout)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 );
Signature · 1 line
2.45.1
Quoted 11 lines · On Fri, Jun 07, 2024 at 09:10:48AM -0400, [email protected] wrote:
From: NeilBrown <[email protected]>
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.
Quoted 8 lines
Fixes 9b8a8e5e8129 ("nfsd: don't allow nfsd threads to be signalled.")Tested-by Jon Hunter <[email protected]>Signed-off-by NeilBrown <[email protected]>--- fs/nfs/callback.c | 2 +- fs/nfsd/nfs4proc.c | 3 ++- net/sunrpc/svc_xprt.c | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-)
Sorry for the delay, now queued up.
greg k-h