OSDN Git Service

rcu: Avoid self-IPI in sync_rcu_exp_select_node_cpus()
authorPaul E. McKenney <paulmck@linux.ibm.com>
Wed, 27 Mar 2019 16:09:47 +0000 (09:09 -0700)
committerPaul E. McKenney <paulmck@linux.ibm.com>
Sat, 25 May 2019 21:50:50 +0000 (14:50 -0700)
Although sync_rcu_exp_select_node_cpus() treats the current CPU as being
in a quiescent state, it might well migrate to some other CPU before
reaching the smp_call_function_single(), which could then result in an
unnecessary simulated self-IPI.  This commit therefore instead simply
refuses to invoke smp_call_function_single() on the current CPU, which
causes the later rcu_report_exp_cpu_mult() to report this CPU's quiescent
state with less overhead.

This also reduces the rcu_exp_handler() function's state space by removing
the direct call that this smp_call_function_single() uses to emulate the
requested self-IPI.

Signed-off-by: Paul E. McKenney <paulmck@linux.ibm.com>
[ paulmck: Use get_cpu() instead of preempt_disable() per Joel Fernandes. ]

kernel/rcu/tree_exp.h

index 9c990df..5390618 100644 (file)
@@ -384,7 +384,12 @@ retry_ipi:
                        mask_ofl_test |= mask;
                        continue;
                }
+               if (get_cpu() == cpu) {
+                       put_cpu();
+                       continue;
+               }
                ret = smp_call_function_single(cpu, rcu_exp_handler, NULL, 0);
+               put_cpu();
                if (!ret) {
                        mask_ofl_ipi &= ~mask;
                        continue;