SUNRPC: change svc_recv() to return void.
authorNeilBrown <neilb@suse.de>
Tue, 18 Jul 2023 06:38:08 +0000 (16:38 +1000)
committerChuck Lever <chuck.lever@oracle.com>
Tue, 29 Aug 2023 21:45:22 +0000 (17:45 -0400)
svc_recv() currently returns a 0 on success or one of two errors:
 - -EAGAIN means no message was successfully received
 - -EINTR means the thread has been told to stop

Previously nfsd would stop as the result of a signal as well as
following kthread_stop().  In that case the difference was useful: EINTR
means stop unconditionally.  EAGAIN means stop if kthread_should_stop(),
continue otherwise.

Now threads only exit when kthread_should_stop() so we don't need the
distinction.

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
fs/lockd/svc.c
fs/nfs/callback.c
fs/nfsd/nfssvc.c
include/linux/sunrpc/svcsock.h
net/sunrpc/svc_xprt.c

index 91ef139..cf4ff7d 100644 (file)
@@ -116,7 +116,6 @@ static void set_grace_period(struct net *net)
 static int
 lockd(void *vrqstp)
 {
-       int             err = 0;
        struct svc_rqst *rqstp = vrqstp;
        struct net *net = &init_net;
        struct lockd_net *ln = net_generic(net, lockd_net_id);
@@ -138,13 +137,7 @@ lockd(void *vrqstp)
 
                timeout = nlmsvc_retry_blocked();
 
-               /*
-                * Find a socket with data available and call its
-                * recvfrom routine.
-                */
-               err = svc_recv(rqstp, timeout);
-               if (err == -EAGAIN || err == -EINTR)
-                       continue;
+               svc_recv(rqstp, timeout);
        }
        if (nlmsvc_ops)
                nlmsvc_invalidate_all();
index 2d94384..54155b4 100644 (file)
@@ -74,19 +74,12 @@ out_err:
 static int
 nfs4_callback_svc(void *vrqstp)
 {
-       int err;
        struct svc_rqst *rqstp = vrqstp;
 
        set_freezable();
 
-       while (!kthread_freezable_should_stop(NULL)) {
-               /*
-                * Listen for a request on the socket
-                */
-               err = svc_recv(rqstp, MAX_SCHEDULE_TIMEOUT);
-               if (err == -EAGAIN || err == -EINTR)
-                       continue;
-       }
+       while (!kthread_freezable_should_stop(NULL))
+               svc_recv(rqstp, MAX_SCHEDULE_TIMEOUT);
 
        svc_exit_thread(rqstp);
        return 0;
index 547feb8..4c0ab10 100644 (file)
@@ -939,7 +939,6 @@ nfsd(void *vrqstp)
        struct svc_xprt *perm_sock = list_entry(rqstp->rq_server->sv_permsocks.next, typeof(struct svc_xprt), xpt_list);
        struct net *net = perm_sock->xpt_net;
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
-       int err;
 
        /* At this point, the thread shares current->fs
         * with the init process. We need to create files with the
@@ -958,19 +957,11 @@ nfsd(void *vrqstp)
        /*
         * The main request loop
         */
-       for (;;) {
+       while (!kthread_should_stop()) {
                /* Update sv_maxconn if it has changed */
                rqstp->rq_server->sv_maxconn = nn->max_connections;
 
-               /*
-                * Find a socket with data available and call its
-                * recvfrom routine.
-                */
-               while ((err = svc_recv(rqstp, 60*60*HZ)) == -EAGAIN)
-                       ;
-               if (err == -EINTR)
-                       break;
-
+               svc_recv(rqstp, 60*60*HZ);
                validate_process_creds();
        }
 
index a7ea544..c0ddd33 100644 (file)
@@ -57,7 +57,7 @@ static inline u32 svc_sock_final_rec(struct svc_sock *svsk)
  * Function prototypes.
  */
 void           svc_close_net(struct svc_serv *, struct net *);
-int            svc_recv(struct svc_rqst *, long);
+void           svc_recv(struct svc_rqst *, long);
 void           svc_send(struct svc_rqst *rqstp);
 void           svc_drop(struct svc_rqst *);
 void           svc_sock_update_bufs(struct svc_serv *serv);
index 8430b15..d7d6914 100644 (file)
@@ -679,7 +679,7 @@ static void svc_check_conn_limits(struct svc_serv *serv)
        }
 }
 
-static int svc_alloc_arg(struct svc_rqst *rqstp)
+static bool svc_alloc_arg(struct svc_rqst *rqstp)
 {
        struct svc_serv *serv = rqstp->rq_server;
        struct xdr_buf *arg = &rqstp->rq_arg;
@@ -704,7 +704,7 @@ static int svc_alloc_arg(struct svc_rqst *rqstp)
                set_current_state(TASK_IDLE);
                if (kthread_should_stop()) {
                        set_current_state(TASK_RUNNING);
-                       return -EINTR;
+                       return false;
                }
                trace_svc_alloc_arg_err(pages, ret);
                memalloc_retry_wait(GFP_KERNEL);
@@ -723,7 +723,7 @@ static int svc_alloc_arg(struct svc_rqst *rqstp)
        arg->tail[0].iov_len = 0;
 
        rqstp->rq_xid = xdr_zero;
-       return 0;
+       return true;
 }
 
 static bool
@@ -785,8 +785,8 @@ static struct svc_xprt *svc_get_next_xprt(struct svc_rqst *rqstp, long timeout)
                percpu_counter_inc(&pool->sp_threads_timedout);
 
        if (kthread_should_stop())
-               return ERR_PTR(-EINTR);
-       return ERR_PTR(-EAGAIN);
+               return NULL;
+       return NULL;
 out_found:
        /* Normally we will wait up to 5 seconds for any required
         * cache information to be provided.
@@ -868,32 +868,27 @@ out:
  * organised not to touch any cachelines in the shared svc_serv
  * structure, only cachelines in the local svc_pool.
  */
-int svc_recv(struct svc_rqst *rqstp, long timeout)
+void svc_recv(struct svc_rqst *rqstp, long timeout)
 {
        struct svc_xprt         *xprt = NULL;
        struct svc_serv         *serv = rqstp->rq_server;
-       int                     len, err;
+       int                     len;
 
-       err = svc_alloc_arg(rqstp);
-       if (err)
+       if (!svc_alloc_arg(rqstp))
                goto out;
 
        try_to_freeze();
        cond_resched();
-       err = -EINTR;
        if (kthread_should_stop())
                goto out;
 
        xprt = svc_get_next_xprt(rqstp, timeout);
-       if (IS_ERR(xprt)) {
-               err = PTR_ERR(xprt);
+       if (!xprt)
                goto out;
-       }
 
        len = svc_handle_xprt(rqstp, xprt);
 
        /* No data, incomplete (TCP) read, or accept() */
-       err = -EAGAIN;
        if (len <= 0)
                goto out_release;
 
@@ -907,12 +902,11 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)
                serv->sv_stats->netcnt++;
        rqstp->rq_stime = ktime_get();
        svc_process(rqstp);
-       return 0;
+out:
+       return;
 out_release:
        rqstp->rq_res.len = 0;
        svc_xprt_release(rqstp);
-out:
-       return err;
 }
 EXPORT_SYMBOL_GPL(svc_recv);