]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
rcu: Clear ->rcu_read_unlock_special only once
authorLai Jiangshan <laijs@linux.alibaba.com>
Fri, 1 Nov 2019 12:06:21 +0000 (05:06 -0700)
committerPaul E. McKenney <paulmck@kernel.org>
Fri, 24 Jan 2020 18:27:33 +0000 (10:27 -0800)
In rcu_preempt_deferred_qs_irqrestore(), ->rcu_read_unlock_special is
cleared one piece at a time.  Given that the "if" statements in this
function use the copy in "special", this commit removes the clearing
of the individual pieces in favor of clearing ->rcu_read_unlock_special
in one go just after it has been determined to be non-zero.

Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com>
Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
kernel/rcu/tree_plugin.h

index 7487c7930a47f59039a2205bfec4a0513a3f3a2e..c3a32717c42d9fb3a4d9a2afa6e00012bc836398 100644 (file)
@@ -444,16 +444,9 @@ rcu_preempt_deferred_qs_irqrestore(struct task_struct *t, unsigned long flags)
                local_irq_restore(flags);
                return;
        }
-       t->rcu_read_unlock_special.b.exp_hint = false;
-       t->rcu_read_unlock_special.b.deferred_qs = false;
-       if (special.b.need_qs) {
+       t->rcu_read_unlock_special.s = 0;
+       if (special.b.need_qs)
                rcu_qs();
-               t->rcu_read_unlock_special.b.need_qs = false;
-               if (!t->rcu_read_unlock_special.s && !rdp->exp_deferred_qs) {
-                       local_irq_restore(flags);
-                       return;
-               }
-       }
 
        /*
         * Respond to a request by an expedited grace period for a
@@ -461,17 +454,11 @@ rcu_preempt_deferred_qs_irqrestore(struct task_struct *t, unsigned long flags)
         * tasks are handled when removing the task from the
         * blocked-tasks list below.
         */
-       if (rdp->exp_deferred_qs) {
+       if (rdp->exp_deferred_qs)
                rcu_report_exp_rdp(rdp);
-               if (!t->rcu_read_unlock_special.s) {
-                       local_irq_restore(flags);
-                       return;
-               }
-       }
 
        /* Clean up if blocked during RCU read-side critical section. */
        if (special.b.blocked) {
-               t->rcu_read_unlock_special.b.blocked = false;
 
                /*
                 * Remove this task from the list it blocked on.  The task