Re: Query regarding srcu_funnel_exp_start()

From: Paul E. McKenney
Date: Fri Oct 27 2017 - 08:26:16 EST


On Fri, Oct 27, 2017 at 02:23:07PM +0530, Neeraj Upadhyay wrote:
> Hi,
>
> One query regarding srcu_funnel_exp_start() function in
> kernel/rcu/srcutree.c.
>
> static void srcu_funnel_exp_start(struct srcu_struct *sp, struct
> srcu_node *snp,
> unsigned long s)
> {
> <snip>
> if (!ULONG_CMP_LT(sp->srcu_gp_seq_needed_exp, s))
> sp->srcu_gp_seq_needed_exp = s;
> <snip>
> }
>
> Why is sp->srcu_gp_seq_needed_exp set to 's' if srcu_gp_seq_needed_exp is >=
> 's'. Shouldn't srcu_gp_seq_needed_exp be equal to the greater of both?

Let's suppose that it is incorrect as currently written. Can you
construct a test case demonstrating a failure of some sort, then provide
a fix?

To start with, if it is currently incorrect, what would be the nature
of the failure?

Thanx, Paul