lkml.org 
[lkml]   [2022]   [Jun]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] rcu: Add exp QS check in rcu_exp_handler() for no-preemptible expedited RCU
    Date
    In CONFIG_PREEMPT=n and CONFIG_PREEMPT_COUNT=y kernel, after a exp
    grace period begins, if detected current CPU enters idle in
    rcu_exp_handler() IPI handler, will immediately report the exp QS of the
    current cpu, at this time, maybe not being in an RCU read-side critical
    section, but need wait until rcu-softirq or sched-clock irq or sched-switch
    occurs on current CPU to check and report exp QS.

    This commit add a exp QS check in rcu_exp_handler(), when not being
    in an RCU read-side critical section, report exp QS earlier.

    Signed-off-by: Zqiang <qiang1.zhang@intel.com>
    ---
    kernel/rcu/tree_exp.h | 5 ++++-
    1 file changed, 4 insertions(+), 1 deletion(-)

    diff --git a/kernel/rcu/tree_exp.h b/kernel/rcu/tree_exp.h
    index be667583a554..34f08267410f 100644
    --- a/kernel/rcu/tree_exp.h
    +++ b/kernel/rcu/tree_exp.h
    @@ -828,11 +828,14 @@ static void rcu_exp_handler(void *unused)
    {
    struct rcu_data *rdp = this_cpu_ptr(&rcu_data);
    struct rcu_node *rnp = rdp->mynode;
    + bool preempt_bh_disabled =
    + !!(preempt_count() & (PREEMPT_MASK | SOFTIRQ_MASK));

    if (!(READ_ONCE(rnp->expmask) & rdp->grpmask) ||
    __this_cpu_read(rcu_data.cpu_no_qs.b.exp))
    return;
    - if (rcu_is_cpu_rrupt_from_idle()) {
    + if (rcu_is_cpu_rrupt_from_idle() ||
    + (IS_ENABLED(CONFIG_PREEMPT_COUNT) && !preempt_bh_disabled)) {
    rcu_report_exp_rdp(this_cpu_ptr(&rcu_data));
    return;
    }
    --
    2.25.1
    \
     
     \ /
      Last update: 2022-06-22 12:37    [W:2.922 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site