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 ;) - Joel