Message ID | 20240607131048.8795-1-cel@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | [5.15] sunrpc: exclude from freezer when waiting for requests: | expand |
On Fri, Jun 07, 2024 at 09:10:48AM -0400, cel@kernel.org wrote: > 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> > --- > 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
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index 46a0a2d6962e..8fe143cad4a2 100644 --- 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); } } diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c index 6779291efca9..e0ff2212866a 100644 --- 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 @@ 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; diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c index b19592673eef..3cf53e3140a5 100644 --- a/net/sunrpc/svc_xprt.c +++ b/net/sunrpc/svc_xprt.c @@ -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);