Hi Paul, 
On Wed, Aug 22, 2007 at 12:02:54PM -0700, Paul E. McKenney wrote:
> +/*
> + * Print out RCU booster task statistics at the specified interval.
> + */
> +static void rcu_boost_dat_stat_print(void)
> +{
> +     /* Three decimal digits per byte plus spacing per number and line. */
> +     char buf[N_RCU_BOOST_STATE * (sizeof(long) * 3 + 2) + 2];
> +     int cpu;
> +     int event;
> +     int i;
> +     static time_t lastprint = 0;
> +     struct rcu_boost_dat *rbdp;
> +     int state;
> +     struct rcu_boost_dat sum;
> +
> +     /* Wait a graceful interval between printk spamming. */
> +
> +     if (xtime.tv_sec - lastprint <
> +         CONFIG_PREEMPT_RCU_BOOST_STATS_INTERVAL)
> +             return;
> +
> +     /* Sum up the state/event-independent counters. */
> +
> +     sum.rbs_blocked = 0;
> +     sum.rbs_boost_attempt = 0;
> +     sum.rbs_boost = 0;
> +     sum.rbs_unlock = 0;
> +     sum.rbs_unboosted = 0;
> +     for_each_possible_cpu(cpu)
> +             for (i = 0; i < RCU_BOOST_ELEMENTS; i++) {
> +                     rbdp = per_cpu(rcu_boost_dat, cpu);
> +                     sum.rbs_blocked += rbdp[i].rbs_blocked;
> +                     sum.rbs_boost_attempt += rbdp[i].rbs_boost_attempt;
> +                     sum.rbs_boost += rbdp[i].rbs_boost;
> +                     sum.rbs_unlock += rbdp[i].rbs_unlock;
> +                     sum.rbs_unboosted += rbdp[i].rbs_unboosted;
> +             }

I feel we should still be able to use for_each_online_cpu(cpu) instead
of for_each_possible_cpu. Again, there's a good chance that I might
be mistaken!

How about the following ?

        preempt_disable(); /* We Dont want cpus going down here */
        for_each_online_cpu(cpu) 
                for (i = 0; i < RCU_BOOST_ELEMENTS; i++) {
                        rbdp = per_cpu(rcu_boost_dat, cpu);
                        sum.rbs_blocked += rbdp[i].rbs_blocked;
                        sum.rbs_boost_attempt += rbdp[i].rbs_boost_attempt;
                        sum.rbs_boost += rbdp[i].rbs_boost;
                        sum.rbs_unlock += rbdp[i].rbs_unlock;
                        sum.rbs_unboosted += rbdp[i].rbs_unboosted;
                }
        preempt_enable(); 


        static int rcu_boost_cpu_callback(struct notifier_bloack *nb, 
                                        unsigned long action, void *hcpu) 
        {
                int this_cpu, cpu;
                rcu_boost_data *rbdp, *this_rbdp;

                switch (action) {
                case CPU_DEAD:
                        this_cpu = get_cpu();
                        cpu = (long)hcpu;
                        this_cpu = smp_processor_id();
                        rbdp = per_cpu(rcu_boost_dat, cpu);
                        this_rbdp = per_cpu(rcu_boost_dat, cpu);
                        /* 
                         *  Transfer all of rbdp's statistics to
                         *  this_rbdp here.
                         */     
                         put_cpu();
        
                        return NOTIFY_OK;
                }
        }


Won't this work in this case?


Thanks and Regards
gautham.

-- 
Gautham R Shenoy
Linux Technology Center
IBM India.
"Freedom comes with a price tag of responsibility, which is still a bargain,
because Freedom is priceless!"
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to