All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Paul E. McKenney" <paulmck@linux.vnet.ibm.com>
To: Tejun Heo <tj@kernel.org>
Cc: Prateek Sood <prsood@codeaurora.org>,
	Peter Zijlstra <peterz@infradead.org>,
	avagin@gmail.com, mingo@kernel.org, linux-kernel@vger.kernel.org,
	cgroups@vger.kernel.org, sramana@codeaurora.org
Subject: Re: [PATCH] cgroup/cpuset: fix circular locking dependency
Date: Mon, 8 Jan 2018 20:20:16 -0800	[thread overview]
Message-ID: <20180109042016.GR9671@linux.vnet.ibm.com> (raw)
In-Reply-To: <20180109034211.GC3668920@devbig577.frc2.facebook.com>

On Mon, Jan 08, 2018 at 07:42:11PM -0800, Tejun Heo wrote:
> Hello, Paul.
> 
> On Mon, Jan 08, 2018 at 04:31:27PM -0800, Paul E. McKenney wrote:
> > +static int __init rcu_init_wq_rescuer(void)
> > +{
> > +	WARN_ON(init_rescuer(rcu_gp_workqueue));
> > +	return 0;
> > +}
> > +core_initcall(rcu_init_wq_rescuer);
> 
> So, what I don't get is why RCU needs to call this explicitly.
> core_initcall() is after workqueue_init() anyway.  Why am I missing?

Me being stupid, I guess.

OK, so I can put WQ_MEM_RECLAIM on the early boot creation of RCU's
workqueue_struct as shown below, right?

							Thanx, Paul

------------------------------------------------------------------------

commit 9884a945a65837cda6de2ff621d47c59a6ca3e28
Author: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Date:   Mon Jan 8 14:35:52 2018 -0800

    rcu: Create RCU-specific workqueues with rescuers
    
    RCU's expedited grace periods can participate in out-of-memory deadlocks
    due to all available system_wq kthreads being blocked and there not being
    memory available to create more.  This commit prevents such deadlocks
    by allocating an RCU-specific workqueue_struct at early boot time, and
    providing it with a rescuer to ensure forward progress.  This uses the
    shiny new init_rescuer() function provided by Tejun (but indirectly).
    
    This commit also causes SRCU to use this new RCU-specific
    workqueue_struct.  Note that SRCU's use of workqueues never blocks them
    waiting for readers, so this should be safe from a forward-progress
    viewpoint.
    
    Reported-by: Prateek Sood <prsood@codeaurora.org>
    Reported-by: Tejun Heo <tj@kernel.org>
    Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>

diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h
index 59c471de342a..acabc4781b08 100644
--- a/kernel/rcu/rcu.h
+++ b/kernel/rcu/rcu.h
@@ -493,6 +493,7 @@ void show_rcu_gp_kthreads(void);
 void rcu_force_quiescent_state(void);
 void rcu_bh_force_quiescent_state(void);
 void rcu_sched_force_quiescent_state(void);
+extern struct workqueue_struct *rcu_gp_workqueue;
 #endif /* #else #ifdef CONFIG_TINY_RCU */
 
 #ifdef CONFIG_RCU_NOCB_CPU
diff --git a/kernel/rcu/srcutree.c b/kernel/rcu/srcutree.c
index 6d5880089ff6..89f0f6b3ce9a 100644
--- a/kernel/rcu/srcutree.c
+++ b/kernel/rcu/srcutree.c
@@ -465,7 +465,7 @@ static bool srcu_queue_delayed_work_on(int cpu, struct workqueue_struct *wq,
  */
 static void srcu_schedule_cbs_sdp(struct srcu_data *sdp, unsigned long delay)
 {
-	srcu_queue_delayed_work_on(sdp->cpu, system_power_efficient_wq,
+	srcu_queue_delayed_work_on(sdp->cpu, rcu_gp_workqueue,
 				   &sdp->work, delay);
 }
 
@@ -664,7 +664,7 @@ static void srcu_funnel_gp_start(struct srcu_struct *sp, struct srcu_data *sdp,
 	    rcu_seq_state(sp->srcu_gp_seq) == SRCU_STATE_IDLE) {
 		WARN_ON_ONCE(ULONG_CMP_GE(sp->srcu_gp_seq, sp->srcu_gp_seq_needed));
 		srcu_gp_start(sp);
-		queue_delayed_work(system_power_efficient_wq, &sp->work,
+		queue_delayed_work(rcu_gp_workqueue, &sp->work,
 				   srcu_get_delay(sp));
 	}
 	raw_spin_unlock_irqrestore_rcu_node(sp, flags);
@@ -1198,7 +1198,7 @@ static void srcu_reschedule(struct srcu_struct *sp, unsigned long delay)
 	raw_spin_unlock_irq_rcu_node(sp);
 
 	if (pushgp)
-		queue_delayed_work(system_power_efficient_wq, &sp->work, delay);
+		queue_delayed_work(rcu_gp_workqueue, &sp->work, delay);
 }
 
 /*
diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
index f9c0ca2ccf0c..d658538e6f7d 100644
--- a/kernel/rcu/tree.c
+++ b/kernel/rcu/tree.c
@@ -4272,6 +4272,8 @@ static void __init rcu_dump_rcu_node_tree(struct rcu_state *rsp)
 	pr_cont("\n");
 }
 
+struct workqueue_struct *rcu_gp_workqueue;
+
 void __init rcu_init(void)
 {
 	int cpu;
@@ -4298,6 +4300,10 @@ void __init rcu_init(void)
 		rcu_cpu_starting(cpu);
 		rcutree_online_cpu(cpu);
 	}
+
+	/* Create workqueue for expedited GPs and for Tree SRCU. */
+	rcu_gp_workqueue = alloc_workqueue("rcu_gp", WQ_MEM_RECLAIM, 0);
+	WARN_ON(!rcu_gp_workqueue);
 }
 
 #include "tree_exp.h"
diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h
index 46d61b597731..3ba3ef4d4796 100644
--- a/kernel/rcu/tree_exp.h
+++ b/kernel/rcu/tree_exp.h
@@ -606,7 +606,7 @@ static void _synchronize_rcu_expedited(struct rcu_state *rsp,
 		rew.rew_rsp = rsp;
 		rew.rew_s = s;
 		INIT_WORK_ONSTACK(&rew.rew_work, wait_rcu_exp_gp);
-		schedule_work(&rew.rew_work);
+		queue_work(rcu_gp_workqueue, &rew.rew_work);
 	}
 
 	/* Wait for expedited grace period to complete. */

  reply	other threads:[~2018-01-09  4:19 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-11-28  1:22 cgroup/for-next: WARNING: possible circular locking dependency detected in cpuset_write_resmask Andrei Vagin
2017-11-28 11:35 ` [PATCH] cgroup/cpuset: fix circular locking dependency Prateek Sood
2017-12-04  5:14   ` Prateek Sood
2017-12-04  5:14     ` Prateek Sood
2017-12-04 20:22     ` Tejun Heo
2017-12-04 20:22       ` Tejun Heo
2017-12-04 22:58       ` Tejun Heo
2017-12-04 23:01         ` Peter Zijlstra
2017-12-04 23:01           ` Peter Zijlstra
2017-12-08  9:40           ` Prateek Sood
2017-12-08 11:45             ` Prateek Sood
2017-12-08 11:45               ` Prateek Sood
2017-12-11 15:32               ` Tejun Heo
2017-12-11 15:32                 ` Tejun Heo
2017-12-13 14:28                 ` Prateek Sood
2017-12-13 15:40                   ` Tejun Heo
2017-12-15  8:54                     ` Prateek Sood
2017-12-15  8:54                       ` Prateek Sood
2017-12-15 13:22                       ` Tejun Heo
2017-12-15 19:06                         ` Prateek Sood
2017-12-19  7:26                           ` [PATCH] cgroup: Fix deadlock in cpu hotplug path Prateek Sood
2017-12-19  7:26                             ` Prateek Sood
2017-12-19 13:39                             ` Tejun Heo
2017-12-11 15:20           ` [PATCH] cgroup/cpuset: fix circular locking dependency Tejun Heo
2017-12-11 15:20             ` Tejun Heo
2017-12-13  7:50             ` Prateek Sood
2017-12-13  7:50               ` Prateek Sood
2017-12-13 16:06               ` Tejun Heo
2017-12-15 19:04                 ` Prateek Sood
2017-12-15 19:04                   ` Prateek Sood
2017-12-28 20:37                 ` Prateek Sood
2017-12-28 20:37                   ` Prateek Sood
2018-01-02 16:16                   ` Tejun Heo
2018-01-02 17:44                     ` Paul E. McKenney
2018-01-02 17:44                       ` Paul E. McKenney
2018-01-02 18:01                       ` Paul E. McKenney
2018-01-08 12:28                         ` Tejun Heo
2018-01-08 12:28                           ` Tejun Heo
2018-01-08 13:47                           ` [PATCH wq/for-4.16 1/2] workqueue: separate out init_rescuer() Tejun Heo
2018-01-08 13:47                             ` Tejun Heo
2018-01-08 13:47                             ` [PATCH wq/for-4.16 2/2] workqueue: allow WQ_MEM_RECLAIM on early init workqueues Tejun Heo
2018-01-08 13:47                               ` Tejun Heo
2018-01-08 22:52                           ` [PATCH] cgroup/cpuset: fix circular locking dependency Paul E. McKenney
2018-01-08 22:52                             ` Paul E. McKenney
2018-01-09  0:31                             ` Paul E. McKenney
2018-01-09  3:42                               ` Tejun Heo
2018-01-09  3:42                                 ` Tejun Heo
2018-01-09  4:20                                 ` Paul E. McKenney [this message]
2018-01-09 13:44                                   ` Tejun Heo
2018-01-09 15:21                                     ` Paul E. McKenney
2018-01-09 15:21                                       ` Paul E. McKenney
2018-01-09 15:37                                       ` Tejun Heo
2018-01-09 16:00                                         ` Paul E. McKenney
2018-01-09 16:00                                           ` Paul E. McKenney
2018-01-10 20:08                                           ` Paul E. McKenney
2018-01-10 21:41                                             ` Tejun Heo
2018-01-10 21:41                                               ` Tejun Heo
2018-01-10 22:10                                               ` Paul E. McKenney
2018-01-10 22:10                                                 ` Paul E. McKenney
2018-01-15 12:02                     ` Prateek Sood
2018-01-15 12:02                       ` Prateek Sood
2018-01-16 16:27                       ` Tejun Heo

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=20180109042016.GR9671@linux.vnet.ibm.com \
    --to=paulmck@linux.vnet.ibm.com \
    --cc=avagin@gmail.com \
    --cc=cgroups@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=prsood@codeaurora.org \
    --cc=sramana@codeaurora.org \
    --cc=tj@kernel.org \
    /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.