* [PATCH] get_offset_pit and do_timer_overflow vs IRQ locking
@ 2003-04-16 7:18 Alexander Atanasov
0 siblings, 0 replies; only message in thread
From: Alexander Atanasov @ 2003-04-16 7:18 UTC (permalink / raw)
To: linux-kernel
Hello,
Spin lock debuging got this on UP+preempt:
arch/i386/kernel/i8259.c:176:spin_lock(arch/i386/kernel/i8259.c:c03d4838)
already locked by include/asm-i386/mach-default/do_timer.h/50
include/asm-i386/mach-default/do_timer.h:56:
spin_unlock(arch/i386/kernel/i8259.c:c03d4838) not locked
arch/i386/kernel/i8259.c:176:spin_lock(arch/i386/kernel/i8259.c:c03d4838)
already locked by include/asm-i386/mach-default/do_timer.h/50
include/asm-i386/mach-default/do_timer.h:56:
spin_unlock(arch/i386/kernel/i8259.c:c03d4838) not locked
This due to do_timer_overflow expecting to be called with IRQs disabled,
the whole path used to do that until converted to xtime_lock, but
do_timer_overflow seems to be missed. Patch changes get_offset_pit to hold
i8253_lock while calling do_timer_overflow.
Is the hack with caching jiffies in get_offset_pit still needed,
according to comments there, it is not?
--
have fun,
alex
BK current:
===== arch/i386/kernel/timers/timer_pit.c 1.10 vs edited =====
--- 1.10/arch/i386/kernel/timers/timer_pit.c Mon Mar 31 19:03:54 2003
+++ edited/arch/i386/kernel/timers/timer_pit.c Wed Apr 16 09:27:03 2003
@@ -50,7 +50,7 @@
}
-/* This function must be called with interrupts disabled
+/* This function must be called with xtime_lock held.
* It was inspired by Steve McCanne's microtime-i386 for BSD. -- jrs
*
* However, the pc-audio speaker driver changes the divisor so that
@@ -90,7 +90,7 @@
static unsigned long jiffies_p = 0;
/*
- * cache volatile jiffies temporarily; we have IRQs turned off.
+ * cache volatile jiffies temporarily; we have xtime_lock.
*/
unsigned long jiffies_t;
@@ -109,14 +109,12 @@
count |= inb_p(0x40) << 8;
/* VIA686a test code... reset the latch if count > max + 1 */
- if (count > LATCH) {
- outb_p(0x34, 0x43);
- outb_p(LATCH & 0xff, 0x40);
- outb(LATCH >> 8, 0x40);
- count = LATCH - 1;
- }
-
- spin_unlock_irqrestore(&i8253_lock, flags);
+ if (count > LATCH) {
+ outb_p(0x34, 0x43);
+ outb_p(LATCH & 0xff, 0x40);
+ outb(LATCH >> 8, 0x40);
+ count = LATCH - 1;
+ }
/*
* avoiding timer inconsistencies (they are rare, but they happen)...
@@ -127,7 +125,6 @@
* (see c't 95/10 page 335 for Neptun bug.)
*/
-
if( jiffies_t == jiffies_p ) {
if( count > count_p ) {
/* the nutcase */
@@ -135,6 +132,8 @@
}
} else
jiffies_p = jiffies_t;
+
+ spin_unlock_irqrestore(&i8253_lock, flags);
count_p = count;
===== include/asm-i386/mach-default/do_timer.h 1.8 vs edited =====
--- 1.8/include/asm-i386/mach-default/do_timer.h Tue Feb 25 11:39:08 2003
+++ edited/include/asm-i386/mach-default/do_timer.h Tue Apr 15 23:47:39 2003
@@ -47,14 +47,12 @@
{
int i;
- spin_lock(&i8259A_lock);
/*
* This is tricky when I/O APICs are used;
* see do_timer_interrupt().
*/
i = inb(0x20);
- spin_unlock(&i8259A_lock);
-
+
/* assumption about timer being IRQ0 */
if (i & 0x01) {
/*
===== include/asm-i386/mach-pc9800/do_timer.h 1.1 vs edited =====
--- 1.1/include/asm-i386/mach-pc9800/do_timer.h Fri Mar 14 03:17:16 2003
+++ edited/include/asm-i386/mach-pc9800/do_timer.h Tue Apr 15 23:47:39 2003
@@ -47,14 +47,12 @@
{
int i;
- spin_lock(&i8259A_lock);
/*
* This is tricky when I/O APICs are used;
* see do_timer_interrupt().
*/
i = inb(0x00);
- spin_unlock(&i8259A_lock);
-
+
/* assumption about timer being IRQ0 */
if (i & 0x01) {
/*
===== include/asm-i386/mach-visws/do_timer.h 1.6 vs edited =====
--- 1.6/include/asm-i386/mach-visws/do_timer.h Wed Feb 19 04:58:56 2003
+++ edited/include/asm-i386/mach-visws/do_timer.h Tue Apr 15 23:47:39 2003
@@ -26,14 +26,12 @@
{
int i;
- spin_lock(&i8259A_lock);
/*
* This is tricky when I/O APICs are used;
* see do_timer_interrupt().
*/
i = inb(0x20);
- spin_unlock(&i8259A_lock);
-
+
/* assumption about timer being IRQ0 */
if (i & 0x01) {
/*
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2003-04-16 7:06 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-04-16 7:18 [PATCH] get_offset_pit and do_timer_overflow vs IRQ locking Alexander Atanasov
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).