Re: [patch] reduce IPI noise due to /dev/cdrom open/close

From: Milton Miller
Date: Tue Jul 04 2006 - 05:11:51 EST



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@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/