Re: [PATCH] x86: enable preemption in delay

From: Steven Rostedt
Date: Wed May 28 2008 - 09:01:32 EST




On Sun, 25 May 2008, Pavel Machek wrote:
> > + if (unlikely(cpu != smp_processor_id())) {
> > + if (loops <= TSC_MIGRATE_COUNT)
> > + break;
> > + cpu = smp_processor_id();
> > + rdtscl(bclock);
> > + loops -= TSC_MIGRATE_COUNT;
> > + } else {
> > + rdtscl(now);
> > + if ((now - bclock) >= loops)
> > + break;
> > + loops -= (now - bclock);
> > + bclock = now;
>
> What happens with different cpus running on different frequencies...?
> Cpufreq?

It's not even protected with the old code.

inline void __const_udelay(unsigned long xloops)
{
__delay(((xloops * HZ *
cpu_data(raw_smp_processor_id()).loops_per_jiffy) >> 32) + 1);
}

Here it calculates the loops_per_jiffy for the CPU and calls into __delay.
But it can easily be preempted here and the delay could run on another
CPU.

-- Steve

--
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/