Re: [PATCH RFC] Priority boosting for preemptible RCU
From: Gautham R Shenoy
Date: Thu Aug 23 2007 - 00:27:01 EST
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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/