[parisc-linux] Mysterious hangs with parisc
Kyle McMartin
kyle at mcmartin.ca
Thu Jul 6 12:34:09 MDT 2006
On Thu, Jul 06, 2006 at 06:22:40PM +0000, Joel Soete wrote:
> [<000000001011cc08>] smp_do_timer+0x70/0x80
You're running an SMP kernel.
time.c:
static inline unsigned long
gettimeoffset (void)
{
#ifndef CONFIG_SMP
/*
* FIXME: This won't work on smp because jiffies are updated by cpu 0.
* Once parisc-linux learns the cr16 difference between processors,
* this could be made to work.
*/
long last_tick;
long elapsed_cycles;
/* it_value is the intended time of the next tick */
last_tick = cpu_data[smp_processor_id()].it_value;
/* Subtract one tick and account for possible difference between
* when we expected the tick and when it actually arrived.
* (aka wall vs real)
*/
last_tick -= clocktick * (jiffies - wall_jiffies + 1);
elapsed_cycles = mfctl(16) - last_tick;
/* the precision of this math could be improved */
return elapsed_cycles / (PAGE0->mem_10msec / 10000);
#else
return 0;
#endif
}
Now let's look at the comment for James' change:
<quote>
Apparently gettimeoffset can return small negative values (usually in
the 100us range). If xtime.tv_nsec is accidentally less than this,
though (a fortunately unlikely event) it triggers the loop forever.
I've added a test and correct adjustment for this case. It has a
warning printk in there which I'd like to leave for the time being
just in case this problem implicates some other part of the kernel.
</quote>
I don't see 0 being a small negative value. ;-)
James' fix only applied to UP builds. :)
Cheers,
Kyle M.
More information about the parisc-linux
mailing list