Messages in this thread | | | From | Milton Miller <> | Subject | Re: [patch] reduce IPI noise due to /dev/cdrom open/close | Date | Tue, 4 Jul 2006 04:13:13 -0500 |
| |
On Jul 4, 2006, at 1:39 AM, Andrew Morton wrote:
> > I expect raw_smp_processor_id() is used here as a a microoptimisation - > avoid a might_sleep() which obviously will never trigger. > > But I think it'd be better to do just a single raw_smp_processor_id() > for this entire function: > > static void bh_lru_install(struct buffer_head *bh) > { > struct buffer_head *evictee = NULL; > struct bh_lru *lru; > + int cpu; > > check_irqs_on(); > bh_lru_lock(); > + cpu = raw_smp_processor_id(); > - lru = &__get_cpu_var(bh_lrus); > + lru = per_cpu(bh_lrus, cpu); >
The problem with this style is that it is an disoptimizatoin for architectures who hold their per-cpu data offset in a register, put the smp_processor_id in the per-cpu data (or similar) and per_cpu data offsets in a global lookup.
Do we need a new macro? (what is that gcc macro function syntax?)
#ifdef PER_CPU_IS_SLOW #define my_cpu_var(bh_lrus, cpu) \ ({ BUG_ON(cpu != smp_processor_id()); &__get_cpu_var(bh_lrus); }) #else #define my_cpu_var(bh_lrus, cpu) \ ({ BUG_ON(cpu != smp_processor_id()); per_cpu(bh_lrus, cpu); }) #endif
(and yes, the BUG_ON would be for debug checking).
milton
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |