Commit c743b425 authored by NeilBrown's avatar NeilBrown Committed by Chuck Lever
Browse files

SUNRPC: remove timeout arg from svc_recv()



Most svc threads have no interest in a timeout.
nfsd sets it to 1 hour, but this is a wart of no significance.

lockd uses the timeout so that it can call nlmsvc_retry_blocked().
It also sometimes calls svc_wake_up() to ensure this is called.

So change lockd to be consistent and always use svc_wake_up() to trigger
nlmsvc_retry_blocked() - using a timer instead of a timeout to
svc_recv().

And change svc_recv() to not take a timeout arg.

This makes the sp_threads_timedout counter always zero.

Signed-off-by: default avatarNeilBrown <neilb@suse.de>
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
parent 7b719e2b
Loading
Loading
Loading
Loading
+9 −5
Original line number Diff line number Diff line
@@ -56,6 +56,12 @@ static unsigned int nlmsvc_users;
static struct svc_serv		*nlmsvc_serv;
unsigned long			nlmsvc_timeout;

static void nlmsvc_request_retry(struct timer_list *tl)
{
	svc_wake_up(nlmsvc_serv);
}
DEFINE_TIMER(nlmsvc_retry, nlmsvc_request_retry);

unsigned int lockd_net_id;

/*
@@ -130,14 +136,11 @@ lockd(void *vrqstp)
	 * NFS mount or NFS daemon has gone away.
	 */
	while (!kthread_should_stop()) {
		long timeout = MAX_SCHEDULE_TIMEOUT;

		/* update sv_maxconn if it has changed */
		rqstp->rq_server->sv_maxconn = nlm_max_connections;

		timeout = nlmsvc_retry_blocked();

		svc_recv(rqstp, timeout);
		nlmsvc_retry_blocked();
		svc_recv(rqstp);
	}
	if (nlmsvc_ops)
		nlmsvc_invalidate_all();
@@ -371,6 +374,7 @@ static void lockd_put(void)
#endif

	svc_set_num_threads(nlmsvc_serv, NULL, 0);
	timer_delete_sync(&nlmsvc_retry);
	nlmsvc_serv = NULL;
	dprintk("lockd_down: service destroyed\n");
}
+3 −2
Original line number Diff line number Diff line
@@ -1019,7 +1019,7 @@ retry_deferred_block(struct nlm_block *block)
 * picks up locks that can be granted, or grant notifications that must
 * be retransmitted.
 */
unsigned long
void
nlmsvc_retry_blocked(void)
{
	unsigned long	timeout = MAX_SCHEDULE_TIMEOUT;
@@ -1049,5 +1049,6 @@ nlmsvc_retry_blocked(void)
	}
	spin_unlock(&nlm_blocked_lock);

	return timeout;
	if (timeout < MAX_SCHEDULE_TIMEOUT)
		mod_timer(&nlmsvc_retry, jiffies + timeout);
}
+1 −1
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ nfs4_callback_svc(void *vrqstp)
	set_freezable();

	while (!kthread_freezable_should_stop(NULL))
		svc_recv(rqstp, MAX_SCHEDULE_TIMEOUT);
		svc_recv(rqstp);

	svc_exit_thread(rqstp);
	return 0;
+1 −1
Original line number Diff line number Diff line
@@ -961,7 +961,7 @@ nfsd(void *vrqstp)
		/* Update sv_maxconn if it has changed */
		rqstp->rq_server->sv_maxconn = nn->max_connections;

		svc_recv(rqstp, 60*60*HZ);
		svc_recv(rqstp);
		validate_process_creds();
	}

+3 −1
Original line number Diff line number Diff line
@@ -204,6 +204,8 @@ extern unsigned long nlmsvc_timeout;
extern bool			nsm_use_hostnames;
extern u32			nsm_local_state;

extern struct timer_list	nlmsvc_retry;

/*
 * Lockd client functions
 */
@@ -280,7 +282,7 @@ __be32 nlmsvc_testlock(struct svc_rqst *, struct nlm_file *,
			struct nlm_host *, struct nlm_lock *,
			struct nlm_lock *, struct nlm_cookie *);
__be32		  nlmsvc_cancel_blocked(struct net *net, struct nlm_file *, struct nlm_lock *);
unsigned long	  nlmsvc_retry_blocked(void);
void		  nlmsvc_retry_blocked(void);
void		  nlmsvc_traverse_blocks(struct nlm_host *, struct nlm_file *,
					nlm_host_match_fn_t match);
void		  nlmsvc_grant_reply(struct nlm_cookie *, __be32);
Loading