All of lore.kernel.org
 help / color / mirror / Atom feed
From: Patrick Farrell <paf@cray.com>
To: NeilBrown <neilb@suse.com>, Oleg Drokin <oleg.drokin@intel.com>,
	Andreas Dilger <andreas.dilger@intel.com>,
	James Simmons <jsimmons@infradead.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
	lustre <lustre-devel@lists.lustre.org>
Subject: [lustre-devel] [PATCH 02/16] staging: lustre: replace simple cases of l_wait_event() with wait_event().
Date: Mon, 18 Dec 2017 17:48:53 +0000	[thread overview]
Message-ID: <D65D57DF.C5BA7%paf@cray.com> (raw)
In-Reply-To: <151358147981.5099.13114335078693829049.stgit@noble>

Ah, finally we?ve got that NOLOAD flag!  This will clear up several nasty
bugs around ptrace and sigkill that come when waiting with signals blocked
in TASK_INTERRUPTIBLE.  I see it was added in 2015?  The joys of working
with vendor kernels.

Thanks for these, Neil.  I?ll try to take a careful look.

Given the description of the commit that added TASK_NOLOAD, I?m kind of
shocked to see it has almost no users in the kernel yet.  Just a few
callers of schedule_timeout_idle, it looks like.  Even so, why not put
those macros in sched.h to begin with?

- Patrick

On 12/18/17, 1:17 AM, "lustre-devel on behalf of NeilBrown"
<lustre-devel-bounces at lists.lustre.org on behalf of neilb@suse.com> wrote:

>When the lwi arg is full of zeros, l_wait_event() behaves almost
>identically to the standard wait_event() interface, so use that
>instead.
>
>The only difference in behavior is that l_wait_event() blocks all
>signals and uses an TASK_INTERRUPTIBLE wait, while wait_event()
>does not block signals, but waits in state TASK_UNINTERRUPTIBLE.
>This means that processes blocked in wait_event() will contribute
>to the load average.  This behavior is (arguably) more correct - in
>most cases.
>
>In some cases, the wait is in a service thread waiting for work to
>do.  In these case we should wait TASK_NOLOAD order with
>TASK_UNINTERRUPTIBLE.  To facilitate this, add a "wait_event_noload()"
>macro.  This should eventually be moved into include/linux/wait.h.
>
>There is one case where wait_event_exclusive_noload() is needed.
>So we add a macro for that too.
>
>Signed-off-by: NeilBrown <neilb@suse.com>
>---
> drivers/staging/lustre/lustre/include/lustre_lib.h |   47
>++++++++++++++++---
> drivers/staging/lustre/lustre/ldlm/ldlm_lock.c     |    4 --
> drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c    |    8 +--
> drivers/staging/lustre/lustre/ldlm/ldlm_pool.c     |    5 +-
> drivers/staging/lustre/lustre/llite/statahead.c    |   50
>++++++++------------
> drivers/staging/lustre/lustre/lov/lov_object.c     |    6 +-
> drivers/staging/lustre/lustre/mgc/mgc_request.c    |    4 --
> drivers/staging/lustre/lustre/obdclass/cl_io.c     |    6 +-
> drivers/staging/lustre/lustre/obdclass/genops.c    |   15 ++----
> drivers/staging/lustre/lustre/osc/osc_cache.c      |    5 +-
> drivers/staging/lustre/lustre/osc/osc_object.c     |    4 --
> drivers/staging/lustre/lustre/ptlrpc/pinger.c      |   10 ++--
> drivers/staging/lustre/lustre/ptlrpc/sec_gc.c      |   11 ++--
> drivers/staging/lustre/lustre/ptlrpc/service.c     |   13 ++---
> 14 files changed, 93 insertions(+), 95 deletions(-)
>
>diff --git a/drivers/staging/lustre/lustre/include/lustre_lib.h
>b/drivers/staging/lustre/lustre/include/lustre_lib.h
>index ca1dce15337e..08bdd618ea7d 100644
>--- a/drivers/staging/lustre/lustre/include/lustre_lib.h
>+++ b/drivers/staging/lustre/lustre/include/lustre_lib.h
>@@ -333,12 +333,6 @@ do {									   \
> 	__ret;						  \
> })
> 
>-#define l_wait_condition(wq, condition)			 \
>-({							      \
>-	struct l_wait_info lwi = { 0 };			 \
>-	l_wait_event(wq, condition, &lwi);		      \
>-})
>-
> #define l_wait_condition_exclusive(wq, condition)	       \
> ({							      \
> 	struct l_wait_info lwi = { 0 };			 \
>@@ -353,4 +347,45 @@ do {									   \
> 
> /** @} lib */
> 
>+#define __wait_event_noload(wq_head, condition)					\
>+	(void)___wait_event(wq_head, condition, (TASK_UNINTERRUPTIBLE |
>TASK_NOLOAD), 0, 0, \
>+			    schedule())
>+
>+/**
>+ * wait_event_noload - sleep, without registering load, until a
>condition gets true
>+ * @wq_head: the waitqueue to wait on
>+ * @condition: a C expression for the event to wait for
>+ *
>+ * The process is put to sleep (TASK_UNINTERRUPTIBLE|TASK_NOLOAD) until
>the
>+ * @condition evaluates to true. The @condition is checked each time
>+ * the waitqueue @wq_head is woken up.
>+ *
>+ * wake_up() has to be called after changing any variable that could
>+ * change the result of the wait condition.
>+ *
>+ * This can be used instead of wait_event() when the event
>+ * being waited for is does not imply load on the system, but
>+ * when responding to signals is no appropriate, such as in
>+ * a kernel service thread.
>+ */
>+#define wait_event_noload(wq_head, condition)					\
>+do {										\
>+	might_sleep();								\
>+	if (condition)								\
>+		break;								\
>+	__wait_event_noload(wq_head, condition);				\
>+} while (0)
>+
>+/*
>+ * Just like wait_event_noload(), except it sets exclusive flag
>+ */
>+#define wait_event_exclusive_noload(wq_head, condition)				\
>+do {										\
>+	if (condition)								\
>+		break;								\
>+	(void)___wait_event(wq_head, condition,					\
>+			    (TASK_UNINTERRUPTIBLE | TASK_NOLOAD), 1, 0,		\
>+			    schedule());					\
>+} while (0)
>+
> #endif /* _LUSTRE_LIB_H */
>diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c
>b/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c
>index 7cbc6a06afec..975fabc73148 100644
>--- a/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c
>+++ b/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c
>@@ -1913,14 +1913,12 @@ void ldlm_cancel_callback(struct ldlm_lock *lock)
> 		ldlm_set_bl_done(lock);
> 		wake_up_all(&lock->l_waitq);
> 	} else if (!ldlm_is_bl_done(lock)) {
>-		struct l_wait_info lwi = { 0 };
>-
> 		/*
> 		 * The lock is guaranteed to have been canceled once
> 		 * returning from this function.
> 		 */
> 		unlock_res_and_lock(lock);
>-		l_wait_event(lock->l_waitq, is_bl_done(lock), &lwi);
>+		wait_event(lock->l_waitq, is_bl_done(lock));
> 		lock_res_and_lock(lock);
> 	}
> }
>diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c
>b/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c
>index 5f6e7c933b81..d9835418d340 100644
>--- a/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c
>+++ b/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c
>@@ -833,17 +833,15 @@ static int ldlm_bl_thread_main(void *arg)
> 	/* cannot use bltd after this, it is only on caller's stack */
> 
> 	while (1) {
>-		struct l_wait_info lwi = { 0 };
> 		struct ldlm_bl_work_item *blwi = NULL;
> 		struct obd_export *exp = NULL;
> 		int rc;
> 
> 		rc = ldlm_bl_get_work(blp, &blwi, &exp);
> 		if (!rc)
>-			l_wait_event_exclusive(blp->blp_waitq,
>-					       ldlm_bl_get_work(blp, &blwi,
>-								&exp),
>-					       &lwi);
>+			wait_event_exclusive_noload(blp->blp_waitq,
>+						    ldlm_bl_get_work(blp, &blwi,
>+								     &exp));
> 		atomic_inc(&blp->blp_busy_threads);
> 
> 		if (ldlm_bl_thread_need_create(blp, blwi))
>diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c
>b/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c
>index 8563bd32befa..d562f90cee97 100644
>--- a/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c
>+++ b/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c
>@@ -1031,7 +1031,6 @@ static int ldlm_pools_thread_main(void *arg)
> 
> static int ldlm_pools_thread_start(void)
> {
>-	struct l_wait_info lwi = { 0 };
> 	struct task_struct *task;
> 
> 	if (ldlm_pools_thread)
>@@ -1052,8 +1051,8 @@ static int ldlm_pools_thread_start(void)
> 		ldlm_pools_thread = NULL;
> 		return PTR_ERR(task);
> 	}
>-	l_wait_event(ldlm_pools_thread->t_ctl_waitq,
>-		     thread_is_running(ldlm_pools_thread), &lwi);
>+	wait_event(ldlm_pools_thread->t_ctl_waitq,
>+		   thread_is_running(ldlm_pools_thread));
> 	return 0;
> }
> 
>diff --git a/drivers/staging/lustre/lustre/llite/statahead.c
>b/drivers/staging/lustre/lustre/llite/statahead.c
>index 90c7324575e4..39040916a043 100644
>--- a/drivers/staging/lustre/lustre/llite/statahead.c
>+++ b/drivers/staging/lustre/lustre/llite/statahead.c
>@@ -864,7 +864,6 @@ static int ll_agl_thread(void *arg)
> 	struct ll_sb_info	*sbi    = ll_i2sbi(dir);
> 	struct ll_statahead_info *sai;
> 	struct ptlrpc_thread *thread;
>-	struct l_wait_info	lwi    = { 0 };
> 
> 	sai = ll_sai_get(dir);
> 	thread = &sai->sai_agl_thread;
>@@ -885,10 +884,9 @@ static int ll_agl_thread(void *arg)
> 	wake_up(&thread->t_ctl_waitq);
> 
> 	while (1) {
>-		l_wait_event(thread->t_ctl_waitq,
>-			     !list_empty(&sai->sai_agls) ||
>-			     !thread_is_running(thread),
>-			     &lwi);
>+		wait_event_noload(thread->t_ctl_waitq,
>+				  !list_empty(&sai->sai_agls) ||
>+				  !thread_is_running(thread));
> 
> 		if (!thread_is_running(thread))
> 			break;
>@@ -932,7 +930,6 @@ static int ll_agl_thread(void *arg)
> static void ll_start_agl(struct dentry *parent, struct ll_statahead_info
>*sai)
> {
> 	struct ptlrpc_thread *thread = &sai->sai_agl_thread;
>-	struct l_wait_info    lwi    = { 0 };
> 	struct ll_inode_info  *plli;
> 	struct task_struct *task;
> 
>@@ -948,9 +945,8 @@ static void ll_start_agl(struct dentry *parent,
>struct ll_statahead_info *sai)
> 		return;
> 	}
> 
>-	l_wait_event(thread->t_ctl_waitq,
>-		     thread_is_running(thread) || thread_is_stopped(thread),
>-		     &lwi);
>+	wait_event(thread->t_ctl_waitq,
>+		   thread_is_running(thread) || thread_is_stopped(thread));
> }
> 
> /* statahead thread main function */
>@@ -968,7 +964,6 @@ static int ll_statahead_thread(void *arg)
> 	int		       first  = 0;
> 	int		       rc     = 0;
> 	struct md_op_data *op_data;
>-	struct l_wait_info	lwi    = { 0 };
> 
> 	sai = ll_sai_get(dir);
> 	sa_thread = &sai->sai_thread;
>@@ -1069,12 +1064,11 @@ static int ll_statahead_thread(void *arg)
> 
> 			/* wait for spare statahead window */
> 			do {
>-				l_wait_event(sa_thread->t_ctl_waitq,
>-					     !sa_sent_full(sai) ||
>-					     sa_has_callback(sai) ||
>-					     !list_empty(&sai->sai_agls) ||
>-					     !thread_is_running(sa_thread),
>-					     &lwi);
>+				wait_event(sa_thread->t_ctl_waitq,
>+					   !sa_sent_full(sai) ||
>+					   sa_has_callback(sai) ||
>+					   !list_empty(&sai->sai_agls) ||
>+					   !thread_is_running(sa_thread));
> 				sa_handle_callback(sai);
> 
> 				spin_lock(&lli->lli_agl_lock);
>@@ -1128,11 +1122,10 @@ static int ll_statahead_thread(void *arg)
> 	 * for file release to stop me.
> 	 */
> 	while (thread_is_running(sa_thread)) {
>-		l_wait_event(sa_thread->t_ctl_waitq,
>-			     sa_has_callback(sai) ||
>-			     !agl_list_empty(sai) ||
>-			     !thread_is_running(sa_thread),
>-			     &lwi);
>+		wait_event(sa_thread->t_ctl_waitq,
>+			   sa_has_callback(sai) ||
>+			   !agl_list_empty(sai) ||
>+			   !thread_is_running(sa_thread));
> 
> 		sa_handle_callback(sai);
> 	}
>@@ -1145,9 +1138,8 @@ static int ll_statahead_thread(void *arg)
> 
> 		CDEBUG(D_READA, "stop agl thread: sai %p pid %u\n",
> 		       sai, (unsigned int)agl_thread->t_pid);
>-		l_wait_event(agl_thread->t_ctl_waitq,
>-			     thread_is_stopped(agl_thread),
>-			     &lwi);
>+		wait_event(agl_thread->t_ctl_waitq,
>+			   thread_is_stopped(agl_thread));
> 	} else {
> 		/* Set agl_thread flags anyway. */
> 		thread_set_flags(agl_thread, SVC_STOPPED);
>@@ -1159,8 +1151,8 @@ static int ll_statahead_thread(void *arg)
> 	 */
> 	while (sai->sai_sent != sai->sai_replied) {
> 		/* in case we're not woken up, timeout wait */
>-		lwi = LWI_TIMEOUT(msecs_to_jiffies(MSEC_PER_SEC >> 3),
>-				  NULL, NULL);
>+		struct l_wait_info lwi = LWI_TIMEOUT(msecs_to_jiffies(MSEC_PER_SEC >>
>3),
>+						     NULL, NULL);
> 		l_wait_event(sa_thread->t_ctl_waitq,
> 			     sai->sai_sent == sai->sai_replied, &lwi);
> 	}
>@@ -1520,7 +1512,6 @@ static int start_statahead_thread(struct inode
>*dir, struct dentry *dentry)
> {
> 	struct ll_inode_info *lli = ll_i2info(dir);
> 	struct ll_statahead_info *sai = NULL;
>-	struct l_wait_info lwi = { 0 };
> 	struct ptlrpc_thread *thread;
> 	struct task_struct *task;
> 	struct dentry *parent = dentry->d_parent;
>@@ -1570,9 +1561,8 @@ static int start_statahead_thread(struct inode
>*dir, struct dentry *dentry)
> 		goto out;
> 	}
> 
>-	l_wait_event(thread->t_ctl_waitq,
>-		     thread_is_running(thread) || thread_is_stopped(thread),
>-		     &lwi);
>+	wait_event(thread->t_ctl_waitq,
>+		   thread_is_running(thread) || thread_is_stopped(thread));
> 	ll_sai_put(sai);
> 
> 	/*
>diff --git a/drivers/staging/lustre/lustre/lov/lov_object.c
>b/drivers/staging/lustre/lustre/lov/lov_object.c
>index 897cf2cd4a24..aa82f2ed40ae 100644
>--- a/drivers/staging/lustre/lustre/lov/lov_object.c
>+++ b/drivers/staging/lustre/lustre/lov/lov_object.c
>@@ -723,15 +723,13 @@ static void lov_conf_unlock(struct lov_object *lov)
> 
> static int lov_layout_wait(const struct lu_env *env, struct lov_object
>*lov)
> {
>-	struct l_wait_info lwi = { 0 };
>-
> 	while (atomic_read(&lov->lo_active_ios) > 0) {
> 		CDEBUG(D_INODE, "file:" DFID " wait for active IO, now: %d.\n",
> 		       PFID(lu_object_fid(lov2lu(lov))),
> 		       atomic_read(&lov->lo_active_ios));
> 
>-		l_wait_event(lov->lo_waitq,
>-			     atomic_read(&lov->lo_active_ios) == 0, &lwi);
>+		wait_event(lov->lo_waitq,
>+			   atomic_read(&lov->lo_active_ios) == 0);
> 	}
> 	return 0;
> }
>diff --git a/drivers/staging/lustre/lustre/mgc/mgc_request.c
>b/drivers/staging/lustre/lustre/mgc/mgc_request.c
>index 79ff85feab64..81b101941eec 100644
>--- a/drivers/staging/lustre/lustre/mgc/mgc_request.c
>+++ b/drivers/staging/lustre/lustre/mgc/mgc_request.c
>@@ -601,9 +601,7 @@ static int mgc_requeue_thread(void *data)
> 			config_log_put(cld_prev);
> 
> 		/* Wait a bit to see if anyone else needs a requeue */
>-		lwi = (struct l_wait_info) { 0 };
>-		l_wait_event(rq_waitq, rq_state & (RQ_NOW | RQ_STOP),
>-			     &lwi);
>+		wait_event(rq_waitq, rq_state & (RQ_NOW | RQ_STOP));
> 		spin_lock(&config_list_lock);
> 	}
> 
>diff --git a/drivers/staging/lustre/lustre/obdclass/cl_io.c
>b/drivers/staging/lustre/lustre/obdclass/cl_io.c
>index 6ec5218a18c1..a3fb2bbde70f 100644
>--- a/drivers/staging/lustre/lustre/obdclass/cl_io.c
>+++ b/drivers/staging/lustre/lustre/obdclass/cl_io.c
>@@ -1110,10 +1110,8 @@ int cl_sync_io_wait(const struct lu_env *env,
>struct cl_sync_io *anchor,
> 		CERROR("IO failed: %d, still wait for %d remaining entries\n",
> 		       rc, atomic_read(&anchor->csi_sync_nr));
> 
>-		lwi = (struct l_wait_info) { 0 };
>-		(void)l_wait_event(anchor->csi_waitq,
>-				   atomic_read(&anchor->csi_sync_nr) == 0,
>-				   &lwi);
>+		wait_event(anchor->csi_waitq,
>+			   atomic_read(&anchor->csi_sync_nr) == 0);
> 	} else {
> 		rc = anchor->csi_sync_rc;
> 	}
>diff --git a/drivers/staging/lustre/lustre/obdclass/genops.c
>b/drivers/staging/lustre/lustre/obdclass/genops.c
>index b1d6ba4a3190..78f0fa1dff45 100644
>--- a/drivers/staging/lustre/lustre/obdclass/genops.c
>+++ b/drivers/staging/lustre/lustre/obdclass/genops.c
>@@ -1237,12 +1237,10 @@ static int obd_zombie_is_idle(void)
>  */
> void obd_zombie_barrier(void)
> {
>-	struct l_wait_info lwi = { 0 };
>-
> 	if (obd_zombie_pid == current_pid())
> 		/* don't wait for myself */
> 		return;
>-	l_wait_event(obd_zombie_waitq, obd_zombie_is_idle(), &lwi);
>+	wait_event(obd_zombie_waitq, obd_zombie_is_idle());
> }
> EXPORT_SYMBOL(obd_zombie_barrier);
> 
>@@ -1257,10 +1255,8 @@ static int obd_zombie_impexp_thread(void *unused)
> 	obd_zombie_pid = current_pid();
> 
> 	while (!test_bit(OBD_ZOMBIE_STOP, &obd_zombie_flags)) {
>-		struct l_wait_info lwi = { 0 };
>-
>-		l_wait_event(obd_zombie_waitq,
>-			     !obd_zombie_impexp_check(NULL), &lwi);
>+		wait_event_noload(obd_zombie_waitq,
>+				  !obd_zombie_impexp_check(NULL));
> 		obd_zombie_impexp_cull();
> 
> 		/*
>@@ -1593,7 +1589,6 @@ static inline bool obd_mod_rpc_slot_avail(struct
>client_obd *cli,
> u16 obd_get_mod_rpc_slot(struct client_obd *cli, __u32 opc,
> 			 struct lookup_intent *it)
> {
>-	struct l_wait_info lwi = LWI_INTR(NULL, NULL);
> 	bool close_req = false;
> 	u16 i, max;
> 
>@@ -1631,8 +1626,8 @@ u16 obd_get_mod_rpc_slot(struct client_obd *cli,
>__u32 opc,
> 		CDEBUG(D_RPCTRACE, "%s: sleeping for a modify RPC slot opc %u, max
>%hu\n",
> 		       cli->cl_import->imp_obd->obd_name, opc, max);
> 
>-		l_wait_event(cli->cl_mod_rpcs_waitq,
>-			     obd_mod_rpc_slot_avail(cli, close_req), &lwi);
>+		wait_event(cli->cl_mod_rpcs_waitq,
>+			   obd_mod_rpc_slot_avail(cli, close_req));
> 	} while (true);
> }
> EXPORT_SYMBOL(obd_get_mod_rpc_slot);
>diff --git a/drivers/staging/lustre/lustre/osc/osc_cache.c
>b/drivers/staging/lustre/lustre/osc/osc_cache.c
>index 5767ac2a7d16..d58a25a2a5b4 100644
>--- a/drivers/staging/lustre/lustre/osc/osc_cache.c
>+++ b/drivers/staging/lustre/lustre/osc/osc_cache.c
>@@ -964,9 +964,8 @@ static int osc_extent_wait(const struct lu_env *env,
>struct osc_extent *ext,
> 				"%s: wait ext to %u timedout, recovery in progress?\n",
> 				cli_name(osc_cli(obj)), state);
> 
>-		lwi = LWI_INTR(NULL, NULL);
>-		rc = l_wait_event(ext->oe_waitq, extent_wait_cb(ext, state),
>-				  &lwi);
>+		wait_event(ext->oe_waitq, extent_wait_cb(ext, state));
>+		rc = 0;
> 	}
> 	if (rc == 0 && ext->oe_rc < 0)
> 		rc = ext->oe_rc;
>diff --git a/drivers/staging/lustre/lustre/osc/osc_object.c
>b/drivers/staging/lustre/lustre/osc/osc_object.c
>index f82c87a77550..1de25496a7d9 100644
>--- a/drivers/staging/lustre/lustre/osc/osc_object.c
>+++ b/drivers/staging/lustre/lustre/osc/osc_object.c
>@@ -454,12 +454,10 @@ struct lu_object *osc_object_alloc(const struct
>lu_env *env,
> 
> int osc_object_invalidate(const struct lu_env *env, struct osc_object
>*osc)
> {
>-	struct l_wait_info lwi = { 0 };
>-
> 	CDEBUG(D_INODE, "Invalidate osc object: %p, # of active IOs: %d\n",
> 	       osc, atomic_read(&osc->oo_nr_ios));
> 
>-	l_wait_event(osc->oo_io_waitq, !atomic_read(&osc->oo_nr_ios), &lwi);
>+	wait_event(osc->oo_io_waitq, !atomic_read(&osc->oo_nr_ios));
> 
> 	/* Discard all dirty pages of this object. */
> 	osc_cache_truncate_start(env, osc, 0, NULL);
>diff --git a/drivers/staging/lustre/lustre/ptlrpc/pinger.c
>b/drivers/staging/lustre/lustre/ptlrpc/pinger.c
>index fe6b47bfe8be..4148a6661dcf 100644
>--- a/drivers/staging/lustre/lustre/ptlrpc/pinger.c
>+++ b/drivers/staging/lustre/lustre/ptlrpc/pinger.c
>@@ -291,7 +291,6 @@ static struct ptlrpc_thread pinger_thread;
> 
> int ptlrpc_start_pinger(void)
> {
>-	struct l_wait_info lwi = { 0 };
> 	struct task_struct *task;
> 	int rc;
> 
>@@ -310,8 +309,8 @@ int ptlrpc_start_pinger(void)
> 		CERROR("cannot start pinger thread: rc = %d\n", rc);
> 		return rc;
> 	}
>-	l_wait_event(pinger_thread.t_ctl_waitq,
>-		     thread_is_running(&pinger_thread), &lwi);
>+	wait_event(pinger_thread.t_ctl_waitq,
>+		   thread_is_running(&pinger_thread));
> 
> 	return 0;
> }
>@@ -320,7 +319,6 @@ static int ptlrpc_pinger_remove_timeouts(void);
> 
> int ptlrpc_stop_pinger(void)
> {
>-	struct l_wait_info lwi = { 0 };
> 	int rc = 0;
> 
> 	if (thread_is_init(&pinger_thread) ||
>@@ -331,8 +329,8 @@ int ptlrpc_stop_pinger(void)
> 	thread_set_flags(&pinger_thread, SVC_STOPPING);
> 	wake_up(&pinger_thread.t_ctl_waitq);
> 
>-	l_wait_event(pinger_thread.t_ctl_waitq,
>-		     thread_is_stopped(&pinger_thread), &lwi);
>+	wait_event(pinger_thread.t_ctl_waitq,
>+		   thread_is_stopped(&pinger_thread));
> 
> 	return rc;
> }
>diff --git a/drivers/staging/lustre/lustre/ptlrpc/sec_gc.c
>b/drivers/staging/lustre/lustre/ptlrpc/sec_gc.c
>index d85c8638c009..e4197a60d1e2 100644
>--- a/drivers/staging/lustre/lustre/ptlrpc/sec_gc.c
>+++ b/drivers/staging/lustre/lustre/ptlrpc/sec_gc.c
>@@ -197,7 +197,6 @@ static int sec_gc_main(void *arg)
> 
> int sptlrpc_gc_init(void)
> {
>-	struct l_wait_info lwi = { 0 };
> 	struct task_struct *task;
> 
> 	mutex_init(&sec_gc_mutex);
>@@ -214,18 +213,16 @@ int sptlrpc_gc_init(void)
> 		return PTR_ERR(task);
> 	}
> 
>-	l_wait_event(sec_gc_thread.t_ctl_waitq,
>-		     thread_is_running(&sec_gc_thread), &lwi);
>+	wait_event(sec_gc_thread.t_ctl_waitq,
>+		   thread_is_running(&sec_gc_thread));
> 	return 0;
> }
> 
> void sptlrpc_gc_fini(void)
> {
>-	struct l_wait_info lwi = { 0 };
>-
> 	thread_set_flags(&sec_gc_thread, SVC_STOPPING);
> 	wake_up(&sec_gc_thread.t_ctl_waitq);
> 
>-	l_wait_event(sec_gc_thread.t_ctl_waitq,
>-		     thread_is_stopped(&sec_gc_thread), &lwi);
>+	wait_event(sec_gc_thread.t_ctl_waitq,
>+		   thread_is_stopped(&sec_gc_thread));
> }
>diff --git a/drivers/staging/lustre/lustre/ptlrpc/service.c
>b/drivers/staging/lustre/lustre/ptlrpc/service.c
>index 63be6e7273f3..d688cb3ff157 100644
>--- a/drivers/staging/lustre/lustre/ptlrpc/service.c
>+++ b/drivers/staging/lustre/lustre/ptlrpc/service.c
>@@ -2233,7 +2233,7 @@ static int ptlrpc_hr_main(void *arg)
> 	wake_up(&ptlrpc_hr.hr_waitq);
> 
> 	while (!ptlrpc_hr.hr_stopping) {
>-		l_wait_condition(hrt->hrt_waitq, hrt_dont_sleep(hrt, &replies));
>+		wait_event_noload(hrt->hrt_waitq, hrt_dont_sleep(hrt, &replies));
> 
> 		while (!list_empty(&replies)) {
> 			struct ptlrpc_reply_state *rs;
>@@ -2312,7 +2312,6 @@ static int ptlrpc_start_hr_threads(void)
> 
> static void ptlrpc_svcpt_stop_threads(struct ptlrpc_service_part *svcpt)
> {
>-	struct l_wait_info lwi = { 0 };
> 	struct ptlrpc_thread *thread;
> 	LIST_HEAD(zombie);
> 
>@@ -2341,8 +2340,8 @@ static void ptlrpc_svcpt_stop_threads(struct
>ptlrpc_service_part *svcpt)
> 
> 		CDEBUG(D_INFO, "waiting for stopping-thread %s #%u\n",
> 		       svcpt->scp_service->srv_thread_name, thread->t_id);
>-		l_wait_event(thread->t_ctl_waitq,
>-			     thread_is_stopped(thread), &lwi);
>+		wait_event(thread->t_ctl_waitq,
>+			   thread_is_stopped(thread));
> 
> 		spin_lock(&svcpt->scp_lock);
> 	}
>@@ -2403,7 +2402,6 @@ int ptlrpc_start_threads(struct ptlrpc_service *svc)
> 
> int ptlrpc_start_thread(struct ptlrpc_service_part *svcpt, int wait)
> {
>-	struct l_wait_info lwi = { 0 };
> 	struct ptlrpc_thread *thread;
> 	struct ptlrpc_service *svc;
> 	struct task_struct *task;
>@@ -2499,9 +2497,8 @@ int ptlrpc_start_thread(struct ptlrpc_service_part
>*svcpt, int wait)
> 	if (!wait)
> 		return 0;
> 
>-	l_wait_event(thread->t_ctl_waitq,
>-		     thread_is_running(thread) || thread_is_stopped(thread),
>-		     &lwi);
>+	wait_event(thread->t_ctl_waitq,
>+		   thread_is_running(thread) || thread_is_stopped(thread));
> 
> 	rc = thread_is_stopped(thread) ? thread->t_id : 0;
> 	return rc;
>
>
>_______________________________________________
>lustre-devel mailing list
>lustre-devel at lists.lustre.org
>http://lists.lustre.org/listinfo.cgi/lustre-devel-lustre.org

WARNING: multiple messages have this Message-ID (diff)
From: Patrick Farrell <paf@cray.com>
To: NeilBrown <neilb@suse.com>, Oleg Drokin <oleg.drokin@intel.com>,
	"Andreas Dilger" <andreas.dilger@intel.com>,
	James Simmons <jsimmons@infradead.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: lkml <linux-kernel@vger.kernel.org>,
	lustre <lustre-devel@lists.lustre.org>
Subject: Re: [lustre-devel] [PATCH 02/16] staging: lustre: replace simple cases of l_wait_event() with wait_event().
Date: Mon, 18 Dec 2017 17:48:53 +0000	[thread overview]
Message-ID: <D65D57DF.C5BA7%paf@cray.com> (raw)
In-Reply-To: <151358147981.5099.13114335078693829049.stgit@noble>

Ah, finally we¹ve got that NOLOAD flag!  This will clear up several nasty
bugs around ptrace and sigkill that come when waiting with signals blocked
in TASK_INTERRUPTIBLE.  I see it was added in 2015Š  The joys of working
with vendor kernels.

Thanks for these, Neil.  I¹ll try to take a careful look.

Given the description of the commit that added TASK_NOLOAD, I¹m kind of
shocked to see it has almost no users in the kernel yet.  Just a few
callers of schedule_timeout_idle, it looks like.  Even so, why not put
those macros in sched.h to begin with?

- Patrick

On 12/18/17, 1:17 AM, "lustre-devel on behalf of NeilBrown"
<lustre-devel-bounces@lists.lustre.org on behalf of neilb@suse.com> wrote:

>When the lwi arg is full of zeros, l_wait_event() behaves almost
>identically to the standard wait_event() interface, so use that
>instead.
>
>The only difference in behavior is that l_wait_event() blocks all
>signals and uses an TASK_INTERRUPTIBLE wait, while wait_event()
>does not block signals, but waits in state TASK_UNINTERRUPTIBLE.
>This means that processes blocked in wait_event() will contribute
>to the load average.  This behavior is (arguably) more correct - in
>most cases.
>
>In some cases, the wait is in a service thread waiting for work to
>do.  In these case we should wait TASK_NOLOAD order with
>TASK_UNINTERRUPTIBLE.  To facilitate this, add a "wait_event_noload()"
>macro.  This should eventually be moved into include/linux/wait.h.
>
>There is one case where wait_event_exclusive_noload() is needed.
>So we add a macro for that too.
>
>Signed-off-by: NeilBrown <neilb@suse.com>
>---
> drivers/staging/lustre/lustre/include/lustre_lib.h |   47
>++++++++++++++++---
> drivers/staging/lustre/lustre/ldlm/ldlm_lock.c     |    4 --
> drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c    |    8 +--
> drivers/staging/lustre/lustre/ldlm/ldlm_pool.c     |    5 +-
> drivers/staging/lustre/lustre/llite/statahead.c    |   50
>++++++++------------
> drivers/staging/lustre/lustre/lov/lov_object.c     |    6 +-
> drivers/staging/lustre/lustre/mgc/mgc_request.c    |    4 --
> drivers/staging/lustre/lustre/obdclass/cl_io.c     |    6 +-
> drivers/staging/lustre/lustre/obdclass/genops.c    |   15 ++----
> drivers/staging/lustre/lustre/osc/osc_cache.c      |    5 +-
> drivers/staging/lustre/lustre/osc/osc_object.c     |    4 --
> drivers/staging/lustre/lustre/ptlrpc/pinger.c      |   10 ++--
> drivers/staging/lustre/lustre/ptlrpc/sec_gc.c      |   11 ++--
> drivers/staging/lustre/lustre/ptlrpc/service.c     |   13 ++---
> 14 files changed, 93 insertions(+), 95 deletions(-)
>
>diff --git a/drivers/staging/lustre/lustre/include/lustre_lib.h
>b/drivers/staging/lustre/lustre/include/lustre_lib.h
>index ca1dce15337e..08bdd618ea7d 100644
>--- a/drivers/staging/lustre/lustre/include/lustre_lib.h
>+++ b/drivers/staging/lustre/lustre/include/lustre_lib.h
>@@ -333,12 +333,6 @@ do {									   \
> 	__ret;						  \
> })
> 
>-#define l_wait_condition(wq, condition)			 \
>-({							      \
>-	struct l_wait_info lwi = { 0 };			 \
>-	l_wait_event(wq, condition, &lwi);		      \
>-})
>-
> #define l_wait_condition_exclusive(wq, condition)	       \
> ({							      \
> 	struct l_wait_info lwi = { 0 };			 \
>@@ -353,4 +347,45 @@ do {									   \
> 
> /** @} lib */
> 
>+#define __wait_event_noload(wq_head, condition)					\
>+	(void)___wait_event(wq_head, condition, (TASK_UNINTERRUPTIBLE |
>TASK_NOLOAD), 0, 0, \
>+			    schedule())
>+
>+/**
>+ * wait_event_noload - sleep, without registering load, until a
>condition gets true
>+ * @wq_head: the waitqueue to wait on
>+ * @condition: a C expression for the event to wait for
>+ *
>+ * The process is put to sleep (TASK_UNINTERRUPTIBLE|TASK_NOLOAD) until
>the
>+ * @condition evaluates to true. The @condition is checked each time
>+ * the waitqueue @wq_head is woken up.
>+ *
>+ * wake_up() has to be called after changing any variable that could
>+ * change the result of the wait condition.
>+ *
>+ * This can be used instead of wait_event() when the event
>+ * being waited for is does not imply load on the system, but
>+ * when responding to signals is no appropriate, such as in
>+ * a kernel service thread.
>+ */
>+#define wait_event_noload(wq_head, condition)					\
>+do {										\
>+	might_sleep();								\
>+	if (condition)								\
>+		break;								\
>+	__wait_event_noload(wq_head, condition);				\
>+} while (0)
>+
>+/*
>+ * Just like wait_event_noload(), except it sets exclusive flag
>+ */
>+#define wait_event_exclusive_noload(wq_head, condition)				\
>+do {										\
>+	if (condition)								\
>+		break;								\
>+	(void)___wait_event(wq_head, condition,					\
>+			    (TASK_UNINTERRUPTIBLE | TASK_NOLOAD), 1, 0,		\
>+			    schedule());					\
>+} while (0)
>+
> #endif /* _LUSTRE_LIB_H */
>diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c
>b/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c
>index 7cbc6a06afec..975fabc73148 100644
>--- a/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c
>+++ b/drivers/staging/lustre/lustre/ldlm/ldlm_lock.c
>@@ -1913,14 +1913,12 @@ void ldlm_cancel_callback(struct ldlm_lock *lock)
> 		ldlm_set_bl_done(lock);
> 		wake_up_all(&lock->l_waitq);
> 	} else if (!ldlm_is_bl_done(lock)) {
>-		struct l_wait_info lwi = { 0 };
>-
> 		/*
> 		 * The lock is guaranteed to have been canceled once
> 		 * returning from this function.
> 		 */
> 		unlock_res_and_lock(lock);
>-		l_wait_event(lock->l_waitq, is_bl_done(lock), &lwi);
>+		wait_event(lock->l_waitq, is_bl_done(lock));
> 		lock_res_and_lock(lock);
> 	}
> }
>diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c
>b/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c
>index 5f6e7c933b81..d9835418d340 100644
>--- a/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c
>+++ b/drivers/staging/lustre/lustre/ldlm/ldlm_lockd.c
>@@ -833,17 +833,15 @@ static int ldlm_bl_thread_main(void *arg)
> 	/* cannot use bltd after this, it is only on caller's stack */
> 
> 	while (1) {
>-		struct l_wait_info lwi = { 0 };
> 		struct ldlm_bl_work_item *blwi = NULL;
> 		struct obd_export *exp = NULL;
> 		int rc;
> 
> 		rc = ldlm_bl_get_work(blp, &blwi, &exp);
> 		if (!rc)
>-			l_wait_event_exclusive(blp->blp_waitq,
>-					       ldlm_bl_get_work(blp, &blwi,
>-								&exp),
>-					       &lwi);
>+			wait_event_exclusive_noload(blp->blp_waitq,
>+						    ldlm_bl_get_work(blp, &blwi,
>+								     &exp));
> 		atomic_inc(&blp->blp_busy_threads);
> 
> 		if (ldlm_bl_thread_need_create(blp, blwi))
>diff --git a/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c
>b/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c
>index 8563bd32befa..d562f90cee97 100644
>--- a/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c
>+++ b/drivers/staging/lustre/lustre/ldlm/ldlm_pool.c
>@@ -1031,7 +1031,6 @@ static int ldlm_pools_thread_main(void *arg)
> 
> static int ldlm_pools_thread_start(void)
> {
>-	struct l_wait_info lwi = { 0 };
> 	struct task_struct *task;
> 
> 	if (ldlm_pools_thread)
>@@ -1052,8 +1051,8 @@ static int ldlm_pools_thread_start(void)
> 		ldlm_pools_thread = NULL;
> 		return PTR_ERR(task);
> 	}
>-	l_wait_event(ldlm_pools_thread->t_ctl_waitq,
>-		     thread_is_running(ldlm_pools_thread), &lwi);
>+	wait_event(ldlm_pools_thread->t_ctl_waitq,
>+		   thread_is_running(ldlm_pools_thread));
> 	return 0;
> }
> 
>diff --git a/drivers/staging/lustre/lustre/llite/statahead.c
>b/drivers/staging/lustre/lustre/llite/statahead.c
>index 90c7324575e4..39040916a043 100644
>--- a/drivers/staging/lustre/lustre/llite/statahead.c
>+++ b/drivers/staging/lustre/lustre/llite/statahead.c
>@@ -864,7 +864,6 @@ static int ll_agl_thread(void *arg)
> 	struct ll_sb_info	*sbi    = ll_i2sbi(dir);
> 	struct ll_statahead_info *sai;
> 	struct ptlrpc_thread *thread;
>-	struct l_wait_info	lwi    = { 0 };
> 
> 	sai = ll_sai_get(dir);
> 	thread = &sai->sai_agl_thread;
>@@ -885,10 +884,9 @@ static int ll_agl_thread(void *arg)
> 	wake_up(&thread->t_ctl_waitq);
> 
> 	while (1) {
>-		l_wait_event(thread->t_ctl_waitq,
>-			     !list_empty(&sai->sai_agls) ||
>-			     !thread_is_running(thread),
>-			     &lwi);
>+		wait_event_noload(thread->t_ctl_waitq,
>+				  !list_empty(&sai->sai_agls) ||
>+				  !thread_is_running(thread));
> 
> 		if (!thread_is_running(thread))
> 			break;
>@@ -932,7 +930,6 @@ static int ll_agl_thread(void *arg)
> static void ll_start_agl(struct dentry *parent, struct ll_statahead_info
>*sai)
> {
> 	struct ptlrpc_thread *thread = &sai->sai_agl_thread;
>-	struct l_wait_info    lwi    = { 0 };
> 	struct ll_inode_info  *plli;
> 	struct task_struct *task;
> 
>@@ -948,9 +945,8 @@ static void ll_start_agl(struct dentry *parent,
>struct ll_statahead_info *sai)
> 		return;
> 	}
> 
>-	l_wait_event(thread->t_ctl_waitq,
>-		     thread_is_running(thread) || thread_is_stopped(thread),
>-		     &lwi);
>+	wait_event(thread->t_ctl_waitq,
>+		   thread_is_running(thread) || thread_is_stopped(thread));
> }
> 
> /* statahead thread main function */
>@@ -968,7 +964,6 @@ static int ll_statahead_thread(void *arg)
> 	int		       first  = 0;
> 	int		       rc     = 0;
> 	struct md_op_data *op_data;
>-	struct l_wait_info	lwi    = { 0 };
> 
> 	sai = ll_sai_get(dir);
> 	sa_thread = &sai->sai_thread;
>@@ -1069,12 +1064,11 @@ static int ll_statahead_thread(void *arg)
> 
> 			/* wait for spare statahead window */
> 			do {
>-				l_wait_event(sa_thread->t_ctl_waitq,
>-					     !sa_sent_full(sai) ||
>-					     sa_has_callback(sai) ||
>-					     !list_empty(&sai->sai_agls) ||
>-					     !thread_is_running(sa_thread),
>-					     &lwi);
>+				wait_event(sa_thread->t_ctl_waitq,
>+					   !sa_sent_full(sai) ||
>+					   sa_has_callback(sai) ||
>+					   !list_empty(&sai->sai_agls) ||
>+					   !thread_is_running(sa_thread));
> 				sa_handle_callback(sai);
> 
> 				spin_lock(&lli->lli_agl_lock);
>@@ -1128,11 +1122,10 @@ static int ll_statahead_thread(void *arg)
> 	 * for file release to stop me.
> 	 */
> 	while (thread_is_running(sa_thread)) {
>-		l_wait_event(sa_thread->t_ctl_waitq,
>-			     sa_has_callback(sai) ||
>-			     !agl_list_empty(sai) ||
>-			     !thread_is_running(sa_thread),
>-			     &lwi);
>+		wait_event(sa_thread->t_ctl_waitq,
>+			   sa_has_callback(sai) ||
>+			   !agl_list_empty(sai) ||
>+			   !thread_is_running(sa_thread));
> 
> 		sa_handle_callback(sai);
> 	}
>@@ -1145,9 +1138,8 @@ static int ll_statahead_thread(void *arg)
> 
> 		CDEBUG(D_READA, "stop agl thread: sai %p pid %u\n",
> 		       sai, (unsigned int)agl_thread->t_pid);
>-		l_wait_event(agl_thread->t_ctl_waitq,
>-			     thread_is_stopped(agl_thread),
>-			     &lwi);
>+		wait_event(agl_thread->t_ctl_waitq,
>+			   thread_is_stopped(agl_thread));
> 	} else {
> 		/* Set agl_thread flags anyway. */
> 		thread_set_flags(agl_thread, SVC_STOPPED);
>@@ -1159,8 +1151,8 @@ static int ll_statahead_thread(void *arg)
> 	 */
> 	while (sai->sai_sent != sai->sai_replied) {
> 		/* in case we're not woken up, timeout wait */
>-		lwi = LWI_TIMEOUT(msecs_to_jiffies(MSEC_PER_SEC >> 3),
>-				  NULL, NULL);
>+		struct l_wait_info lwi = LWI_TIMEOUT(msecs_to_jiffies(MSEC_PER_SEC >>
>3),
>+						     NULL, NULL);
> 		l_wait_event(sa_thread->t_ctl_waitq,
> 			     sai->sai_sent == sai->sai_replied, &lwi);
> 	}
>@@ -1520,7 +1512,6 @@ static int start_statahead_thread(struct inode
>*dir, struct dentry *dentry)
> {
> 	struct ll_inode_info *lli = ll_i2info(dir);
> 	struct ll_statahead_info *sai = NULL;
>-	struct l_wait_info lwi = { 0 };
> 	struct ptlrpc_thread *thread;
> 	struct task_struct *task;
> 	struct dentry *parent = dentry->d_parent;
>@@ -1570,9 +1561,8 @@ static int start_statahead_thread(struct inode
>*dir, struct dentry *dentry)
> 		goto out;
> 	}
> 
>-	l_wait_event(thread->t_ctl_waitq,
>-		     thread_is_running(thread) || thread_is_stopped(thread),
>-		     &lwi);
>+	wait_event(thread->t_ctl_waitq,
>+		   thread_is_running(thread) || thread_is_stopped(thread));
> 	ll_sai_put(sai);
> 
> 	/*
>diff --git a/drivers/staging/lustre/lustre/lov/lov_object.c
>b/drivers/staging/lustre/lustre/lov/lov_object.c
>index 897cf2cd4a24..aa82f2ed40ae 100644
>--- a/drivers/staging/lustre/lustre/lov/lov_object.c
>+++ b/drivers/staging/lustre/lustre/lov/lov_object.c
>@@ -723,15 +723,13 @@ static void lov_conf_unlock(struct lov_object *lov)
> 
> static int lov_layout_wait(const struct lu_env *env, struct lov_object
>*lov)
> {
>-	struct l_wait_info lwi = { 0 };
>-
> 	while (atomic_read(&lov->lo_active_ios) > 0) {
> 		CDEBUG(D_INODE, "file:" DFID " wait for active IO, now: %d.\n",
> 		       PFID(lu_object_fid(lov2lu(lov))),
> 		       atomic_read(&lov->lo_active_ios));
> 
>-		l_wait_event(lov->lo_waitq,
>-			     atomic_read(&lov->lo_active_ios) == 0, &lwi);
>+		wait_event(lov->lo_waitq,
>+			   atomic_read(&lov->lo_active_ios) == 0);
> 	}
> 	return 0;
> }
>diff --git a/drivers/staging/lustre/lustre/mgc/mgc_request.c
>b/drivers/staging/lustre/lustre/mgc/mgc_request.c
>index 79ff85feab64..81b101941eec 100644
>--- a/drivers/staging/lustre/lustre/mgc/mgc_request.c
>+++ b/drivers/staging/lustre/lustre/mgc/mgc_request.c
>@@ -601,9 +601,7 @@ static int mgc_requeue_thread(void *data)
> 			config_log_put(cld_prev);
> 
> 		/* Wait a bit to see if anyone else needs a requeue */
>-		lwi = (struct l_wait_info) { 0 };
>-		l_wait_event(rq_waitq, rq_state & (RQ_NOW | RQ_STOP),
>-			     &lwi);
>+		wait_event(rq_waitq, rq_state & (RQ_NOW | RQ_STOP));
> 		spin_lock(&config_list_lock);
> 	}
> 
>diff --git a/drivers/staging/lustre/lustre/obdclass/cl_io.c
>b/drivers/staging/lustre/lustre/obdclass/cl_io.c
>index 6ec5218a18c1..a3fb2bbde70f 100644
>--- a/drivers/staging/lustre/lustre/obdclass/cl_io.c
>+++ b/drivers/staging/lustre/lustre/obdclass/cl_io.c
>@@ -1110,10 +1110,8 @@ int cl_sync_io_wait(const struct lu_env *env,
>struct cl_sync_io *anchor,
> 		CERROR("IO failed: %d, still wait for %d remaining entries\n",
> 		       rc, atomic_read(&anchor->csi_sync_nr));
> 
>-		lwi = (struct l_wait_info) { 0 };
>-		(void)l_wait_event(anchor->csi_waitq,
>-				   atomic_read(&anchor->csi_sync_nr) == 0,
>-				   &lwi);
>+		wait_event(anchor->csi_waitq,
>+			   atomic_read(&anchor->csi_sync_nr) == 0);
> 	} else {
> 		rc = anchor->csi_sync_rc;
> 	}
>diff --git a/drivers/staging/lustre/lustre/obdclass/genops.c
>b/drivers/staging/lustre/lustre/obdclass/genops.c
>index b1d6ba4a3190..78f0fa1dff45 100644
>--- a/drivers/staging/lustre/lustre/obdclass/genops.c
>+++ b/drivers/staging/lustre/lustre/obdclass/genops.c
>@@ -1237,12 +1237,10 @@ static int obd_zombie_is_idle(void)
>  */
> void obd_zombie_barrier(void)
> {
>-	struct l_wait_info lwi = { 0 };
>-
> 	if (obd_zombie_pid == current_pid())
> 		/* don't wait for myself */
> 		return;
>-	l_wait_event(obd_zombie_waitq, obd_zombie_is_idle(), &lwi);
>+	wait_event(obd_zombie_waitq, obd_zombie_is_idle());
> }
> EXPORT_SYMBOL(obd_zombie_barrier);
> 
>@@ -1257,10 +1255,8 @@ static int obd_zombie_impexp_thread(void *unused)
> 	obd_zombie_pid = current_pid();
> 
> 	while (!test_bit(OBD_ZOMBIE_STOP, &obd_zombie_flags)) {
>-		struct l_wait_info lwi = { 0 };
>-
>-		l_wait_event(obd_zombie_waitq,
>-			     !obd_zombie_impexp_check(NULL), &lwi);
>+		wait_event_noload(obd_zombie_waitq,
>+				  !obd_zombie_impexp_check(NULL));
> 		obd_zombie_impexp_cull();
> 
> 		/*
>@@ -1593,7 +1589,6 @@ static inline bool obd_mod_rpc_slot_avail(struct
>client_obd *cli,
> u16 obd_get_mod_rpc_slot(struct client_obd *cli, __u32 opc,
> 			 struct lookup_intent *it)
> {
>-	struct l_wait_info lwi = LWI_INTR(NULL, NULL);
> 	bool close_req = false;
> 	u16 i, max;
> 
>@@ -1631,8 +1626,8 @@ u16 obd_get_mod_rpc_slot(struct client_obd *cli,
>__u32 opc,
> 		CDEBUG(D_RPCTRACE, "%s: sleeping for a modify RPC slot opc %u, max
>%hu\n",
> 		       cli->cl_import->imp_obd->obd_name, opc, max);
> 
>-		l_wait_event(cli->cl_mod_rpcs_waitq,
>-			     obd_mod_rpc_slot_avail(cli, close_req), &lwi);
>+		wait_event(cli->cl_mod_rpcs_waitq,
>+			   obd_mod_rpc_slot_avail(cli, close_req));
> 	} while (true);
> }
> EXPORT_SYMBOL(obd_get_mod_rpc_slot);
>diff --git a/drivers/staging/lustre/lustre/osc/osc_cache.c
>b/drivers/staging/lustre/lustre/osc/osc_cache.c
>index 5767ac2a7d16..d58a25a2a5b4 100644
>--- a/drivers/staging/lustre/lustre/osc/osc_cache.c
>+++ b/drivers/staging/lustre/lustre/osc/osc_cache.c
>@@ -964,9 +964,8 @@ static int osc_extent_wait(const struct lu_env *env,
>struct osc_extent *ext,
> 				"%s: wait ext to %u timedout, recovery in progress?\n",
> 				cli_name(osc_cli(obj)), state);
> 
>-		lwi = LWI_INTR(NULL, NULL);
>-		rc = l_wait_event(ext->oe_waitq, extent_wait_cb(ext, state),
>-				  &lwi);
>+		wait_event(ext->oe_waitq, extent_wait_cb(ext, state));
>+		rc = 0;
> 	}
> 	if (rc == 0 && ext->oe_rc < 0)
> 		rc = ext->oe_rc;
>diff --git a/drivers/staging/lustre/lustre/osc/osc_object.c
>b/drivers/staging/lustre/lustre/osc/osc_object.c
>index f82c87a77550..1de25496a7d9 100644
>--- a/drivers/staging/lustre/lustre/osc/osc_object.c
>+++ b/drivers/staging/lustre/lustre/osc/osc_object.c
>@@ -454,12 +454,10 @@ struct lu_object *osc_object_alloc(const struct
>lu_env *env,
> 
> int osc_object_invalidate(const struct lu_env *env, struct osc_object
>*osc)
> {
>-	struct l_wait_info lwi = { 0 };
>-
> 	CDEBUG(D_INODE, "Invalidate osc object: %p, # of active IOs: %d\n",
> 	       osc, atomic_read(&osc->oo_nr_ios));
> 
>-	l_wait_event(osc->oo_io_waitq, !atomic_read(&osc->oo_nr_ios), &lwi);
>+	wait_event(osc->oo_io_waitq, !atomic_read(&osc->oo_nr_ios));
> 
> 	/* Discard all dirty pages of this object. */
> 	osc_cache_truncate_start(env, osc, 0, NULL);
>diff --git a/drivers/staging/lustre/lustre/ptlrpc/pinger.c
>b/drivers/staging/lustre/lustre/ptlrpc/pinger.c
>index fe6b47bfe8be..4148a6661dcf 100644
>--- a/drivers/staging/lustre/lustre/ptlrpc/pinger.c
>+++ b/drivers/staging/lustre/lustre/ptlrpc/pinger.c
>@@ -291,7 +291,6 @@ static struct ptlrpc_thread pinger_thread;
> 
> int ptlrpc_start_pinger(void)
> {
>-	struct l_wait_info lwi = { 0 };
> 	struct task_struct *task;
> 	int rc;
> 
>@@ -310,8 +309,8 @@ int ptlrpc_start_pinger(void)
> 		CERROR("cannot start pinger thread: rc = %d\n", rc);
> 		return rc;
> 	}
>-	l_wait_event(pinger_thread.t_ctl_waitq,
>-		     thread_is_running(&pinger_thread), &lwi);
>+	wait_event(pinger_thread.t_ctl_waitq,
>+		   thread_is_running(&pinger_thread));
> 
> 	return 0;
> }
>@@ -320,7 +319,6 @@ static int ptlrpc_pinger_remove_timeouts(void);
> 
> int ptlrpc_stop_pinger(void)
> {
>-	struct l_wait_info lwi = { 0 };
> 	int rc = 0;
> 
> 	if (thread_is_init(&pinger_thread) ||
>@@ -331,8 +329,8 @@ int ptlrpc_stop_pinger(void)
> 	thread_set_flags(&pinger_thread, SVC_STOPPING);
> 	wake_up(&pinger_thread.t_ctl_waitq);
> 
>-	l_wait_event(pinger_thread.t_ctl_waitq,
>-		     thread_is_stopped(&pinger_thread), &lwi);
>+	wait_event(pinger_thread.t_ctl_waitq,
>+		   thread_is_stopped(&pinger_thread));
> 
> 	return rc;
> }
>diff --git a/drivers/staging/lustre/lustre/ptlrpc/sec_gc.c
>b/drivers/staging/lustre/lustre/ptlrpc/sec_gc.c
>index d85c8638c009..e4197a60d1e2 100644
>--- a/drivers/staging/lustre/lustre/ptlrpc/sec_gc.c
>+++ b/drivers/staging/lustre/lustre/ptlrpc/sec_gc.c
>@@ -197,7 +197,6 @@ static int sec_gc_main(void *arg)
> 
> int sptlrpc_gc_init(void)
> {
>-	struct l_wait_info lwi = { 0 };
> 	struct task_struct *task;
> 
> 	mutex_init(&sec_gc_mutex);
>@@ -214,18 +213,16 @@ int sptlrpc_gc_init(void)
> 		return PTR_ERR(task);
> 	}
> 
>-	l_wait_event(sec_gc_thread.t_ctl_waitq,
>-		     thread_is_running(&sec_gc_thread), &lwi);
>+	wait_event(sec_gc_thread.t_ctl_waitq,
>+		   thread_is_running(&sec_gc_thread));
> 	return 0;
> }
> 
> void sptlrpc_gc_fini(void)
> {
>-	struct l_wait_info lwi = { 0 };
>-
> 	thread_set_flags(&sec_gc_thread, SVC_STOPPING);
> 	wake_up(&sec_gc_thread.t_ctl_waitq);
> 
>-	l_wait_event(sec_gc_thread.t_ctl_waitq,
>-		     thread_is_stopped(&sec_gc_thread), &lwi);
>+	wait_event(sec_gc_thread.t_ctl_waitq,
>+		   thread_is_stopped(&sec_gc_thread));
> }
>diff --git a/drivers/staging/lustre/lustre/ptlrpc/service.c
>b/drivers/staging/lustre/lustre/ptlrpc/service.c
>index 63be6e7273f3..d688cb3ff157 100644
>--- a/drivers/staging/lustre/lustre/ptlrpc/service.c
>+++ b/drivers/staging/lustre/lustre/ptlrpc/service.c
>@@ -2233,7 +2233,7 @@ static int ptlrpc_hr_main(void *arg)
> 	wake_up(&ptlrpc_hr.hr_waitq);
> 
> 	while (!ptlrpc_hr.hr_stopping) {
>-		l_wait_condition(hrt->hrt_waitq, hrt_dont_sleep(hrt, &replies));
>+		wait_event_noload(hrt->hrt_waitq, hrt_dont_sleep(hrt, &replies));
> 
> 		while (!list_empty(&replies)) {
> 			struct ptlrpc_reply_state *rs;
>@@ -2312,7 +2312,6 @@ static int ptlrpc_start_hr_threads(void)
> 
> static void ptlrpc_svcpt_stop_threads(struct ptlrpc_service_part *svcpt)
> {
>-	struct l_wait_info lwi = { 0 };
> 	struct ptlrpc_thread *thread;
> 	LIST_HEAD(zombie);
> 
>@@ -2341,8 +2340,8 @@ static void ptlrpc_svcpt_stop_threads(struct
>ptlrpc_service_part *svcpt)
> 
> 		CDEBUG(D_INFO, "waiting for stopping-thread %s #%u\n",
> 		       svcpt->scp_service->srv_thread_name, thread->t_id);
>-		l_wait_event(thread->t_ctl_waitq,
>-			     thread_is_stopped(thread), &lwi);
>+		wait_event(thread->t_ctl_waitq,
>+			   thread_is_stopped(thread));
> 
> 		spin_lock(&svcpt->scp_lock);
> 	}
>@@ -2403,7 +2402,6 @@ int ptlrpc_start_threads(struct ptlrpc_service *svc)
> 
> int ptlrpc_start_thread(struct ptlrpc_service_part *svcpt, int wait)
> {
>-	struct l_wait_info lwi = { 0 };
> 	struct ptlrpc_thread *thread;
> 	struct ptlrpc_service *svc;
> 	struct task_struct *task;
>@@ -2499,9 +2497,8 @@ int ptlrpc_start_thread(struct ptlrpc_service_part
>*svcpt, int wait)
> 	if (!wait)
> 		return 0;
> 
>-	l_wait_event(thread->t_ctl_waitq,
>-		     thread_is_running(thread) || thread_is_stopped(thread),
>-		     &lwi);
>+	wait_event(thread->t_ctl_waitq,
>+		   thread_is_running(thread) || thread_is_stopped(thread));
> 
> 	rc = thread_is_stopped(thread) ? thread->t_id : 0;
> 	return rc;
>
>
>_______________________________________________
>lustre-devel mailing list
>lustre-devel@lists.lustre.org
>http://lists.lustre.org/listinfo.cgi/lustre-devel-lustre.org

  reply	other threads:[~2017-12-18 17:48 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-18  7:17 [lustre-devel] [PATCH SERIES 5: 00/16] staging: lustre: use standard wait_event macros NeilBrown
2017-12-18  7:17 ` NeilBrown
2017-12-18  7:17 ` [lustre-devel] [PATCH 04/16] staging: lustre: use wait_event_timeout() where appropriate NeilBrown
2017-12-18  7:17   ` NeilBrown
2017-12-18 20:23   ` [lustre-devel] " Patrick Farrell
2017-12-18 20:23     ` Patrick Farrell
2017-12-18  7:17 ` [lustre-devel] [PATCH 01/16] staging: lustre: discard SVC_SIGNAL and related functions NeilBrown
2017-12-18  7:17   ` NeilBrown
2017-12-18  7:17 ` [lustre-devel] [PATCH 03/16] staging: lustre: discard cfs_time_seconds() NeilBrown
2017-12-18  7:17   ` NeilBrown
2017-12-18  7:17 ` [lustre-devel] [PATCH 02/16] staging: lustre: replace simple cases of l_wait_event() with wait_event() NeilBrown
2017-12-18  7:17   ` NeilBrown
2017-12-18 17:48   ` Patrick Farrell [this message]
2017-12-18 17:48     ` [lustre-devel] " Patrick Farrell
2017-12-18 21:37     ` NeilBrown
2017-12-18 21:37       ` NeilBrown
2017-12-18 18:03   ` Patrick Farrell
2017-12-18 18:03     ` Patrick Farrell
2017-12-19 10:37     ` Dilger, Andreas
2017-12-19 10:37       ` Dilger, Andreas
2017-12-19 20:49       ` NeilBrown
2017-12-19 20:49         ` NeilBrown
2017-12-18  7:18 ` [lustre-devel] [PATCH 06/16] staging: lustre: simplify l_wait_event when intr handler but no timeout NeilBrown
2017-12-18  7:18   ` NeilBrown
2017-12-18  7:18 ` [lustre-devel] [PATCH 13/16] staging: lustre: improve waiting in sptlrpc_req_refresh_ctx NeilBrown
2017-12-18  7:18   ` NeilBrown
2017-12-18  7:18 ` [lustre-devel] [PATCH 09/16] staging: lustre: simplify waiting in ptlrpc_invalidate_import() NeilBrown
2017-12-18  7:18   ` NeilBrown
2017-12-18  7:18 ` [lustre-devel] [PATCH 15/16] staging: lustre: use explicit poll loop in ptlrpc_unregister_reply NeilBrown
2017-12-18  7:18   ` NeilBrown
2017-12-18 21:09   ` [lustre-devel] " Patrick Farrell
2017-12-18 21:09     ` Patrick Farrell
2017-12-18  7:18 ` [lustre-devel] [PATCH 14/16] staging: lustre: use explicit poll loop in ptlrpc_service_unlink_rqbd NeilBrown
2017-12-18  7:18   ` NeilBrown
2017-12-18  7:18 ` [lustre-devel] [PATCH 08/16] staging: lustre: open code polling loop instead of using l_wait_event() NeilBrown
2017-12-18  7:18   ` NeilBrown
2017-12-18 20:55   ` [lustre-devel] " Patrick Farrell
2017-12-18 20:55     ` Patrick Farrell
2017-12-18  7:18 ` [lustre-devel] [PATCH 05/16] staging: lustre: introduce and use l_wait_event_abortable() NeilBrown
2017-12-18  7:18   ` NeilBrown
2017-12-18  7:18 ` [lustre-devel] [PATCH 11/16] staging: lustre: make polling loop in ptlrpc_unregister_bulk more obvious NeilBrown
2017-12-18  7:18   ` NeilBrown
2017-12-18 21:03   ` [lustre-devel] " Patrick Farrell
2017-12-18 21:03     ` Patrick Farrell
2017-12-18  7:18 ` [lustre-devel] [PATCH 12/16] staging: lustre: use wait_event_timeout in ptlrpcd() NeilBrown
2017-12-18  7:18   ` NeilBrown
2017-12-18  7:18 ` [lustre-devel] [PATCH 07/16] staging: lustre: simplify waiting in ldlm_completion_ast() NeilBrown
2017-12-18  7:18   ` NeilBrown
2017-12-18  7:18 ` [lustre-devel] [PATCH 16/16] staging: lustre: remove l_wait_event from ptlrpc_set_wait NeilBrown
2017-12-18  7:18   ` NeilBrown
2017-12-18  7:18 ` [lustre-devel] [PATCH 10/16] staging: lustre: remove back_to_sleep() and use loops NeilBrown
2017-12-18  7:18   ` NeilBrown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=D65D57DF.C5BA7%paf@cray.com \
    --to=paf@cray.com \
    --cc=andreas.dilger@intel.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jsimmons@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lustre-devel@lists.lustre.org \
    --cc=neilb@suse.com \
    --cc=oleg.drokin@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.