[tip/core/rcu,05/14] rcu: Distinguish "rcuo" kthreads by RCU flavor

Message ID 1357408144-15830-5-git-send-email-paulmck@linux.vnet.ibm.com
State New
Headers show

Commit Message

Paul E. McKenney Jan. 5, 2013, 5:48 p.m.
From: "Paul E. McKenney" <paul.mckenney@linaro.org>

Currently, the per-no-CBs-CPU kthreads are named "rcuo" followed by
the CPU number, for example, "rcuo".  This is problematic given that
there are either two or three RCU flavors, each of which gets a per-CPU
kthread with exactly the same name.  This commit therefore introduces
a one-letter abbreviation for each RCU flavor, namely 'b' for RCU-bh,
'p' for RCU-preempt, and 's' for RCU-sched.  This abbreviation use used
to distinguish the "rcuo" kthreads, for example, for CPU 0 we would have
"rcuo0b", "rcuo0p", and "rcuo0s".

Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Tested-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
---
 kernel/rcutree.c        |    7 ++++---
 kernel/rcutree.h        |    1 +
 kernel/rcutree_plugin.h |    5 +++--
 3 files changed, 8 insertions(+), 5 deletions(-)

Comments

Paul Gortmaker Jan. 6, 2013, 11:34 p.m. | #1
On Sat, Jan 5, 2013 at 12:48 PM, Paul E. McKenney
<paulmck@linux.vnet.ibm.com> wrote:
> From: "Paul E. McKenney" <paul.mckenney@linaro.org>
>
> Currently, the per-no-CBs-CPU kthreads are named "rcuo" followed by
> the CPU number, for example, "rcuo".  This is problematic given that
> there are either two or three RCU flavors, each of which gets a per-CPU
> kthread with exactly the same name.  This commit therefore introduces
> a one-letter abbreviation for each RCU flavor, namely 'b' for RCU-bh,
> 'p' for RCU-preempt, and 's' for RCU-sched.  This abbreviation use used
> to distinguish the "rcuo" kthreads, for example, for CPU 0 we would have
> "rcuo0b", "rcuo0p", and "rcuo0s".

Since these names are exposed to Joe Average when he runs ps/top
etc. -- I am inclined to favour the more full names as implemented
in this older patch:

http://goo.gl/H1Aj8

...since "rcuo0p" isn't apt to mean anything to people outside
of the to/cc list of this mail. (Catch me off guard, and I probably
might fail to be able to name the three flavours myself...)

But then again it is just a personal preference.  In any case, if we stick
with the short names in your patch,  we probably still should make the
similar two documentation type chunks from my patch in yours.

Paul.
--

>
> Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
> Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> Tested-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
> ---
>  kernel/rcutree.c        |    7 ++++---
>  kernel/rcutree.h        |    1 +
>  kernel/rcutree_plugin.h |    5 +++--
>  3 files changed, 8 insertions(+), 5 deletions(-)
>
> diff --git a/kernel/rcutree.c b/kernel/rcutree.c
> index 8b110fa..4ec797e 100644
> --- a/kernel/rcutree.c
> +++ b/kernel/rcutree.c
> @@ -64,7 +64,7 @@
>  static struct lock_class_key rcu_node_class[RCU_NUM_LVLS];
>  static struct lock_class_key rcu_fqs_class[RCU_NUM_LVLS];
>
> -#define RCU_STATE_INITIALIZER(sname, cr) { \
> +#define RCU_STATE_INITIALIZER(sname, sabbr, cr) { \
>         .level = { &sname##_state.node[0] }, \
>         .call = cr, \
>         .fqs_state = RCU_GP_IDLE, \
> @@ -76,13 +76,14 @@ static struct lock_class_key rcu_fqs_class[RCU_NUM_LVLS];
>         .barrier_mutex = __MUTEX_INITIALIZER(sname##_state.barrier_mutex), \
>         .onoff_mutex = __MUTEX_INITIALIZER(sname##_state.onoff_mutex), \
>         .name = #sname, \
> +       .abbr = sabbr, \
>  }
>
>  struct rcu_state rcu_sched_state =
> -       RCU_STATE_INITIALIZER(rcu_sched, call_rcu_sched);
> +       RCU_STATE_INITIALIZER(rcu_sched, 's', call_rcu_sched);
>  DEFINE_PER_CPU(struct rcu_data, rcu_sched_data);
>
> -struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh, call_rcu_bh);
> +struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh, 'b', call_rcu_bh);
>  DEFINE_PER_CPU(struct rcu_data, rcu_bh_data);
>
>  static struct rcu_state *rcu_state;
> diff --git a/kernel/rcutree.h b/kernel/rcutree.h
> index ef26eab..c865117 100644
> --- a/kernel/rcutree.h
> +++ b/kernel/rcutree.h
> @@ -452,6 +452,7 @@ struct rcu_state {
>         unsigned long gp_max;                   /* Maximum GP duration in */
>                                                 /*  jiffies. */
>         char *name;                             /* Name of structure. */
> +       char abbr;                              /* Abbreviated name. */
>         struct list_head flavors;               /* List of RCU flavors. */
>  };
>
> diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h
> index eb9b473..ab1bdde 100644
> --- a/kernel/rcutree_plugin.h
> +++ b/kernel/rcutree_plugin.h
> @@ -111,7 +111,7 @@ static void __init rcu_bootup_announce_oddness(void)
>  #ifdef CONFIG_TREE_PREEMPT_RCU
>
>  struct rcu_state rcu_preempt_state =
> -       RCU_STATE_INITIALIZER(rcu_preempt, call_rcu);
> +       RCU_STATE_INITIALIZER(rcu_preempt, 'p', call_rcu);
>  DEFINE_PER_CPU(struct rcu_data, rcu_preempt_data);
>  static struct rcu_state *rcu_state = &rcu_preempt_state;
>
> @@ -2510,7 +2510,8 @@ static void __init rcu_spawn_nocb_kthreads(struct rcu_state *rsp)
>                 return;
>         for_each_cpu(cpu, rcu_nocb_mask) {
>                 rdp = per_cpu_ptr(rsp->rda, cpu);
> -               t = kthread_run(rcu_nocb_kthread, rdp, "rcuo%d", cpu);
> +               t = kthread_run(rcu_nocb_kthread, rdp,
> +                               "rcuo%d%c", cpu, rsp->abbr);
>                 BUG_ON(IS_ERR(t));
>                 ACCESS_ONCE(rdp->nocb_kthread) = t;
>         }
> --
> 1.7.8
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at  http://www.tux.org/lkml/
Josh Triplett Jan. 7, 2013, 4:54 p.m. | #2
On Sat, Jan 05, 2013 at 09:48:55AM -0800, Paul E. McKenney wrote:
> From: "Paul E. McKenney" <paul.mckenney@linaro.org>
> 
> Currently, the per-no-CBs-CPU kthreads are named "rcuo" followed by
> the CPU number, for example, "rcuo".  This is problematic given that

I think the quoted string on this second line wanted to have a CPU
number in it.

> there are either two or three RCU flavors, each of which gets a per-CPU
> kthread with exactly the same name.  This commit therefore introduces
> a one-letter abbreviation for each RCU flavor, namely 'b' for RCU-bh,
> 'p' for RCU-preempt, and 's' for RCU-sched.  This abbreviation use used
> to distinguish the "rcuo" kthreads, for example, for CPU 0 we would have
> "rcuo0b", "rcuo0p", and "rcuo0s".

Don't per-CPU kthreads normally have a name ending in /$cpunum ?, rather
than just $cpunum?  For instance, kworker/0, kworker/1, and so on?
Seems like these threads should follow that convention.

- Josh Triplett
Paul E. McKenney Jan. 7, 2013, 8:53 p.m. | #3
On Sun, Jan 06, 2013 at 06:34:17PM -0500, Paul Gortmaker wrote:
> On Sat, Jan 5, 2013 at 12:48 PM, Paul E. McKenney
> <paulmck@linux.vnet.ibm.com> wrote:
> > From: "Paul E. McKenney" <paul.mckenney@linaro.org>
> >
> > Currently, the per-no-CBs-CPU kthreads are named "rcuo" followed by
> > the CPU number, for example, "rcuo".  This is problematic given that
> > there are either two or three RCU flavors, each of which gets a per-CPU
> > kthread with exactly the same name.  This commit therefore introduces
> > a one-letter abbreviation for each RCU flavor, namely 'b' for RCU-bh,
> > 'p' for RCU-preempt, and 's' for RCU-sched.  This abbreviation use used
> > to distinguish the "rcuo" kthreads, for example, for CPU 0 we would have
> > "rcuo0b", "rcuo0p", and "rcuo0s".
> 
> Since these names are exposed to Joe Average when he runs ps/top
> etc. -- I am inclined to favour the more full names as implemented
> in this older patch:
> 
> http://goo.gl/H1Aj8
> 
> ...since "rcuo0p" isn't apt to mean anything to people outside
> of the to/cc list of this mail. (Catch me off guard, and I probably
> might fail to be able to name the three flavours myself...)
> 
> But then again it is just a personal preference.  In any case, if we stick
> with the short names in your patch,  we probably still should make the
> similar two documentation type chunks from my patch in yours.

I took yours and Josh's advice here, so the names are now rcuoX/N,
with the definitions of X and N in both the Kconfig entry and in
Documentation/kernel-parameters.txt.

							Thanx, Paul

> Paul.
> --
> 
> >
> > Signed-off-by: Paul E. McKenney <paul.mckenney@linaro.org>
> > Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
> > Tested-by: Dietmar Eggemann <dietmar.eggemann@arm.com>
> > ---
> >  kernel/rcutree.c        |    7 ++++---
> >  kernel/rcutree.h        |    1 +
> >  kernel/rcutree_plugin.h |    5 +++--
> >  3 files changed, 8 insertions(+), 5 deletions(-)
> >
> > diff --git a/kernel/rcutree.c b/kernel/rcutree.c
> > index 8b110fa..4ec797e 100644
> > --- a/kernel/rcutree.c
> > +++ b/kernel/rcutree.c
> > @@ -64,7 +64,7 @@
> >  static struct lock_class_key rcu_node_class[RCU_NUM_LVLS];
> >  static struct lock_class_key rcu_fqs_class[RCU_NUM_LVLS];
> >
> > -#define RCU_STATE_INITIALIZER(sname, cr) { \
> > +#define RCU_STATE_INITIALIZER(sname, sabbr, cr) { \
> >         .level = { &sname##_state.node[0] }, \
> >         .call = cr, \
> >         .fqs_state = RCU_GP_IDLE, \
> > @@ -76,13 +76,14 @@ static struct lock_class_key rcu_fqs_class[RCU_NUM_LVLS];
> >         .barrier_mutex = __MUTEX_INITIALIZER(sname##_state.barrier_mutex), \
> >         .onoff_mutex = __MUTEX_INITIALIZER(sname##_state.onoff_mutex), \
> >         .name = #sname, \
> > +       .abbr = sabbr, \
> >  }
> >
> >  struct rcu_state rcu_sched_state =
> > -       RCU_STATE_INITIALIZER(rcu_sched, call_rcu_sched);
> > +       RCU_STATE_INITIALIZER(rcu_sched, 's', call_rcu_sched);
> >  DEFINE_PER_CPU(struct rcu_data, rcu_sched_data);
> >
> > -struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh, call_rcu_bh);
> > +struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh, 'b', call_rcu_bh);
> >  DEFINE_PER_CPU(struct rcu_data, rcu_bh_data);
> >
> >  static struct rcu_state *rcu_state;
> > diff --git a/kernel/rcutree.h b/kernel/rcutree.h
> > index ef26eab..c865117 100644
> > --- a/kernel/rcutree.h
> > +++ b/kernel/rcutree.h
> > @@ -452,6 +452,7 @@ struct rcu_state {
> >         unsigned long gp_max;                   /* Maximum GP duration in */
> >                                                 /*  jiffies. */
> >         char *name;                             /* Name of structure. */
> > +       char abbr;                              /* Abbreviated name. */
> >         struct list_head flavors;               /* List of RCU flavors. */
> >  };
> >
> > diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h
> > index eb9b473..ab1bdde 100644
> > --- a/kernel/rcutree_plugin.h
> > +++ b/kernel/rcutree_plugin.h
> > @@ -111,7 +111,7 @@ static void __init rcu_bootup_announce_oddness(void)
> >  #ifdef CONFIG_TREE_PREEMPT_RCU
> >
> >  struct rcu_state rcu_preempt_state =
> > -       RCU_STATE_INITIALIZER(rcu_preempt, call_rcu);
> > +       RCU_STATE_INITIALIZER(rcu_preempt, 'p', call_rcu);
> >  DEFINE_PER_CPU(struct rcu_data, rcu_preempt_data);
> >  static struct rcu_state *rcu_state = &rcu_preempt_state;
> >
> > @@ -2510,7 +2510,8 @@ static void __init rcu_spawn_nocb_kthreads(struct rcu_state *rsp)
> >                 return;
> >         for_each_cpu(cpu, rcu_nocb_mask) {
> >                 rdp = per_cpu_ptr(rsp->rda, cpu);
> > -               t = kthread_run(rcu_nocb_kthread, rdp, "rcuo%d", cpu);
> > +               t = kthread_run(rcu_nocb_kthread, rdp,
> > +                               "rcuo%d%c", cpu, rsp->abbr);
> >                 BUG_ON(IS_ERR(t));
> >                 ACCESS_ONCE(rdp->nocb_kthread) = t;
> >         }
> > --
> > 1.7.8
> >
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> > the body of a message to majordomo@vger.kernel.org
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
> > Please read the FAQ at  http://www.tux.org/lkml/
>

Patch

diff --git a/kernel/rcutree.c b/kernel/rcutree.c
index 8b110fa..4ec797e 100644
--- a/kernel/rcutree.c
+++ b/kernel/rcutree.c
@@ -64,7 +64,7 @@ 
 static struct lock_class_key rcu_node_class[RCU_NUM_LVLS];
 static struct lock_class_key rcu_fqs_class[RCU_NUM_LVLS];
 
-#define RCU_STATE_INITIALIZER(sname, cr) { \
+#define RCU_STATE_INITIALIZER(sname, sabbr, cr) { \
 	.level = { &sname##_state.node[0] }, \
 	.call = cr, \
 	.fqs_state = RCU_GP_IDLE, \
@@ -76,13 +76,14 @@  static struct lock_class_key rcu_fqs_class[RCU_NUM_LVLS];
 	.barrier_mutex = __MUTEX_INITIALIZER(sname##_state.barrier_mutex), \
 	.onoff_mutex = __MUTEX_INITIALIZER(sname##_state.onoff_mutex), \
 	.name = #sname, \
+	.abbr = sabbr, \
 }
 
 struct rcu_state rcu_sched_state =
-	RCU_STATE_INITIALIZER(rcu_sched, call_rcu_sched);
+	RCU_STATE_INITIALIZER(rcu_sched, 's', call_rcu_sched);
 DEFINE_PER_CPU(struct rcu_data, rcu_sched_data);
 
-struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh, call_rcu_bh);
+struct rcu_state rcu_bh_state = RCU_STATE_INITIALIZER(rcu_bh, 'b', call_rcu_bh);
 DEFINE_PER_CPU(struct rcu_data, rcu_bh_data);
 
 static struct rcu_state *rcu_state;
diff --git a/kernel/rcutree.h b/kernel/rcutree.h
index ef26eab..c865117 100644
--- a/kernel/rcutree.h
+++ b/kernel/rcutree.h
@@ -452,6 +452,7 @@  struct rcu_state {
 	unsigned long gp_max;			/* Maximum GP duration in */
 						/*  jiffies. */
 	char *name;				/* Name of structure. */
+	char abbr;				/* Abbreviated name. */
 	struct list_head flavors;		/* List of RCU flavors. */
 };
 
diff --git a/kernel/rcutree_plugin.h b/kernel/rcutree_plugin.h
index eb9b473..ab1bdde 100644
--- a/kernel/rcutree_plugin.h
+++ b/kernel/rcutree_plugin.h
@@ -111,7 +111,7 @@  static void __init rcu_bootup_announce_oddness(void)
 #ifdef CONFIG_TREE_PREEMPT_RCU
 
 struct rcu_state rcu_preempt_state =
-	RCU_STATE_INITIALIZER(rcu_preempt, call_rcu);
+	RCU_STATE_INITIALIZER(rcu_preempt, 'p', call_rcu);
 DEFINE_PER_CPU(struct rcu_data, rcu_preempt_data);
 static struct rcu_state *rcu_state = &rcu_preempt_state;
 
@@ -2510,7 +2510,8 @@  static void __init rcu_spawn_nocb_kthreads(struct rcu_state *rsp)
 		return;
 	for_each_cpu(cpu, rcu_nocb_mask) {
 		rdp = per_cpu_ptr(rsp->rda, cpu);
-		t = kthread_run(rcu_nocb_kthread, rdp, "rcuo%d", cpu);
+		t = kthread_run(rcu_nocb_kthread, rdp,
+				"rcuo%d%c", cpu, rsp->abbr);
 		BUG_ON(IS_ERR(t));
 		ACCESS_ONCE(rdp->nocb_kthread) = t;
 	}