[lustre-devel] [PATCH 1/7] lustre: use schedule_timeout_$state().

Andreas Dilger adilger at whamcloud.com
Mon Jul 30 14:30:06 PDT 2018


On Jul 29, 2018, at 21:49, NeilBrown <neilb at suse.com> wrote:
> 
> Lustre has many calls to
>   set_current_state(STATE);
>   schedule_timeout(time);
> 
> 
> These can more easily be done as
>    schedule_timeout_STATE(time);
> 
> Also clean up some oddities, such as setting the state
> to TASK_RUNNING after the timeout, and simplify
> some time calculations.
> 
> Some schedule_timeout() calls remain as the state was set earlier,
> before an 'add_wait_queue()'.  It would be incorrect to convert these.
> 
> Signed-off-by: NeilBrown <neilb at suse.com>

Reviewed-by: Andreas Dilger <adilger at whamcloud.com>

> ---
> .../staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c    |   12 ++++--------
> .../staging/lustre/lnet/klnds/socklnd/socklnd.c    |    6 ++----
> .../staging/lustre/lnet/klnds/socklnd/socklnd_cb.c |   14 ++++++--------
> drivers/staging/lustre/lnet/libcfs/fail.c          |    3 +--
> drivers/staging/lustre/lnet/libcfs/tracefile.c     |    3 +--
> drivers/staging/lustre/lnet/lnet/acceptor.c        |    3 +--
> drivers/staging/lustre/lnet/lnet/api-ni.c          |    6 ++----
> drivers/staging/lustre/lnet/lnet/peer.c            |    3 +--
> drivers/staging/lustre/lnet/lnet/router.c          |   19 +++++--------------
> drivers/staging/lustre/lnet/selftest/conrpc.c      |    3 +--
> drivers/staging/lustre/lnet/selftest/rpc.c         |    3 +--
> drivers/staging/lustre/lnet/selftest/selftest.h    |    3 +--
> drivers/staging/lustre/lustre/include/lustre_mdc.h |    2 +-
> drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c    |    3 +--
> drivers/staging/lustre/lustre/ldlm/ldlm_resource.c |    8 +++-----
> drivers/staging/lustre/lustre/llite/llite_lib.c    |    6 ++----
> .../staging/lustre/lustre/obdecho/echo_client.c    |    3 +--
> drivers/staging/lustre/lustre/ptlrpc/client.c      |    4 +---
> drivers/staging/lustre/lustre/ptlrpc/sec.c         |    3 +--
> 19 files changed, 36 insertions(+), 71 deletions(-)
> 
> diff --git a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
> index e15ad94151bd..f496e6fcc416 100644
> --- a/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
> +++ b/drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
> @@ -1201,8 +1201,7 @@ static struct kib_hca_dev *kiblnd_current_hdev(struct kib_dev *dev)
> 		if (!(i++ % 50))
> 			CDEBUG(D_NET, "%s: Wait for failover\n",
> 			       dev->ibd_ifname);
> -		set_current_state(TASK_INTERRUPTIBLE);
> -		schedule_timeout(HZ / 100);
> +		schedule_timeout_interruptible(HZ / 100);
> 
> 		read_lock_irqsave(&kiblnd_data.kib_global_lock, flags);
> 	}
> @@ -1916,8 +1915,7 @@ struct list_head *kiblnd_pool_alloc_node(struct kib_poolset *ps)
> 		CDEBUG(D_NET, "Another thread is allocating new %s pool, waiting %d HZs for her to complete. trips = %d\n",
> 		       ps->ps_name, interval, trips);
> 
> -		set_current_state(TASK_INTERRUPTIBLE);
> -		schedule_timeout(interval);
> +		schedule_timeout_interruptible(interval);
> 		if (interval < HZ)
> 			interval *= 2;
> 
> @@ -2548,8 +2546,7 @@ static void kiblnd_base_shutdown(void)
> 			CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET,
> 			       "Waiting for %d threads to terminate\n",
> 			       atomic_read(&kiblnd_data.kib_nthreads));
> -			set_current_state(TASK_UNINTERRUPTIBLE);
> -			schedule_timeout(HZ);
> +			schedule_timeout_uninterruptible(HZ);
> 		}
> 
> 		/* fall through */
> @@ -2599,8 +2596,7 @@ static void kiblnd_shutdown(struct lnet_ni *ni)
> 			       "%s: waiting for %d peers to disconnect\n",
> 			       libcfs_nid2str(ni->ni_nid),
> 			       atomic_read(&net->ibn_npeers));
> -			set_current_state(TASK_UNINTERRUPTIBLE);
> -			schedule_timeout(HZ);
> +			schedule_timeout_uninterruptible(HZ);
> 		}
> 
> 		kiblnd_net_fini_pools(net);
> diff --git a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c
> index f0b0480686dc..4dde158451ea 100644
> --- a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c
> +++ b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c
> @@ -2307,8 +2307,7 @@ ksocknal_base_shutdown(void)
> 			       "waiting for %d threads to terminate\n",
> 				ksocknal_data.ksnd_nthreads);
> 			read_unlock(&ksocknal_data.ksnd_global_lock);
> -			set_current_state(TASK_UNINTERRUPTIBLE);
> -			schedule_timeout(HZ);
> +			schedule_timeout_uninterruptible(HZ);
> 			read_lock(&ksocknal_data.ksnd_global_lock);
> 		}
> 		read_unlock(&ksocknal_data.ksnd_global_lock);
> @@ -2533,8 +2532,7 @@ ksocknal_shutdown(struct lnet_ni *ni)
> 		CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET, /* power of 2? */
> 		       "waiting for %d peers to disconnect\n",
> 		       net->ksnn_npeers);
> -		set_current_state(TASK_UNINTERRUPTIBLE);
> -		schedule_timeout(HZ);
> +		schedule_timeout_uninterruptible(HZ);
> 
> 		ksocknal_debug_peerhash(ni);
> 
> diff --git a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_cb.c b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_cb.c
> index a5c0e8a9bc40..32b76727f400 100644
> --- a/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_cb.c
> +++ b/drivers/staging/lustre/lnet/klnds/socklnd/socklnd_cb.c
> @@ -188,10 +188,9 @@ ksocknal_transmit(struct ksock_conn *conn, struct ksock_tx *tx)
> 	int rc;
> 	int bufnob;
> 
> -	if (ksocknal_data.ksnd_stall_tx) {
> -		set_current_state(TASK_UNINTERRUPTIBLE);
> -		schedule_timeout(ksocknal_data.ksnd_stall_tx * HZ);
> -	}
> +	if (ksocknal_data.ksnd_stall_tx)
> +		schedule_timeout_uninterruptible(
> +			ksocknal_data.ksnd_stall_tx * HZ);
> 
> 	LASSERT(tx->tx_resid);
> 
> @@ -293,10 +292,9 @@ ksocknal_receive(struct ksock_conn *conn)
> 	 */
> 	int rc;
> 
> -	if (ksocknal_data.ksnd_stall_rx) {
> -		set_current_state(TASK_UNINTERRUPTIBLE);
> -		schedule_timeout(ksocknal_data.ksnd_stall_rx * HZ);
> -	}
> +	if (ksocknal_data.ksnd_stall_rx)
> +		schedule_timeout_uninterruptible(
> +			ksocknal_data.ksnd_stall_rx * HZ);
> 
> 	rc = ksocknal_connsock_addref(conn);
> 	if (rc) {
> diff --git a/drivers/staging/lustre/lnet/libcfs/fail.c b/drivers/staging/lustre/lnet/libcfs/fail.c
> index bd86b3b5bc34..6ee4de2178ce 100644
> --- a/drivers/staging/lustre/lnet/libcfs/fail.c
> +++ b/drivers/staging/lustre/lnet/libcfs/fail.c
> @@ -137,8 +137,7 @@ int __cfs_fail_timeout_set(u32 id, u32 value, int ms, int set)
> 	if (ret && likely(ms > 0)) {
> 		CERROR("cfs_fail_timeout id %x sleeping for %dms\n",
> 		       id, ms);
> -		set_current_state(TASK_UNINTERRUPTIBLE);
> -		schedule_timeout(ms * HZ / 1000);
> +		schedule_timeout_uninterruptible(ms * HZ / 1000);
> 		CERROR("cfs_fail_timeout id %x awake\n", id);
> 	}
> 	return ret;
> diff --git a/drivers/staging/lustre/lnet/libcfs/tracefile.c b/drivers/staging/lustre/lnet/libcfs/tracefile.c
> index a4768e930021..d4c80cf254e4 100644
> --- a/drivers/staging/lustre/lnet/libcfs/tracefile.c
> +++ b/drivers/staging/lustre/lnet/libcfs/tracefile.c
> @@ -1208,8 +1208,7 @@ static int tracefiled(void *arg)
> 		}
> 		init_waitqueue_entry(&__wait, current);
> 		add_wait_queue(&tctl->tctl_waitq, &__wait);
> -		set_current_state(TASK_INTERRUPTIBLE);
> -		schedule_timeout(HZ);
> +		schedule_timeout_interruptible(HZ);
> 		remove_wait_queue(&tctl->tctl_waitq, &__wait);
> 	}
> 	complete(&tctl->tctl_stop);
> diff --git a/drivers/staging/lustre/lnet/lnet/acceptor.c b/drivers/staging/lustre/lnet/lnet/acceptor.c
> index 5648f17eddc0..3ae3ca1311a1 100644
> --- a/drivers/staging/lustre/lnet/lnet/acceptor.c
> +++ b/drivers/staging/lustre/lnet/lnet/acceptor.c
> @@ -362,8 +362,7 @@ lnet_acceptor(void *arg)
> 		if (rc) {
> 			if (rc != -EAGAIN) {
> 				CWARN("Accept error %d: pausing...\n", rc);
> -				set_current_state(TASK_UNINTERRUPTIBLE);
> -				schedule_timeout(HZ);
> +				schedule_timeout_uninterruptible(HZ);
> 			}
> 			continue;
> 		}
> diff --git a/drivers/staging/lustre/lnet/lnet/api-ni.c b/drivers/staging/lustre/lnet/lnet/api-ni.c
> index 14b797802a85..cdbbe9cc8d95 100644
> --- a/drivers/staging/lustre/lnet/lnet/api-ni.c
> +++ b/drivers/staging/lustre/lnet/lnet/api-ni.c
> @@ -955,8 +955,7 @@ lnet_ping_md_unlink(struct lnet_ping_info *pinfo,
> 	/* NB md could be busy; this just starts the unlink */
> 	while (pinfo->pi_features != LNET_PING_FEAT_INVAL) {
> 		CDEBUG(D_NET, "Still waiting for ping MD to unlink\n");
> -		set_current_state(TASK_NOLOAD);
> -		schedule_timeout(HZ);
> +		schedule_timeout_idle(HZ);
> 	}
> }
> 
> @@ -1093,8 +1092,7 @@ lnet_clear_zombies_nis_locked(void)
> 				CDEBUG(D_WARNING, "Waiting for zombie LNI %s\n",
> 				       libcfs_nid2str(ni->ni_nid));
> 			}
> -			set_current_state(TASK_UNINTERRUPTIBLE);
> -			schedule_timeout(HZ);
> +			schedule_timeout_uninterruptible(HZ);
> 			lnet_net_lock(LNET_LOCK_EX);
> 			continue;
> 		}
> diff --git a/drivers/staging/lustre/lnet/lnet/peer.c b/drivers/staging/lustre/lnet/lnet/peer.c
> index 7c303ef6bb34..d9452c322e4d 100644
> --- a/drivers/staging/lustre/lnet/lnet/peer.c
> +++ b/drivers/staging/lustre/lnet/lnet/peer.c
> @@ -136,8 +136,7 @@ lnet_peer_table_deathrow_wait_locked(struct lnet_peer_table *ptable,
> 			       "Waiting for %d zombies on peer table\n",
> 			       ptable->pt_zombies);
> 		}
> -		set_current_state(TASK_UNINTERRUPTIBLE);
> -		schedule_timeout(HZ >> 1);
> +		schedule_timeout_uninterruptible(HZ >> 1);
> 		lnet_net_lock(cpt_locked);
> 	}
> }
> diff --git a/drivers/staging/lustre/lnet/lnet/router.c b/drivers/staging/lustre/lnet/lnet/router.c
> index 53373372b526..02241fbc9eaa 100644
> --- a/drivers/staging/lustre/lnet/lnet/router.c
> +++ b/drivers/staging/lustre/lnet/lnet/router.c
> @@ -783,8 +783,7 @@ lnet_wait_known_routerstate(void)
> 		if (all_known)
> 			return;
> 
> -		set_current_state(TASK_UNINTERRUPTIBLE);
> -		schedule_timeout(HZ);
> +		schedule_timeout_uninterruptible(HZ);
> 	}
> }
> 
> @@ -1159,8 +1158,7 @@ lnet_prune_rc_data(int wait_unlink)
> 		i++;
> 		CDEBUG(((i & (-i)) == i) ? D_WARNING : D_NET,
> 		       "Waiting for rc buffers to unlink\n");
> -		set_current_state(TASK_UNINTERRUPTIBLE);
> -		schedule_timeout(HZ / 4);
> +		schedule_timeout_uninterruptible(HZ / 4);
> 
> 		lnet_net_lock(LNET_LOCK_EX);
> 	}
> @@ -1236,23 +1234,16 @@ lnet_router_checker(void *arg)
> 
> 		lnet_prune_rc_data(0); /* don't wait for UNLINK */
> 
> -		/*
> -		 * Call schedule_timeout() here always adds 1 to load average
> -		 * because kernel counts # active tasks as nr_running
> -		 * + nr_uninterruptible.
> -		 */
> 		/*
> 		 * if there are any routes then wakeup every second.  If
> 		 * there are no routes then sleep indefinitely until woken
> 		 * up by a user adding a route
> 		 */
> 		if (!lnet_router_checker_active())
> -			wait_event_interruptible(the_lnet.ln_rc_waitq,
> -						 lnet_router_checker_active());
> +			wait_event_idle(the_lnet.ln_rc_waitq,
> +					lnet_router_checker_active());
> 		else
> -			wait_event_interruptible_timeout(the_lnet.ln_rc_waitq,
> -							 false,
> -							 HZ);
> +			schedule_timeout_idle(HZ);
> 	}
> 
> 	lnet_prune_rc_data(1); /* wait for UNLINK */
> diff --git a/drivers/staging/lustre/lnet/selftest/conrpc.c b/drivers/staging/lustre/lnet/selftest/conrpc.c
> index e73b956d15e4..7809c1fc6f73 100644
> --- a/drivers/staging/lustre/lnet/selftest/conrpc.c
> +++ b/drivers/staging/lustre/lnet/selftest/conrpc.c
> @@ -1345,8 +1345,7 @@ lstcon_rpc_cleanup_wait(void)
> 		mutex_unlock(&console_session.ses_mutex);
> 
> 		CWARN("Session is shutting down, waiting for termination of transactions\n");
> -		set_current_state(TASK_UNINTERRUPTIBLE);
> -		schedule_timeout(HZ);
> +		schedule_timeout_uninterruptible(HZ);
> 
> 		mutex_lock(&console_session.ses_mutex);
> 	}
> diff --git a/drivers/staging/lustre/lnet/selftest/rpc.c b/drivers/staging/lustre/lnet/selftest/rpc.c
> index e097ef8414a6..298de41444b3 100644
> --- a/drivers/staging/lustre/lnet/selftest/rpc.c
> +++ b/drivers/staging/lustre/lnet/selftest/rpc.c
> @@ -1603,8 +1603,7 @@ srpc_startup(void)
> 	spin_lock_init(&srpc_data.rpc_glock);
> 
> 	/* 1 second pause to avoid timestamp reuse */
> -	set_current_state(TASK_UNINTERRUPTIBLE);
> -	schedule_timeout(HZ);
> +	schedule_timeout_uninterruptible(HZ);
> 	srpc_data.rpc_matchbits = ((__u64)ktime_get_real_seconds()) << 48;
> 
> 	srpc_data.rpc_state = SRPC_STATE_NONE;
> diff --git a/drivers/staging/lustre/lnet/selftest/selftest.h b/drivers/staging/lustre/lnet/selftest/selftest.h
> index ad9be095c4ea..9dbb0a51d430 100644
> --- a/drivers/staging/lustre/lnet/selftest/selftest.h
> +++ b/drivers/staging/lustre/lnet/selftest/selftest.h
> @@ -573,8 +573,7 @@ swi_state2str(int state)
> 
> #define selftest_wait_events()					\
> 	do {							\
> -		set_current_state(TASK_UNINTERRUPTIBLE);	\
> -		schedule_timeout(HZ / 10);	\
> +		schedule_timeout_uninterruptible(HZ / 10);	\
> 	} while (0)
> 
> #define lst_wait_until(cond, lock, fmt, ...)				\
> diff --git a/drivers/staging/lustre/lustre/include/lustre_mdc.h b/drivers/staging/lustre/lustre/include/lustre_mdc.h
> index a9c9992a2502..6ac7fc4fa8c6 100644
> --- a/drivers/staging/lustre/lustre/include/lustre_mdc.h
> +++ b/drivers/staging/lustre/lustre/include/lustre_mdc.h
> @@ -124,7 +124,7 @@ static inline void mdc_get_rpc_lock(struct mdc_rpc_lock *lck,
> 	 */
> 	while (unlikely(lck->rpcl_it == MDC_FAKE_RPCL_IT)) {
> 		mutex_unlock(&lck->rpcl_mutex);
> -		schedule_timeout(HZ / 4);
> +		schedule_timeout_uninterruptible(HZ / 4);
> 		goto again;
> 	}
> 
> diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c b/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c
> index 5b125fdc7321..0ee4798f1bb9 100644
> --- a/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c
> +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c
> @@ -167,8 +167,7 @@ static void ldlm_handle_cp_callback(struct ptlrpc_request *req,
> 		int to = HZ;
> 
> 		while (to > 0) {
> -			set_current_state(TASK_INTERRUPTIBLE);
> -			schedule_timeout(to);
> +			schedule_timeout_interruptible(to);
> 			if (lock->l_granted_mode == lock->l_req_mode ||
> 			    ldlm_is_destroyed(lock))
> 				break;
> diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c b/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c
> index f06cbd8b6d13..33d73fa8e9d5 100644
> --- a/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c
> +++ b/drivers/staging/lustre/lustre/ldlm/ldlm_resource.c
> @@ -749,11 +749,9 @@ static void cleanup_resource(struct ldlm_resource *res, struct list_head *q,
> 			 */
> 			unlock_res(res);
> 			LDLM_DEBUG(lock, "setting FL_LOCAL_ONLY");
> -			if (lock->l_flags & LDLM_FL_FAIL_LOC) {
> -				set_current_state(TASK_UNINTERRUPTIBLE);
> -				schedule_timeout(4 * HZ);
> -				set_current_state(TASK_RUNNING);
> -			}
> +			if (lock->l_flags & LDLM_FL_FAIL_LOC)
> +				schedule_timeout_uninterruptible(4 * HZ);
> +
> 			if (lock->l_completion_ast)
> 				lock->l_completion_ast(lock, LDLM_FL_FAILED,
> 						       NULL);
> diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c
> index 5c8d0fe7217e..3dedc61d2257 100644
> --- a/drivers/staging/lustre/lustre/llite/llite_lib.c
> +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c
> @@ -706,10 +706,8 @@ void ll_kill_super(struct super_block *sb)
> 		sbi->ll_umounting = 1;
> 
> 		/* wait running statahead threads to quit */
> -		while (atomic_read(&sbi->ll_sa_running) > 0) {
> -			set_current_state(TASK_UNINTERRUPTIBLE);
> -			schedule_timeout(msecs_to_jiffies(MSEC_PER_SEC >> 3));
> -		}
> +		while (atomic_read(&sbi->ll_sa_running) > 0)
> +			schedule_timeout_uninterruptible(HZ >> 3);
> 	}
> }
> 
> diff --git a/drivers/staging/lustre/lustre/obdecho/echo_client.c b/drivers/staging/lustre/lustre/obdecho/echo_client.c
> index 3022706c6985..1ddb4a6dd8f3 100644
> --- a/drivers/staging/lustre/lustre/obdecho/echo_client.c
> +++ b/drivers/staging/lustre/lustre/obdecho/echo_client.c
> @@ -751,8 +751,7 @@ static struct lu_device *echo_device_free(const struct lu_env *env,
> 	while (!list_empty(&ec->ec_objects)) {
> 		spin_unlock(&ec->ec_lock);
> 		CERROR("echo_client still has objects at cleanup time, wait for 1 second\n");
> -		set_current_state(TASK_UNINTERRUPTIBLE);
> -		schedule_timeout(HZ);
> +		schedule_timeout_uninterruptible(HZ);
> 		lu_site_purge(env, ed->ed_site, -1);
> 		spin_lock(&ec->ec_lock);
> 	}
> diff --git a/drivers/staging/lustre/lustre/ptlrpc/client.c b/drivers/staging/lustre/lustre/ptlrpc/client.c
> index 7a3d83c0e50b..91dd09867260 100644
> --- a/drivers/staging/lustre/lustre/ptlrpc/client.c
> +++ b/drivers/staging/lustre/lustre/ptlrpc/client.c
> @@ -761,9 +761,7 @@ int ptlrpc_request_bufs_pack(struct ptlrpc_request *request,
> 			/* The RPC is infected, let the test change the
> 			 * fail_loc
> 			 */
> -			set_current_state(TASK_UNINTERRUPTIBLE);
> -			schedule_timeout(2 * HZ);
> -			set_current_state(TASK_RUNNING);
> +			schedule_timeout_uninterruptible(2 * HZ);
> 		}
> 	}
> 
> diff --git a/drivers/staging/lustre/lustre/ptlrpc/sec.c b/drivers/staging/lustre/lustre/ptlrpc/sec.c
> index 9b60292370a7..9c598710b576 100644
> --- a/drivers/staging/lustre/lustre/ptlrpc/sec.c
> +++ b/drivers/staging/lustre/lustre/ptlrpc/sec.c
> @@ -514,8 +514,7 @@ static int sptlrpc_req_replace_dead_ctx(struct ptlrpc_request *req)
> 		       "ctx (%p, fl %lx) doesn't switch, relax a little bit\n",
> 		       newctx, newctx->cc_flags);
> 
> -		set_current_state(TASK_INTERRUPTIBLE);
> -		schedule_timeout(msecs_to_jiffies(MSEC_PER_SEC));
> +		schedule_timeout_interruptible(HZ);
> 	} else if (unlikely(!test_bit(PTLRPC_CTX_UPTODATE_BIT, &newctx->cc_flags))) {
> 		/*
> 		 * new ctx not up to date yet
> 
> 

Cheers, Andreas
---
Andreas Dilger
CTO Whamcloud




-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 235 bytes
Desc: Message signed with OpenPGP
URL: <http://lists.lustre.org/pipermail/lustre-devel-lustre.org/attachments/20180730/af0d9a23/attachment.sig>


More information about the lustre-devel mailing list