On Tue, Mar 19, 2024 at 02:52:43PM -0400, Joel Fernandes wrote: > > > On 3/19/2024 2:37 PM, Uladzislau Rezki wrote: > > On Tue, Mar 19, 2024 at 01:33:11PM -0400, Joel Fernandes wrote: > > >>> On 3/19/2024 1:26 PM, Uladzislau Rezki wrote: > > >>>>>>>>>>>> /* > >>>>>>>>>>>> @@ -1673,7 +1680,7 @@ static void rcu_sr_normal_gp_cleanup_work(struct work_struct *work) > >>>>>>>>>>>> */ > >>>>>>>>>>>> static void rcu_sr_normal_gp_cleanup(void) > >>>>>>>>>>>> { > >>>>>>>>>>>> - struct llist_node *wait_tail, *next, *rcu; > >>>>>>>>>>>> + struct llist_node *wait_tail, *next = NULL, *rcu = NULL; > >>>>>>>>>>>> int done = 0; > >>>>>>>>>>>> > >>>>>>>>>>>> wait_tail = rcu_state.srs_wait_tail; > >>>>>>>>>>>> @@ -1699,16 +1706,35 @@ static void rcu_sr_normal_gp_cleanup(void) > >>>>>>>>>>>> break; > >>>>>>>>>>>> } > >>>>>>>>>>>> > >>>>>>>>>>>> - // concurrent sr_normal_gp_cleanup work might observe this update. > >>>>>>>>>>>> - smp_store_release(&rcu_state.srs_done_tail, wait_tail); > >>>>>>>>>>>> + /* > >>>>>>>>>>>> + * Fast path, no more users to process. Remove the last wait head > >>>>>>>>>>>> + * if no inflight-workers. If there are in-flight workers, let them > >>>>>>>>>>>> + * remove the last wait head. > >>>>>>>>>>>> + */ > >>>>>>>>>>>> + WARN_ON_ONCE(!rcu); > >>>>>>>>>>>> > >>>>>>>>>>> This assumption is not correct. An "rcu" can be NULL in fact. > >>>>>>>>>> > >>>>>>>>>> Hmm I could never trigger that. Are you saying that is true after Neeraj recent patch or something else? > >>>>>>>>>> Note, after Neeraj patch to handle the lack of heads availability, it could be true so I requested > >>>>>>>>>> him to rebase his patch on top of this one. > >>>>>>>>>> > >>>>>>>>>> However I will revisit my patch and look for if it could occur but please let me know if you knew of a sequence of events to make it NULL. > >>>>>>>>>>> > >>>>>>>>> I think we should agree on your patch first otherwise it becomes a bit > >>>>>>>>> messy or go with a Neeraj as first step and then work on youth. So, i > >>>>>>>>> reviewed this patch based on latest Paul's dev branch. I see that Neeraj > >>>>>>>>> needs further work. > >>>>>>>> > >>>>>>>> You are right. So the only change is to drop the warning and those braces. Agreed? > >>>>>>>> > >>>>>>> Let me check a bit. Looks like correct but just in case. > >>>>>>> > >>>>>> > >>>>>> Thanks. I was also considering improving it for the rcu == NULL case, as > >>>>>> below. I will test it more before re-sending. > >>>>>> > >>>>>> On top of my patch: > >>>>>> > >>>>>> ---8<----------------------- > >>>>>> > >>>>>> diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > >>>>>> index 0df659a878ee..a5ef844835d4 100644 > >>>>>> --- a/kernel/rcu/tree.c > >>>>>> +++ b/kernel/rcu/tree.c > >>>>>> @@ -1706,15 +1706,18 @@ static void rcu_sr_normal_gp_cleanup(void) > >>>>>> break; > >>>>>> } > >>>>>> > >>>>>> + > >>>>>> + /* Last head stays. No more processing to do. */ > >>>>>> + if (!rcu) > >>>>>> + return; > >>>>>> + > >>>>> > >>>>> Ugh, should be "if (!wait_head->next)" instead of "if (!rcu)". But > >>>>> in any case, the original patch except the warning should hold. > >>>>> Still, I am testing the above diff now. > >>>>> > >>>>> - Joel > >>>>> > >>>> Just in case, it is based on your patch: > >>>> > >>>> <snip> > >>>> diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c > >>>> index bd29fe3c76bf..98546afe7c21 100644 > >>>> --- a/kernel/rcu/tree.c > >>>> +++ b/kernel/rcu/tree.c > >>>> @@ -1711,29 +1711,25 @@ static void rcu_sr_normal_gp_cleanup(void) > >>>> * if no inflight-workers. If there are in-flight workers, let them > >>>> * remove the last wait head. > >>>> */ > >>>> - WARN_ON_ONCE(!rcu); > >>>> - ASSERT_EXCLUSIVE_WRITER(rcu_state.srs_done_tail); > >>>> - > >>>> - if (rcu && rcu_sr_is_wait_head(rcu) && rcu->next == NULL && > >>>> - /* Order atomic access with list manipulation. */ > >>>> - !atomic_read_acquire(&rcu_state.srs_cleanups_pending)) { > >>>> + if (wait_tail->next && rcu_sr_is_wait_head(wait_tail->next) && !wait_tail->next->next && > >>>> + !atomic_read_acquire(&rcu_state.srs_cleanups_pending)) { > >>> > >>> > >>> Yes this also works. But also if wait_tail->next == NULL, then you do not need > >>> to queue worker for that case as well. I sent this as v3. > >>> > >> Sorry, I see you did add that later in the patch ;-). I think we have converged > >> on the final patch then, give or take the use of 'rcu' versus 'wait_tail->next'. > >> > > Just combine all parts into one place and resend :) > > Yes sir ;) > Ha-ha :))))) -- Uladzislau Rezki