#include <linux/cpufreq.h>
 #include <linux/smp.h>
 #include <linux/sched/isolation.h>
+#include <linux/rcupdate.h>
 
 #include "cpu.h"
 
        if (!housekeeping_cpu(cpu, HK_FLAG_MISC))
                return 0;
 
+       if (rcu_is_idle_cpu(cpu))
+               return 0; /* Idle CPUs are completely uninteresting. */
+
        aperfmperf_snapshot_cpu(cpu, ktime_get(), true);
        return per_cpu(samples.khz, cpu);
 }
        for_each_online_cpu(cpu) {
                if (!housekeeping_cpu(cpu, HK_FLAG_MISC))
                        continue;
+               if (rcu_is_idle_cpu(cpu))
+                       continue; /* Idle CPUs are completely uninteresting. */
                if (!aperfmperf_snapshot_cpu(cpu, now, false))
                        wait = true;
        }
 
 static inline void rcu_irq_exit(void) { }
 static inline void rcu_irq_exit_preempt(void) { }
 static inline void rcu_irq_exit_check_preempt(void) { }
+#define rcu_is_idle_cpu(cpu) \
+       (is_idle_task(current) && !in_nmi() && !in_irq() && !in_serving_softirq())
 static inline void exit_rcu(void) { }
 static inline bool rcu_preempt_need_deferred_qs(struct task_struct *t)
 {
 
 void rcu_irq_exit_preempt(void);
 void rcu_irq_enter_irqson(void);
 void rcu_irq_exit_irqson(void);
+bool rcu_is_idle_cpu(int cpu);
 
 #ifdef CONFIG_PROVE_RCU
 void rcu_irq_exit_check_preempt(void);
 
        return !(snap & RCU_DYNTICK_CTRL_CTR);
 }
 
+/* Return true if the specified CPU is currently idle from an RCU viewpoint.  */
+bool rcu_is_idle_cpu(int cpu)
+{
+       struct rcu_data *rdp = per_cpu_ptr(&rcu_data, cpu);
+
+       return rcu_dynticks_in_eqs(rcu_dynticks_snap(rdp));
+}
+
 /*
  * Return true if the CPU corresponding to the specified rcu_data
  * structure has spent some time in an extended quiescent state since