public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH rcu 0/6] Add RCU Tasks diagnostics and documentation
@ 2024-08-02  0:34 Paul E. McKenney
  2024-08-02  0:34 ` [PATCH rcu 1/6] rcu/tasks: Check processor-ID assumptions Paul E. McKenney
                   ` (5 more replies)
  0 siblings, 6 replies; 9+ messages in thread
From: Paul E. McKenney @ 2024-08-02  0:34 UTC (permalink / raw)
  To: rcu; +Cc: linux-kernel, kernel-team, rostedt

Hello!

This series adds RCU Tasks diagnostics and documentation:

1.	Check processor-ID assumptions.

2.	Update rtp->tasks_gp_seq comment.

3.	Provide rcu_barrier_cb_is_done() to check rcu_barrier() CBs.

4.	Mark callbacks not currently participating in barrier operation.

5.	Add detailed grace-period and barrier diagnostics.

6.	Add rcu_barrier_tasks*() start time to diagnostics.

						Thanx, Paul

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

 b/include/linux/rcupdate.h |    3 +
 b/kernel/rcu/rcu.h         |    5 +++
 b/kernel/rcu/tasks.h       |    1 
 kernel/rcu/tasks.h         |   75 ++++++++++++++++++++++++++++++++++++++++++---
 4 files changed, 79 insertions(+), 5 deletions(-)

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH rcu 1/6] rcu/tasks: Check processor-ID assumptions
  2024-08-02  0:34 [PATCH rcu 0/6] Add RCU Tasks diagnostics and documentation Paul E. McKenney
@ 2024-08-02  0:34 ` Paul E. McKenney
  2024-08-14 12:16   ` Neeraj Upadhyay
  2024-08-02  0:34 ` [PATCH rcu 2/6] rcu/tasks: Update rtp->tasks_gp_seq comment Paul E. McKenney
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 9+ messages in thread
From: Paul E. McKenney @ 2024-08-02  0:34 UTC (permalink / raw)
  To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney

The current mapping of smp_processor_id() to a CPU processing Tasks-RCU
callbacks makes some assumptions about layout.  This commit therefore
adds a WARN_ON() to check these assumptions.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
 kernel/rcu/tasks.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index b6fcf744af75d..d473846a572aa 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -355,6 +355,7 @@ static void call_rcu_tasks_generic(struct rcu_head *rhp, rcu_callback_t func,
 	rcu_read_lock();
 	ideal_cpu = smp_processor_id() >> READ_ONCE(rtp->percpu_enqueue_shift);
 	chosen_cpu = cpumask_next(ideal_cpu - 1, cpu_possible_mask);
+	WARN_ON_ONCE(chosen_cpu >= nr_cpu_ids);
 	rtpcp = per_cpu_ptr(rtp->rtpcpu, chosen_cpu);
 	if (!raw_spin_trylock_rcu_node(rtpcp)) { // irqs already disabled.
 		raw_spin_lock_rcu_node(rtpcp); // irqs already disabled.
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH rcu 2/6] rcu/tasks: Update rtp->tasks_gp_seq comment
  2024-08-02  0:34 [PATCH rcu 0/6] Add RCU Tasks diagnostics and documentation Paul E. McKenney
  2024-08-02  0:34 ` [PATCH rcu 1/6] rcu/tasks: Check processor-ID assumptions Paul E. McKenney
@ 2024-08-02  0:34 ` Paul E. McKenney
  2024-08-02  0:34 ` [PATCH rcu 3/6] rcu: Provide rcu_barrier_cb_is_done() to check rcu_barrier() CBs Paul E. McKenney
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Paul E. McKenney @ 2024-08-02  0:34 UTC (permalink / raw)
  To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney

The rtp->tasks_gp_seq grace-period sequence number is not a strict count,
but rather the usual RCU sequence number with the lower few bits tracking
per-grace-period state and the upper bits the count of grace periods
since boot, give or take the initial value.  This commit therefore
adjusts this comment.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
 kernel/rcu/tasks.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index d473846a572aa..cf273c554f3b0 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -64,7 +64,7 @@ struct rcu_tasks_percpu {
  * @init_fract: Initial backoff sleep interval.
  * @gp_jiffies: Time of last @gp_state transition.
  * @gp_start: Most recent grace-period start in jiffies.
- * @tasks_gp_seq: Number of grace periods completed since boot.
+ * @tasks_gp_seq: Number of grace periods completed since boot in upper bits.
  * @n_ipis: Number of IPIs sent to encourage grace periods to end.
  * @n_ipis_fails: Number of IPI-send failures.
  * @kthread_ptr: This flavor's grace-period/callback-invocation kthread.
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH rcu 3/6] rcu: Provide rcu_barrier_cb_is_done() to check rcu_barrier() CBs
  2024-08-02  0:34 [PATCH rcu 0/6] Add RCU Tasks diagnostics and documentation Paul E. McKenney
  2024-08-02  0:34 ` [PATCH rcu 1/6] rcu/tasks: Check processor-ID assumptions Paul E. McKenney
  2024-08-02  0:34 ` [PATCH rcu 2/6] rcu/tasks: Update rtp->tasks_gp_seq comment Paul E. McKenney
@ 2024-08-02  0:34 ` Paul E. McKenney
  2024-08-02  0:34 ` [PATCH rcu 4/6] rcu/tasks: Mark callbacks not currently participating in barrier operation Paul E. McKenney
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Paul E. McKenney @ 2024-08-02  0:34 UTC (permalink / raw)
  To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney

This commit provides a rcu_barrier_cb_is_done() function that returns
true if the *rcu_barrier*() callback passed in is done.  This will be
used when printing grace-period debugging information.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
 kernel/rcu/rcu.h | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/kernel/rcu/rcu.h b/kernel/rcu/rcu.h
index f035fd4e579b4..feb3ac1dc5d59 100644
--- a/kernel/rcu/rcu.h
+++ b/kernel/rcu/rcu.h
@@ -252,6 +252,11 @@ static inline void debug_rcu_head_callback(struct rcu_head *rhp)
 		kmem_dump_obj(rhp);
 }
 
+static inline bool rcu_barrier_cb_is_done(struct rcu_head *rhp)
+{
+	return rhp->next == rhp;
+}
+
 extern int rcu_cpu_stall_suppress_at_boot;
 
 static inline bool rcu_stall_is_suppressed_at_boot(void)
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH rcu 4/6] rcu/tasks: Mark callbacks not currently participating in barrier operation
  2024-08-02  0:34 [PATCH rcu 0/6] Add RCU Tasks diagnostics and documentation Paul E. McKenney
                   ` (2 preceding siblings ...)
  2024-08-02  0:34 ` [PATCH rcu 3/6] rcu: Provide rcu_barrier_cb_is_done() to check rcu_barrier() CBs Paul E. McKenney
@ 2024-08-02  0:34 ` Paul E. McKenney
  2024-08-02  0:34 ` [PATCH rcu 5/6] rcu/tasks: Add detailed grace-period and barrier diagnostics Paul E. McKenney
  2024-08-02  0:34 ` [PATCH rcu 6/6] rcu/tasks: Add rcu_barrier_tasks*() start time to diagnostics Paul E. McKenney
  5 siblings, 0 replies; 9+ messages in thread
From: Paul E. McKenney @ 2024-08-02  0:34 UTC (permalink / raw)
  To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney

Each Tasks RCU flavor keeps a count of the number of callbacks that the
current rcu_barrier_tasks*() is waiting on, but there is currently no
easy way to work out which callback is stuck.  One way to do this is to
mark idle RCU-barrier callbacks by making the ->next pointer point to
the callback itself, and this commit does just that.

Later commits will use this for debug output.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
 kernel/rcu/tasks.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index cf273c554f3b0..6f1e82e548bbc 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -281,6 +281,7 @@ static void cblist_init_generic(struct rcu_tasks *rtp)
 			INIT_LIST_HEAD(&rtpcp->rtp_blkd_tasks);
 		if (!rtpcp->rtp_exit_list.next)
 			INIT_LIST_HEAD(&rtpcp->rtp_exit_list);
+		rtpcp->barrier_q_head.next = &rtpcp->barrier_q_head;
 		maxcpu = cpu;
 	}
 
@@ -405,6 +406,7 @@ static void rcu_barrier_tasks_generic_cb(struct rcu_head *rhp)
 	struct rcu_tasks *rtp;
 	struct rcu_tasks_percpu *rtpcp;
 
+	rhp->next = rhp; // Mark the callback as having been invoked.
 	rtpcp = container_of(rhp, struct rcu_tasks_percpu, barrier_q_head);
 	rtp = rtpcp->rtpp;
 	if (atomic_dec_and_test(&rtp->barrier_q_count))
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH rcu 5/6] rcu/tasks: Add detailed grace-period and barrier diagnostics
  2024-08-02  0:34 [PATCH rcu 0/6] Add RCU Tasks diagnostics and documentation Paul E. McKenney
                   ` (3 preceding siblings ...)
  2024-08-02  0:34 ` [PATCH rcu 4/6] rcu/tasks: Mark callbacks not currently participating in barrier operation Paul E. McKenney
@ 2024-08-02  0:34 ` Paul E. McKenney
  2024-08-02  0:34 ` [PATCH rcu 6/6] rcu/tasks: Add rcu_barrier_tasks*() start time to diagnostics Paul E. McKenney
  5 siblings, 0 replies; 9+ messages in thread
From: Paul E. McKenney @ 2024-08-02  0:34 UTC (permalink / raw)
  To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney

This commit adds rcu_tasks_torture_stats_print(),
rcu_tasks_trace_torture_stats_print(), and
rcu_tasks_rude_torture_stats_print() functions that provide detailed
diagnostics on grace-period, callback, and barrier state.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
 include/linux/rcupdate.h |  3 ++
 kernel/rcu/tasks.h       | 63 ++++++++++++++++++++++++++++++++++++++--
 2 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/include/linux/rcupdate.h b/include/linux/rcupdate.h
index e40a726fe1a03..58d84c59f3dda 100644
--- a/include/linux/rcupdate.h
+++ b/include/linux/rcupdate.h
@@ -174,6 +174,7 @@ static inline void rcu_nocb_flush_deferred_wakeup(void) { }
 	} while (0)
 void call_rcu_tasks(struct rcu_head *head, rcu_callback_t func);
 void synchronize_rcu_tasks(void);
+void rcu_tasks_torture_stats_print(char *tt, char *tf);
 # else
 # define rcu_tasks_classic_qs(t, preempt) do { } while (0)
 # define call_rcu_tasks call_rcu
@@ -200,6 +201,7 @@ void rcu_tasks_trace_qs_blkd(struct task_struct *t);
 			rcu_tasks_trace_qs_blkd(t);				\
 		}								\
 	} while (0)
+void rcu_tasks_trace_torture_stats_print(char *tt, char *tf);
 # else
 # define rcu_tasks_trace_qs(t) do { } while (0)
 # endif
@@ -212,6 +214,7 @@ do {									\
 
 # ifdef CONFIG_TASKS_RUDE_RCU
 void synchronize_rcu_tasks_rude(void);
+void rcu_tasks_rude_torture_stats_print(char *tt, char *tf);
 # endif
 
 #define rcu_note_voluntary_context_switch(t) rcu_tasks_qs(t, false)
diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index 6f1e82e548bbc..37597f7c581ca 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -712,9 +712,7 @@ static void __init rcu_tasks_bootup_oddness(void)
 #endif /* #ifdef CONFIG_TASKS_TRACE_RCU */
 }
 
-#endif /* #ifndef CONFIG_TINY_RCU */
 
-#ifndef CONFIG_TINY_RCU
 /* Dump out rcutorture-relevant state common to all RCU-tasks flavors. */
 static void show_rcu_tasks_generic_gp_kthread(struct rcu_tasks *rtp, char *s)
 {
@@ -748,6 +746,52 @@ static void show_rcu_tasks_generic_gp_kthread(struct rcu_tasks *rtp, char *s)
 		rtp->lazy_jiffies,
 		s);
 }
+
+/* Dump out more rcutorture-relevant state common to all RCU-tasks flavors. */
+static void rcu_tasks_torture_stats_print_generic(struct rcu_tasks *rtp, char *tt,
+						  char *tf, char *tst)
+{
+	cpumask_var_t cm;
+	int cpu;
+	bool gotcb = false;
+	unsigned long j = jiffies;
+
+	pr_alert("%s%s Tasks%s RCU g%ld gp_start %lu gp_jiffies %lu gp_state %d (%s).\n",
+		 tt, tf, tst, data_race(rtp->tasks_gp_seq),
+		 j - data_race(rtp->gp_start), j - data_race(rtp->gp_jiffies),
+		 data_race(rtp->gp_state), tasks_gp_state_getname(rtp));
+	pr_alert("\tEnqueue shift %d limit %d Dequeue limit %d gpseq %lu.\n",
+		 data_race(rtp->percpu_enqueue_shift),
+		 data_race(rtp->percpu_enqueue_lim),
+		 data_race(rtp->percpu_dequeue_lim),
+		 data_race(rtp->percpu_dequeue_gpseq));
+	(void)zalloc_cpumask_var(&cm, GFP_KERNEL);
+	pr_alert("\tCallback counts:");
+	for_each_possible_cpu(cpu) {
+		long n;
+		struct rcu_tasks_percpu *rtpcp = per_cpu_ptr(rtp->rtpcpu, cpu);
+
+		if (cpumask_available(cm) && !rcu_barrier_cb_is_done(&rtpcp->barrier_q_head))
+			cpumask_set_cpu(cpu, cm);
+		n = rcu_segcblist_n_cbs(&rtpcp->cblist);
+		if (!n)
+			continue;
+		pr_cont(" %d:%ld", cpu, n);
+		gotcb = true;
+	}
+	if (gotcb)
+		pr_cont(".\n");
+	else
+		pr_cont(" (none).\n");
+	pr_alert("\tBarrier seq %lu count %d holdout CPUs ",
+		 data_race(rtp->barrier_q_seq), atomic_read(&rtp->barrier_q_count));
+	if (cpumask_available(cm) && !cpumask_empty(cm))
+		pr_cont(" %*pbl.\n", cpumask_pr_args(cm));
+	else
+		pr_cont("(none).\n");
+	free_cpumask_var(cm);
+}
+
 #endif // #ifndef CONFIG_TINY_RCU
 
 static void exit_tasks_rcu_finish_trace(struct task_struct *t);
@@ -1199,6 +1243,11 @@ void show_rcu_tasks_classic_gp_kthread(void)
 	show_rcu_tasks_generic_gp_kthread(&rcu_tasks, "");
 }
 EXPORT_SYMBOL_GPL(show_rcu_tasks_classic_gp_kthread);
+void rcu_tasks_torture_stats_print(char *tt, char *tf)
+{
+	rcu_tasks_torture_stats_print_generic(&rcu_tasks, tt, tf, "");
+}
+EXPORT_SYMBOL_GPL(rcu_tasks_torture_stats_print);
 #endif // !defined(CONFIG_TINY_RCU)
 
 struct task_struct *get_rcu_tasks_gp_kthread(void)
@@ -1360,6 +1409,11 @@ void show_rcu_tasks_rude_gp_kthread(void)
 	show_rcu_tasks_generic_gp_kthread(&rcu_tasks_rude, "");
 }
 EXPORT_SYMBOL_GPL(show_rcu_tasks_rude_gp_kthread);
+void rcu_tasks_rude_torture_stats_print(char *tt, char *tf)
+{
+	rcu_tasks_torture_stats_print_generic(&rcu_tasks_rude, tt, tf, "");
+}
+EXPORT_SYMBOL_GPL(rcu_tasks_rude_torture_stats_print);
 #endif // !defined(CONFIG_TINY_RCU)
 
 struct task_struct *get_rcu_tasks_rude_gp_kthread(void)
@@ -2037,6 +2091,11 @@ void show_rcu_tasks_trace_gp_kthread(void)
 	show_rcu_tasks_generic_gp_kthread(&rcu_tasks_trace, buf);
 }
 EXPORT_SYMBOL_GPL(show_rcu_tasks_trace_gp_kthread);
+void rcu_tasks_trace_torture_stats_print(char *tt, char *tf)
+{
+	rcu_tasks_torture_stats_print_generic(&rcu_tasks_trace, tt, tf, "");
+}
+EXPORT_SYMBOL_GPL(rcu_tasks_trace_torture_stats_print);
 #endif // !defined(CONFIG_TINY_RCU)
 
 struct task_struct *get_rcu_tasks_trace_gp_kthread(void)
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH rcu 6/6] rcu/tasks: Add rcu_barrier_tasks*() start time to diagnostics
  2024-08-02  0:34 [PATCH rcu 0/6] Add RCU Tasks diagnostics and documentation Paul E. McKenney
                   ` (4 preceding siblings ...)
  2024-08-02  0:34 ` [PATCH rcu 5/6] rcu/tasks: Add detailed grace-period and barrier diagnostics Paul E. McKenney
@ 2024-08-02  0:34 ` Paul E. McKenney
  5 siblings, 0 replies; 9+ messages in thread
From: Paul E. McKenney @ 2024-08-02  0:34 UTC (permalink / raw)
  To: rcu; +Cc: linux-kernel, kernel-team, rostedt, Paul E. McKenney

This commit adds the start time, in jiffies, of the most recently started
rcu_barrier_tasks*() operation to the diagnostic output used by rcuscale.
This information can be helpful in distinguishing a hung barrier operation
from a long series of barrier operations.

Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
---
 kernel/rcu/tasks.h | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
index 37597f7c581ca..2f8d6c8e3c4ce 100644
--- a/kernel/rcu/tasks.h
+++ b/kernel/rcu/tasks.h
@@ -85,6 +85,7 @@ struct rcu_tasks_percpu {
  * @barrier_q_count: Number of queues being waited on.
  * @barrier_q_completion: Barrier wait/wakeup mechanism.
  * @barrier_q_seq: Sequence number for barrier operations.
+ * @barrier_q_start: Most recent barrier start in jiffies.
  * @name: This flavor's textual name.
  * @kname: This flavor's kthread name.
  */
@@ -120,6 +121,7 @@ struct rcu_tasks {
 	atomic_t barrier_q_count;
 	struct completion barrier_q_completion;
 	unsigned long barrier_q_seq;
+	unsigned long barrier_q_start;
 	char *name;
 	char *kname;
 };
@@ -428,6 +430,7 @@ static void __maybe_unused rcu_barrier_tasks_generic(struct rcu_tasks *rtp)
 		mutex_unlock(&rtp->barrier_q_mutex);
 		return;
 	}
+	rtp->barrier_q_start = jiffies;
 	rcu_seq_start(&rtp->barrier_q_seq);
 	init_completion(&rtp->barrier_q_completion);
 	atomic_set(&rtp->barrier_q_count, 2);
@@ -783,8 +786,9 @@ static void rcu_tasks_torture_stats_print_generic(struct rcu_tasks *rtp, char *t
 		pr_cont(".\n");
 	else
 		pr_cont(" (none).\n");
-	pr_alert("\tBarrier seq %lu count %d holdout CPUs ",
-		 data_race(rtp->barrier_q_seq), atomic_read(&rtp->barrier_q_count));
+	pr_alert("\tBarrier seq %lu start %lu count %d holdout CPUs ",
+		 data_race(rtp->barrier_q_seq), j - data_race(rtp->barrier_q_start),
+		 atomic_read(&rtp->barrier_q_count));
 	if (cpumask_available(cm) && !cpumask_empty(cm))
 		pr_cont(" %*pbl.\n", cpumask_pr_args(cm));
 	else
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH rcu 1/6] rcu/tasks: Check processor-ID assumptions
  2024-08-02  0:34 ` [PATCH rcu 1/6] rcu/tasks: Check processor-ID assumptions Paul E. McKenney
@ 2024-08-14 12:16   ` Neeraj Upadhyay
  2024-08-14 16:13     ` Paul E. McKenney
  0 siblings, 1 reply; 9+ messages in thread
From: Neeraj Upadhyay @ 2024-08-14 12:16 UTC (permalink / raw)
  To: Paul E. McKenney; +Cc: rcu, linux-kernel, kernel-team, rostedt, Zqiang

Hi Paul,

On Thu, Aug 01, 2024 at 05:34:21PM -0700, Paul E. McKenney wrote:
> The current mapping of smp_processor_id() to a CPU processing Tasks-RCU
> callbacks makes some assumptions about layout.  This commit therefore
> adds a WARN_ON() to check these assumptions.
> 
> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
> ---
>  kernel/rcu/tasks.h | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
> index b6fcf744af75d..d473846a572aa 100644
> --- a/kernel/rcu/tasks.h
> +++ b/kernel/rcu/tasks.h
> @@ -355,6 +355,7 @@ static void call_rcu_tasks_generic(struct rcu_head *rhp, rcu_callback_t func,
>  	rcu_read_lock();
>  	ideal_cpu = smp_processor_id() >> READ_ONCE(rtp->percpu_enqueue_shift);
>  	chosen_cpu = cpumask_next(ideal_cpu - 1, cpu_possible_mask);
> +	WARN_ON_ONCE(chosen_cpu >= nr_cpu_ids);

I have changed this s/nr_cpu_ids/rcu_task_cpu_ids/ , as there is a
another commit 	fd70e9f1d85f "rcu-tasks: Fix access non-existent percpu
rtpcp variable in rcu_tasks_need_gpcb()" which is included in the tree
here [1]. Please let me know if something looks incorrect.


[1] https://git.kernel.org/pub/scm/linux/kernel/git/neeraj.upadhyay/linux-rcu.git/log/?h=next.14.08.24a


- Neeraj

>  	rtpcp = per_cpu_ptr(rtp->rtpcpu, chosen_cpu);
>  	if (!raw_spin_trylock_rcu_node(rtpcp)) { // irqs already disabled.
>  		raw_spin_lock_rcu_node(rtpcp); // irqs already disabled.
> -- 
> 2.40.1
> 

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH rcu 1/6] rcu/tasks: Check processor-ID assumptions
  2024-08-14 12:16   ` Neeraj Upadhyay
@ 2024-08-14 16:13     ` Paul E. McKenney
  0 siblings, 0 replies; 9+ messages in thread
From: Paul E. McKenney @ 2024-08-14 16:13 UTC (permalink / raw)
  To: Neeraj Upadhyay; +Cc: rcu, linux-kernel, kernel-team, rostedt, Zqiang

On Wed, Aug 14, 2024 at 05:46:54PM +0530, Neeraj Upadhyay wrote:
> Hi Paul,
> 
> On Thu, Aug 01, 2024 at 05:34:21PM -0700, Paul E. McKenney wrote:
> > The current mapping of smp_processor_id() to a CPU processing Tasks-RCU
> > callbacks makes some assumptions about layout.  This commit therefore
> > adds a WARN_ON() to check these assumptions.
> > 
> > Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
> > ---
> >  kernel/rcu/tasks.h | 1 +
> >  1 file changed, 1 insertion(+)
> > 
> > diff --git a/kernel/rcu/tasks.h b/kernel/rcu/tasks.h
> > index b6fcf744af75d..d473846a572aa 100644
> > --- a/kernel/rcu/tasks.h
> > +++ b/kernel/rcu/tasks.h
> > @@ -355,6 +355,7 @@ static void call_rcu_tasks_generic(struct rcu_head *rhp, rcu_callback_t func,
> >  	rcu_read_lock();
> >  	ideal_cpu = smp_processor_id() >> READ_ONCE(rtp->percpu_enqueue_shift);
> >  	chosen_cpu = cpumask_next(ideal_cpu - 1, cpu_possible_mask);
> > +	WARN_ON_ONCE(chosen_cpu >= nr_cpu_ids);
> 
> I have changed this s/nr_cpu_ids/rcu_task_cpu_ids/ , as there is a
> another commit 	fd70e9f1d85f "rcu-tasks: Fix access non-existent percpu
> rtpcp variable in rcu_tasks_need_gpcb()" which is included in the tree
> here [1]. Please let me know if something looks incorrect.
> 
> [1] https://git.kernel.org/pub/scm/linux/kernel/git/neeraj.upadhyay/linux-rcu.git/log/?h=next.14.08.24a

Good catch, looks good, and thank you!

							Thanx, Paul

> - Neeraj
> 
> >  	rtpcp = per_cpu_ptr(rtp->rtpcpu, chosen_cpu);
> >  	if (!raw_spin_trylock_rcu_node(rtpcp)) { // irqs already disabled.
> >  		raw_spin_lock_rcu_node(rtpcp); // irqs already disabled.
> > -- 
> > 2.40.1
> > 

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2024-08-14 16:13 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-08-02  0:34 [PATCH rcu 0/6] Add RCU Tasks diagnostics and documentation Paul E. McKenney
2024-08-02  0:34 ` [PATCH rcu 1/6] rcu/tasks: Check processor-ID assumptions Paul E. McKenney
2024-08-14 12:16   ` Neeraj Upadhyay
2024-08-14 16:13     ` Paul E. McKenney
2024-08-02  0:34 ` [PATCH rcu 2/6] rcu/tasks: Update rtp->tasks_gp_seq comment Paul E. McKenney
2024-08-02  0:34 ` [PATCH rcu 3/6] rcu: Provide rcu_barrier_cb_is_done() to check rcu_barrier() CBs Paul E. McKenney
2024-08-02  0:34 ` [PATCH rcu 4/6] rcu/tasks: Mark callbacks not currently participating in barrier operation Paul E. McKenney
2024-08-02  0:34 ` [PATCH rcu 5/6] rcu/tasks: Add detailed grace-period and barrier diagnostics Paul E. McKenney
2024-08-02  0:34 ` [PATCH rcu 6/6] rcu/tasks: Add rcu_barrier_tasks*() start time to diagnostics Paul E. McKenney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox