All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kiszka <jan.kiszka@domain.hid>
To: adeos-main@gna.org
Cc: xenomai-core <xenomai@xenomai.org>
Subject: [Xenomai-core] [RFC] type-based spinlock op selection
Date: Wed, 06 Dec 2006 09:49:47 +0100	[thread overview]
Message-ID: <4576842B.1090203@domain.hid> (raw)


[-- Attachment #1.1: Type: text/plain, Size: 594 bytes --]

Hi,

reading through the I-pipe patch I noticed that there are quite a few
spin_lock->spin_lock_hw and similar conversions. Having the conversion
mechanism of the -rt patch in mind, I wrote the attached I-pipe cleanup
that applies a similar pattern on this issue. Gives more than 10k patch
size reduction for x86 and a bit more safety against minor variations of
the patched code. Still, review of the lock usages keeps on being
required as the lock user could assume running IRQs off while I-pipe may
not guarantee this.

The required patch for Xenomai is attached as well.

Jan

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: type-based-spinlocks.patch --]
[-- Type: text/x-patch; name="type-based-spinlocks.patch", Size: 45270 bytes --]

---
 arch/i386/kernel/apic.c                  |    4 -
 arch/i386/kernel/i8253.c                 |    6 -
 arch/i386/kernel/i8259.c                 |   24 +++----
 arch/i386/kernel/io_apic.c               |  100 +++++++++++++++----------------
 arch/i386/kernel/ipipe.c                 |   10 +--
 arch/i386/kernel/time.c                  |    4 -
 arch/i386/mach-visws/visws_apic.c        |   24 +++----
 arch/i386/mach-voyager/voyager_basic.c   |    8 +-
 drivers/ide/legacy/hd.c                  |    4 -
 drivers/input/gameport/gameport.c        |    4 -
 drivers/input/joystick/analog.c          |    4 -
 drivers/pci/htirq.c                      |   10 +--
 include/asm-i386/i8253.h                 |    2 
 include/asm-i386/i8259.h                 |    2 
 include/asm-i386/mach-default/do_timer.h |    4 -
 include/linux/ipipe.h                    |   40 ------------
 include/linux/spinlock.h                 |   88 +++++++++++++++++++++++----
 include/linux/spinlock_types.h           |   12 +++
 kernel/ipipe/core.c                      |   20 +++---
 kernel/ipipe/tracer.c                    |   14 ++--
 kernel/printk.c                          |   10 +--
 21 files changed, 216 insertions(+), 178 deletions(-)

Index: linux-2.6.19-ipipe/arch/i386/kernel/apic.c
===================================================================
--- linux-2.6.19-ipipe.orig/arch/i386/kernel/apic.c
+++ linux-2.6.19-ipipe/arch/i386/kernel/apic.c
@@ -929,13 +929,13 @@ static unsigned int __devinit get_8254_t
 
 	unsigned int count;
 
-	spin_lock_irqsave_hw(&i8253_lock, flags);
+	spin_lock_irqsave(&i8253_lock, flags);
 
 	outb_p(0x00, PIT_MODE);
 	count = inb_p(PIT_CH0);
 	count |= inb_p(PIT_CH0) << 8;
 
-	spin_unlock_irqrestore_hw(&i8253_lock, flags);
+	spin_unlock_irqrestore(&i8253_lock, flags);
 
 	return count;
 }
Index: linux-2.6.19-ipipe/arch/i386/kernel/i8253.c
===================================================================
--- linux-2.6.19-ipipe.orig/arch/i386/kernel/i8253.c
+++ linux-2.6.19-ipipe/arch/i386/kernel/i8253.c
@@ -16,20 +16,20 @@
 
 #include "io_ports.h"
 
-DEFINE_SPINLOCK(i8253_lock);
+IPIPE_DEFINE_SPINLOCK(i8253_lock);
 EXPORT_SYMBOL(i8253_lock);
 
 void setup_pit_timer(void)
 {
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&i8253_lock, flags);
+	spin_lock_irqsave(&i8253_lock, flags);
 	outb_p(0x34,PIT_MODE);		/* binary, mode 2, LSB/MSB, ch 0 */
 	udelay(10);
 	outb_p(LATCH & 0xff , PIT_CH0);	/* LSB */
 	udelay(10);
 	outb(LATCH >> 8 , PIT_CH0);	/* MSB */
-	spin_unlock_irqrestore_hw(&i8253_lock, flags);
+	spin_unlock_irqrestore(&i8253_lock, flags);
 }
 
 /*
Index: linux-2.6.19-ipipe/arch/i386/kernel/i8259.c
===================================================================
--- linux-2.6.19-ipipe.orig/arch/i386/kernel/i8259.c
+++ linux-2.6.19-ipipe/arch/i386/kernel/i8259.c
@@ -35,7 +35,7 @@
  */
 
 static int i8259A_auto_eoi;
-DEFINE_SPINLOCK(i8259A_lock);
+IPIPE_DEFINE_SPINLOCK(i8259A_lock);
 static void mask_and_ack_8259A(unsigned int);
 
 #ifdef CONFIG_IPIPE
@@ -87,14 +87,14 @@ void disable_8259A_irq(unsigned int irq)
 	unsigned int mask = 1 << irq;
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&i8259A_lock, flags);
+	spin_lock_irqsave(&i8259A_lock, flags);
 	ipipe_irq_lock(irq);
 	cached_irq_mask |= mask;
 	if (irq & 8)
 		outb(cached_slave_mask, PIC_SLAVE_IMR);
 	else
 		outb(cached_master_mask, PIC_MASTER_IMR);
-	spin_unlock_irqrestore_hw(&i8259A_lock, flags);
+	spin_unlock_irqrestore(&i8259A_lock, flags);
 }
 
 void enable_8259A_irq(unsigned int irq)
@@ -102,7 +102,7 @@ void enable_8259A_irq(unsigned int irq)
 	unsigned int mask = (1 << irq);
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&i8259A_lock, flags);
+	spin_lock_irqsave(&i8259A_lock, flags);
 	if (cached_irq_mask & mask) {
 		cached_irq_mask &= ~mask;
 		if (irq & 8)
@@ -111,7 +111,7 @@ void enable_8259A_irq(unsigned int irq)
 			outb(cached_master_mask, PIC_MASTER_IMR);
 		ipipe_irq_unlock(irq);
 	}
-	spin_unlock_irqrestore_hw(&i8259A_lock, flags);
+	spin_unlock_irqrestore(&i8259A_lock, flags);
 }
 
 int i8259A_irq_pending(unsigned int irq)
@@ -120,12 +120,12 @@ int i8259A_irq_pending(unsigned int irq)
 	unsigned long flags;
 	int ret;
 
-	spin_lock_irqsave_hw(&i8259A_lock, flags);
+	spin_lock_irqsave(&i8259A_lock, flags);
 	if (irq < 8)
 		ret = inb(PIC_MASTER_CMD) & mask;
 	else
 		ret = inb(PIC_SLAVE_CMD) & (mask >> 8);
-	spin_unlock_irqrestore_hw(&i8259A_lock, flags);
+	spin_unlock_irqrestore(&i8259A_lock, flags);
 
 	return ret;
 }
@@ -173,7 +173,7 @@ static void mask_and_ack_8259A(unsigned 
 	unsigned int irqmask = 1 << irq;
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&i8259A_lock, flags);
+	spin_lock_irqsave(&i8259A_lock, flags);
 	/*
 	 * Lightweight spurious IRQ detection. We do not want
 	 * to overdo spurious IRQ handling - it's usually a sign
@@ -196,7 +196,7 @@ static void mask_and_ack_8259A(unsigned 
 	    /* Fast timer ack -- don't mask (unless supposedly
 	      spurious) */
 	    outb(0x20,PIC_MASTER_CMD);
-	    spin_unlock_irqrestore_hw(&i8259A_lock, flags);
+	    spin_unlock_irqrestore(&i8259A_lock, flags);
 	    return;
 	}
 #endif /* CONFIG_IPIPE */
@@ -213,7 +213,7 @@ handle_real_irq:
 		outb(cached_master_mask, PIC_MASTER_IMR);
 		outb(0x60+irq,PIC_MASTER_CMD);	/* 'Specific EOI to master */
 	}
-	spin_unlock_irqrestore_hw(&i8259A_lock, flags);
+	spin_unlock_irqrestore(&i8259A_lock, flags);
 	return;
 
 spurious_8259A_irq:
@@ -316,7 +316,7 @@ void init_8259A(int auto_eoi)
 
 	i8259A_auto_eoi = auto_eoi;
 
-	spin_lock_irqsave_hw(&i8259A_lock, flags);
+	spin_lock_irqsave(&i8259A_lock, flags);
 
 	outb(0xff, PIC_MASTER_IMR);	/* mask all of 8259A-1 */
 	outb(0xff, PIC_SLAVE_IMR);	/* mask all of 8259A-2 */
@@ -350,7 +350,7 @@ void init_8259A(int auto_eoi)
 	outb(cached_master_mask, PIC_MASTER_IMR); /* restore master IRQ mask */
 	outb(cached_slave_mask, PIC_SLAVE_IMR);	  /* restore slave IRQ mask */
 
-	spin_unlock_irqrestore_hw(&i8259A_lock, flags);
+	spin_unlock_irqrestore(&i8259A_lock, flags);
 }
 
 /*
Index: linux-2.6.19-ipipe/arch/i386/kernel/io_apic.c
===================================================================
--- linux-2.6.19-ipipe.orig/arch/i386/kernel/io_apic.c
+++ linux-2.6.19-ipipe/arch/i386/kernel/io_apic.c
@@ -55,8 +55,8 @@ atomic_t irq_mis_count;
 /* Where if anywhere is the i8259 connect in external int mode */
 static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
 
-static DEFINE_SPINLOCK(ioapic_lock);
-static DEFINE_SPINLOCK(vector_lock);
+static IPIPE_DEFINE_SPINLOCK(ioapic_lock);
+static IPIPE_DEFINE_SPINLOCK(vector_lock);
 
 int timer_over_8254 __initdata = 1;
 
@@ -140,10 +140,10 @@ static struct IO_APIC_route_entry ioapic
 {
 	union entry_union eu;
 	unsigned long flags;
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	eu.w1 = io_apic_read(apic, 0x10 + 2 * pin);
 	eu.w2 = io_apic_read(apic, 0x11 + 2 * pin);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 	return eu.entry;
 }
 
@@ -158,10 +158,10 @@ static void ioapic_write_entry(int apic,
 	unsigned long flags;
 	union entry_union eu;
 	eu.entry = e;
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	io_apic_write(apic, 0x11 + 2*pin, eu.w2);
 	io_apic_write(apic, 0x10 + 2*pin, eu.w1);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
 /*
@@ -174,10 +174,10 @@ static void ioapic_mask_entry(int apic, 
 	unsigned long flags;
 	union entry_union eu = { .entry.mask = 1 };
 
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	io_apic_write(apic, 0x10 + 2*pin, eu.w1);
 	io_apic_write(apic, 0x11 + 2*pin, eu.w2);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
 /*
@@ -270,20 +270,20 @@ static void mask_IO_APIC_irq (unsigned i
 {
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	ipipe_irq_lock(irq);
 	__mask_IO_APIC_irq(irq);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
 static void unmask_IO_APIC_irq (unsigned int irq)
 {
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	__unmask_IO_APIC_irq(irq);
 	ipipe_irq_unlock(irq);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
 static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
@@ -328,7 +328,7 @@ static void set_ioapic_affinity_irq(unsi
 	apicid_value = cpu_mask_to_apicid(cpumask);
 	/* Prepare to do the io_apic_write */
 	apicid_value = apicid_value << 24;
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	for (;;) {
 		pin = entry->pin;
 		if (pin == -1)
@@ -339,7 +339,7 @@ static void set_ioapic_affinity_irq(unsi
 		entry = irq_2_pin + entry->next;
 	}
 	set_native_irq_info(irq, cpumask);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
 #if defined(CONFIG_IRQBALANCE)
@@ -1274,9 +1274,9 @@ static int assign_irq_vector(int irq)
 	unsigned long flags;
 	int vector;
 
-	spin_lock_irqsave_hw(&vector_lock, flags);
+	spin_lock_irqsave(&vector_lock, flags);
 	vector = __assign_irq_vector(irq);
-	spin_unlock_irqrestore_hw(&vector_lock, flags);
+	spin_unlock_irqrestore(&vector_lock, flags);
 
 	return vector;
 }
@@ -1366,9 +1366,9 @@ static void __init setup_IO_APIC_irqs(vo
 				disable_8259A_irq(irq);
 		}
 		ioapic_write_entry(apic, pin, entry);
-		spin_lock_irqsave_hw(&ioapic_lock, flags);
+		spin_lock_irqsave(&ioapic_lock, flags);
 		set_native_irq_info(irq, TARGET_CPUS);
-		spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+		spin_unlock_irqrestore(&ioapic_lock, flags);
 	}
 	}
 
@@ -1446,14 +1446,14 @@ void __init print_IO_APIC(void)
 
 	for (apic = 0; apic < nr_ioapics; apic++) {
 
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	reg_00.raw = io_apic_read(apic, 0);
 	reg_01.raw = io_apic_read(apic, 1);
 	if (reg_01.bits.version >= 0x10)
 		reg_02.raw = io_apic_read(apic, 2);
 	if (reg_01.bits.version >= 0x20)
 		reg_03.raw = io_apic_read(apic, 3);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 
 	printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].mpc_apicid);
 	printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw);
@@ -1683,7 +1683,7 @@ void /*__init*/ print_PIC(void)
 
 	printk(KERN_DEBUG "\nprinting PIC contents\n");
 
-	spin_lock_irqsave_hw(&i8259A_lock, flags);
+	spin_lock_irqsave(&i8259A_lock, flags);
 
 	v = inb(0xa1) << 8 | inb(0x21);
 	printk(KERN_DEBUG "... PIC  IMR: %04x\n", v);
@@ -1697,7 +1697,7 @@ void /*__init*/ print_PIC(void)
 	outb(0x0a,0xa0);
 	outb(0x0a,0x20);
 
-	spin_unlock_irqrestore_hw(&i8259A_lock, flags);
+	spin_unlock_irqrestore(&i8259A_lock, flags);
 
 	printk(KERN_DEBUG "... PIC  ISR: %04x\n", v);
 
@@ -1726,9 +1726,9 @@ static void __init enable_IO_APIC(void)
 	 * The number of IO-APIC IRQ registers (== #pins):
 	 */
 	for (apic = 0; apic < nr_ioapics; apic++) {
-		spin_lock_irqsave_hw(&ioapic_lock, flags);
+		spin_lock_irqsave(&ioapic_lock, flags);
 		reg_01.raw = io_apic_read(apic, 1);
-		spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+		spin_unlock_irqrestore(&ioapic_lock, flags);
 		nr_ioapic_registers[apic] = reg_01.bits.entries+1;
 	}
 	for(apic = 0; apic < nr_ioapics; apic++) {
@@ -1850,9 +1850,9 @@ static void __init setup_ioapic_ids_from
 	for (apic = 0; apic < nr_ioapics; apic++) {
 
 		/* Read the register 0 value */
-		spin_lock_irqsave_hw(&ioapic_lock, flags);
+		spin_lock_irqsave(&ioapic_lock, flags);
 		reg_00.raw = io_apic_read(apic, 0);
-		spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+		spin_unlock_irqrestore(&ioapic_lock, flags);
 		
 		old_id = mp_ioapics[apic].mpc_apicid;
 
@@ -1911,16 +1911,16 @@ static void __init setup_ioapic_ids_from
 			mp_ioapics[apic].mpc_apicid);
 
 		reg_00.bits.ID = mp_ioapics[apic].mpc_apicid;
-		spin_lock_irqsave_hw(&ioapic_lock, flags);
+		spin_lock_irqsave(&ioapic_lock, flags);
 		io_apic_write(apic, 0, reg_00.raw);
-		spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+		spin_unlock_irqrestore(&ioapic_lock, flags);
 
 		/*
 		 * Sanity check
 		 */
-		spin_lock_irqsave_hw(&ioapic_lock, flags);
+		spin_lock_irqsave(&ioapic_lock, flags);
 		reg_00.raw = io_apic_read(apic, 0);
-		spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+		spin_unlock_irqrestore(&ioapic_lock, flags);
 		if (reg_00.bits.ID != mp_ioapics[apic].mpc_apicid)
 			printk("could not set ID!\n");
 		else
@@ -1991,7 +1991,7 @@ static unsigned int startup_ioapic_irq(u
 	int was_pending = 0;
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	if (irq < 16) {
 		disable_8259A_irq(irq);
 		if (i8259A_irq_pending(irq))
@@ -1999,7 +1999,7 @@ static unsigned int startup_ioapic_irq(u
 	}
 	__unmask_IO_APIC_irq(irq);
 	ipipe_irq_unlock(irq);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 
 	return was_pending;
 }
@@ -2047,10 +2047,10 @@ static void ack_ioapic_quirk_irq(unsigne
 
 	if (!(v & (1 << (i & 0x1f)))) {
 		atomic_inc(&irq_mis_count);
-		spin_lock_hw(&ioapic_lock);
+		spin_lock(&ioapic_lock);
 		__mask_and_edge_IO_APIC_irq(irq);
 		__unmask_and_level_IO_APIC_irq(irq);
-		spin_unlock_hw(&ioapic_lock);
+		spin_unlock(&ioapic_lock);
 	}
 }
 
@@ -2143,22 +2143,22 @@ static void mask_lapic_irq (unsigned int
 {
 	unsigned long v, flags;
 
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	ipipe_irq_lock(irq);
 	v = apic_read(APIC_LVT0);
 	apic_write_around(APIC_LVT0, v | APIC_LVT_MASKED);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
 static void unmask_lapic_irq (unsigned int irq)
 {
 	unsigned long v, flags;
 
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	v = apic_read(APIC_LVT0);
 	apic_write_around(APIC_LVT0, v & ~APIC_LVT_MASKED);
 	ipipe_irq_unlock(irq);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 }
 
 #ifdef CONFIG_IPIPE
@@ -2475,13 +2475,13 @@ static int ioapic_resume(struct sys_devi
 	data = container_of(dev, struct sysfs_ioapic_data, dev);
 	entry = data->entry;
 
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	reg_00.raw = io_apic_read(dev->id, 0);
 	if (reg_00.bits.ID != mp_ioapics[dev->id].mpc_apicid) {
 		reg_00.bits.ID = mp_ioapics[dev->id].mpc_apicid;
 		io_apic_write(dev->id, 0, reg_00.raw);
 	}
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 	for (i = 0; i < nr_ioapic_registers[dev->id]; i ++)
 		ioapic_write_entry(dev->id, i, entry[i]);
 
@@ -2823,9 +2823,9 @@ int __init io_apic_get_unique_id (int io
 	if (physids_empty(apic_id_map))
 		apic_id_map = ioapic_phys_id_map(phys_cpu_present_map);
 
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	reg_00.raw = io_apic_read(ioapic, 0);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 
 	if (apic_id >= get_physical_broadcast()) {
 		printk(KERN_WARNING "IOAPIC[%d]: Invalid apic_id %d, trying "
@@ -2859,10 +2859,10 @@ int __init io_apic_get_unique_id (int io
 	if (reg_00.bits.ID != apic_id) {
 		reg_00.bits.ID = apic_id;
 
-		spin_lock_irqsave_hw(&ioapic_lock, flags);
+		spin_lock_irqsave(&ioapic_lock, flags);
 		io_apic_write(ioapic, 0, reg_00.raw);
 		reg_00.raw = io_apic_read(ioapic, 0);
-		spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+		spin_unlock_irqrestore(&ioapic_lock, flags);
 
 		/* Sanity check */
 		if (reg_00.bits.ID != apic_id) {
@@ -2883,9 +2883,9 @@ int __init io_apic_get_version (int ioap
 	union IO_APIC_reg_01	reg_01;
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	reg_01.raw = io_apic_read(ioapic, 1);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 
 	return reg_01.bits.version;
 }
@@ -2896,9 +2896,9 @@ int __init io_apic_get_redir_entries (in
 	union IO_APIC_reg_01	reg_01;
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	reg_01.raw = io_apic_read(ioapic, 1);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 
 	return reg_01.bits.entries;
 }
@@ -2949,9 +2949,9 @@ int io_apic_set_pci_routing (int ioapic,
 		disable_8259A_irq(irq);
 
 	ioapic_write_entry(ioapic, pin, entry);
-	spin_lock_irqsave_hw(&ioapic_lock, flags);
+	spin_lock_irqsave(&ioapic_lock, flags);
 	set_native_irq_info(irq, TARGET_CPUS);
-	spin_unlock_irqrestore_hw(&ioapic_lock, flags);
+	spin_unlock_irqrestore(&ioapic_lock, flags);
 
 	return 0;
 }
Index: linux-2.6.19-ipipe/arch/i386/kernel/time.c
===================================================================
--- linux-2.6.19-ipipe.orig/arch/i386/kernel/time.c
+++ linux-2.6.19-ipipe/arch/i386/kernel/time.c
@@ -181,11 +181,11 @@ irqreturn_t timer_interrupt(int irq, voi
 		 * on an 82489DX-based system.
 		 */
 		unsigned long flags;
-		spin_lock_irqsave_hw_cond(&i8259A_lock,flags);
+		spin_lock_irqsave_cond(&i8259A_lock,flags);
 		outb(0x0c, PIC_MASTER_OCW3);
 		/* Ack the IRQ; AEOI will end it automatically. */
 		inb(PIC_MASTER_POLL);
-		spin_unlock_irqrestore_hw_cond(&i8259A_lock,flags);
+		spin_unlock_irqrestore_cond(&i8259A_lock,flags);
 	}
 #endif
 
Index: linux-2.6.19-ipipe/include/asm-i386/mach-default/do_timer.h
===================================================================
--- linux-2.6.19-ipipe.orig/include/asm-i386/mach-default/do_timer.h
+++ linux-2.6.19-ipipe/include/asm-i386/mach-default/do_timer.h
@@ -56,13 +56,13 @@ static inline int do_timer_overflow(int 
 	int i;
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&i8259A_lock, flags);
+	spin_lock_irqsave(&i8259A_lock, flags);
 	/*
 	 * This is tricky when I/O APICs are used;
 	 * see do_timer_interrupt().
 	 */
 	i = inb(0x20);
-	spin_unlock_irqrestore_hw(&i8259A_lock, flags);
+	spin_unlock_irqrestore(&i8259A_lock, flags);
 	
 	/* assumption about timer being IRQ0 */
 	if (i & 0x01) {
Index: linux-2.6.19-ipipe/include/linux/ipipe.h
===================================================================
--- linux-2.6.19-ipipe.orig/include/linux/ipipe.h
+++ linux-2.6.19-ipipe/include/linux/ipipe.h
@@ -229,9 +229,6 @@ do { \
 	} \
 } while(0)
 
-#define spin_lock_hw(x)		__raw_spin_lock(&(x)->raw_lock)
-#define spin_trylock_hw(x)		__raw_spin_trylock(&(x)->raw_lock)
-#define spin_unlock_hw(x)		__raw_spin_unlock(&(x)->raw_lock)
 #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
 #define write_lock_hw(x)		__raw_write_lock(&(x)->raw_lock)
 #define write_trylock_hw(x)		__raw_write_trylock(&(x)->raw_lock)
@@ -248,35 +245,9 @@ do { \
 #define read_unlock_hw(lock)		do { (void)(lock); } while (0)
 #endif /* CONFIG_SMP || CONFIG_DEBUG_SPINLOCK */
 
-typedef spinlock_t			ipipe_spinlock_t;
 typedef rwlock_t			ipipe_rwlock_t;
-#define IPIPE_SPIN_LOCK_UNLOCKED	SPIN_LOCK_UNLOCKED
 #define IPIPE_RW_LOCK_UNLOCKED		RW_LOCK_UNLOCKED
 
-#define spin_lock_irqsave_hw(x,flags)		\
-do {						\
-	local_irq_save_hw(flags);		\
-	spin_lock_hw(x);			\
-} while (0)
-
-#define spin_unlock_irqrestore_hw(x,flags)	\
-do {						\
-	spin_unlock_hw(x);			\
-	local_irq_restore_hw(flags);		\
-} while (0)
-
-#define spin_lock_irq_hw(x)			\
-do {						\
-	local_irq_disable_hw();			\
-	spin_lock_hw(x);			\
-} while (0)
-
-#define spin_unlock_irq_hw(x)			\
-do {						\
-	spin_unlock_hw(x);			\
-	local_irq_enable_hw();			\
-} while (0)
-
 #define read_lock_irqsave_hw(lock, flags)	\
 do {						\
 	local_irq_save_hw(flags);		\
@@ -688,8 +659,6 @@ void fastcall *ipipe_get_ptd(int key);
 			local_irq_disable_hw();		\
 	} while(0)
 
-#define spin_lock_irqsave_hw_cond(lock,flags)	spin_lock_irqsave_hw(lock,flags)
-#define spin_unlock_irqrestore_hw_cond(lock,flags)	spin_unlock_irqrestore_hw(lock,flags)
 #define smp_processor_id_hw()				ipipe_processor_id()
 
 #define ipipe_irq_lock(irq)						\
@@ -720,19 +689,10 @@ void fastcall *ipipe_get_ptd(int key);
 #define ipipe_trap_notify(t,r)	0
 #define ipipe_init_proc()		do { } while(0)
 
-#define spin_lock_hw(lock)			spin_lock(lock)
-#define spin_unlock_hw(lock)			spin_unlock(lock)
-#define spin_lock_irq_hw(lock)		spin_lock_irq(lock)
-#define spin_unlock_irq_hw(lock)		spin_unlock_irq(lock)
-#define spin_lock_irqsave_hw(lock,flags)	spin_lock_irqsave(lock, flags)
-#define spin_unlock_irqrestore_hw(lock,flags)	spin_unlock_irqrestore(lock, flags)
-
 #define local_irq_enable_hw_cond()		do { } while(0)
 #define local_irq_disable_hw_cond()		do { } while(0)
 #define local_irq_save_hw_cond(flags)	do { (void)(flags); } while(0)
 #define local_irq_restore_hw_cond(flags)	do { } while(0)
-#define spin_lock_irqsave_hw_cond(lock,flags)	do { (void)(flags); spin_lock(lock); } while(0)
-#define spin_unlock_irqrestore_hw_cond(lock,flags)	spin_unlock(lock)
 #define smp_processor_id_hw()			smp_processor_id()
 
 #define ipipe_irq_lock(irq)		do { } while(0)
Index: linux-2.6.19-ipipe/include/linux/spinlock.h
===================================================================
--- linux-2.6.19-ipipe.orig/include/linux/spinlock.h
+++ linux-2.6.19-ipipe/include/linux/spinlock.h
@@ -171,7 +171,15 @@ do {								\
 #define read_trylock(lock)		__cond_lock(lock, _read_trylock(lock))
 #define write_trylock(lock)		__cond_lock(lock, _write_trylock(lock))
 
-#define spin_lock(lock)			_spin_lock(lock)
+#define __IS_LOCKTYPE(lock, type) \
+	__builtin_types_compatible_p(typeof(lock), type *)
+
+#define spin_lock(lock) do { \
+	if (__IS_LOCKTYPE(lock, ipipe_spinlock_t)) \
+		__raw_spin_lock(&((ipipe_spinlock_t *)lock)->__raw_lock); \
+	else \
+		_spin_lock(lock); \
+} while (0)
 
 #ifdef CONFIG_DEBUG_LOCK_ALLOC
 # define spin_lock_nested(lock, subclass) _spin_lock_nested(lock, subclass)
@@ -184,7 +192,13 @@ do {								\
 
 #if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
 
-#define spin_lock_irqsave(lock, flags)	flags = _spin_lock_irqsave(lock)
+#define spin_lock_irqsave(lock, flags) do { \
+	if (__IS_LOCKTYPE(lock, ipipe_spinlock_t)) { \
+		local_irq_save_hw(flags); \
+		__raw_spin_lock(&((ipipe_spinlock_t *)lock)->__raw_lock); \
+	} else \
+		flags = _spin_lock_irqsave(lock); \
+} while (0)
 #define read_lock_irqsave(lock, flags)	flags = _read_lock_irqsave(lock)
 #define write_lock_irqsave(lock, flags)	flags = _write_lock_irqsave(lock)
 
@@ -198,7 +212,13 @@ do {								\
 
 #else
 
-#define spin_lock_irqsave(lock, flags)	_spin_lock_irqsave(lock, flags)
+#define spin_lock_irqsave(lock, flags) do { \
+	if (__IS_LOCKTYPE(lock, ipipe_spinlock_t)) { \
+		local_irq_save_hw(flags); \
+		__raw_spin_lock(&((ipipe_spinlock_t *)lock)->__raw_lock); \
+	} else \
+		_spin_lock_irqsave(lock, flags); \
+} while (0)
 #define read_lock_irqsave(lock, flags)	_read_lock_irqsave(lock, flags)
 #define write_lock_irqsave(lock, flags)	_write_lock_irqsave(lock, flags)
 #define spin_lock_irqsave_nested(lock, flags, subclass)	\
@@ -206,7 +226,13 @@ do {								\
 
 #endif
 
-#define spin_lock_irq(lock)		_spin_lock_irq(lock)
+#define spin_lock_irq(lock) do { \
+	if (__IS_LOCKTYPE(lock, ipipe_spinlock_t)) { \
+		local_irq_disable_hw(); \
+		__raw_spin_lock(&((ipipe_spinlock_t *)lock)->__raw_lock); \
+	} else \
+		_spin_lock_irq(lock); \
+} while (0)
 #define spin_lock_bh(lock)		_spin_lock_bh(lock)
 
 #define read_lock_irq(lock)		_read_lock_irq(lock)
@@ -220,26 +246,54 @@ do {								\
  */
 #if defined(CONFIG_DEBUG_SPINLOCK) || defined(CONFIG_PREEMPT) || \
 	!defined(CONFIG_SMP)
-# define spin_unlock(lock)		_spin_unlock(lock)
+#define spin_unlock(lock) do { \
+	if (__IS_LOCKTYPE(lock, ipipe_spinlock_t)) \
+		__raw_spin_unlock(&((ipipe_spinlock_t *)lock)->__raw_lock); \
+	else \
+		_spin_unlock(lock); \
+} while (0)
 # define read_unlock(lock)		_read_unlock(lock)
 # define write_unlock(lock)		_write_unlock(lock)
-# define spin_unlock_irq(lock)		_spin_unlock_irq(lock)
+# define spin_unlock_irq(lock) do { \
+	if (__IS_LOCKTYPE(lock, ipipe_spinlock_t)) { \
+		__raw_spin_unlock(&((ipipe_spinlock_t *)lock)->__raw_lock); \
+		local_irq_enable_hw(); \
+	} else \
+		_spin_unlock_irq(lock); \
+} while (0)
 # define read_unlock_irq(lock)		_read_unlock_irq(lock)
 # define write_unlock_irq(lock)		_write_unlock_irq(lock)
 #else
-# define spin_unlock(lock)		__raw_spin_unlock(&(lock)->raw_lock)
+# define spin_unlock(lock) do { \
+	if (__IS_LOCKTYPE(lock, ipipe_spinlock_t)) \
+		__raw_spin_unlock(&((ipipe_spinlock_t *)lock)->__raw_lock); \
+	else \
+		__raw_spin_unlock(&(lock)->raw_lock); \
+} while (0)
 # define read_unlock(lock)		__raw_read_unlock(&(lock)->raw_lock)
 # define write_unlock(lock)		__raw_write_unlock(&(lock)->raw_lock)
-# define spin_unlock_irq(lock) \
-    do { __raw_spin_unlock(&(lock)->raw_lock); local_irq_enable(); } while (0)
+# define spin_unlock_irq(lock) do { \
+	if (__IS_LOCKTYPE(lock, ipipe_spinlock_t)) { \
+		__raw_spin_unlock(&((ipipe_spinlock_t *)lock)->__raw_lock); \
+		local_irq_enable_hw(); \
+	} else { \
+		__raw_spin_unlock(&(lock)->raw_lock); \
+		local_irq_enable(); \
+	} \
+} while (0)
 # define read_unlock_irq(lock) \
     do { __raw_read_unlock(&(lock)->raw_lock); local_irq_enable(); } while (0)
 # define write_unlock_irq(lock) \
     do { __raw_write_unlock(&(lock)->raw_lock); local_irq_enable(); } while (0)
 #endif
 
-#define spin_unlock_irqrestore(lock, flags) \
-					_spin_unlock_irqrestore(lock, flags)
+#define spin_unlock_irqrestore(lock, flags) do { \
+	if (__IS_LOCKTYPE(lock, ipipe_spinlock_t)) { \
+		__raw_spin_unlock(&((ipipe_spinlock_t *)lock)->__raw_lock); \
+		local_irq_restore_hw(flags); \
+	} else \
+		_spin_unlock_irqrestore(lock, flags); \
+} while (0)
 #define spin_unlock_bh(lock)		_spin_unlock_bh(lock)
 
 #define read_unlock_irqrestore(lock, flags) \
@@ -286,4 +340,16 @@ extern int _atomic_dec_and_lock(atomic_t
  */
 #define spin_can_lock(lock)	(!spin_is_locked(lock))
 
+#ifdef CONFIG_IPIPE
+#define spin_lock_irqsave_cond(lock, flags) \
+	spin_lock_irqsave(lock,flags)
+#define spin_unlock_irqrestore_cond(lock, flags) \
+	spin_unlock_irqrestore(lock,flags)
+#else
+#define spin_lock_irqsave_cond(lock, flags) \
+	do { (void)(flags); spin_lock(lock); } while(0)
+#define spin_unlock_irqrestore_cond(lock, flags) \
+	spin_unlock(lock)
+#endif
+
 #endif /* __LINUX_SPINLOCK_H */
Index: linux-2.6.19-ipipe/include/linux/spinlock_types.h
===================================================================
--- linux-2.6.19-ipipe.orig/include/linux/spinlock_types.h
+++ linux-2.6.19-ipipe/include/linux/spinlock_types.h
@@ -31,6 +31,10 @@ typedef struct {
 #endif
 } spinlock_t;
 
+typedef struct {
+	raw_spinlock_t __raw_lock;
+} ipipe_spinlock_t;
+
 #define SPINLOCK_MAGIC		0xdead4ead
 
 typedef struct {
@@ -86,9 +90,17 @@ typedef struct {
 #endif
 
 #define SPIN_LOCK_UNLOCKED	__SPIN_LOCK_UNLOCKED(old_style_spin_init)
+#define IPIPE_SPIN_LOCK_UNLOCKED					\
+	(ipipe_spinlock_t) {	.__raw_lock = __RAW_SPIN_LOCK_UNLOCKED }
 #define RW_LOCK_UNLOCKED	__RW_LOCK_UNLOCKED(old_style_rw_init)
 
 #define DEFINE_SPINLOCK(x)	spinlock_t x = __SPIN_LOCK_UNLOCKED(x)
 #define DEFINE_RWLOCK(x)	rwlock_t x = __RW_LOCK_UNLOCKED(x)
 
+#ifdef CONFIG_IPIPE
+#define IPIPE_DEFINE_SPINLOCK(x) ipipe_spinlock_t x = IPIPE_SPIN_LOCK_UNLOCKED
+#else
+#define IPIPE_DEFINE_SPINLOCK(x) DEFINE_SPINLOCK(x)
+#endif
+
 #endif /* __LINUX_SPINLOCK_TYPES_H */
Index: linux-2.6.19-ipipe/arch/i386/mach-visws/visws_apic.c
===================================================================
--- linux-2.6.19-ipipe.orig/arch/i386/mach-visws/visws_apic.c
+++ linux-2.6.19-ipipe/arch/i386/mach-visws/visws_apic.c
@@ -29,7 +29,7 @@
 #include "irq_vectors.h"
 
 
-static DEFINE_SPINLOCK(cobalt_lock);
+static IPIPE_DEFINE_SPINLOCK(cobalt_lock);
 
 /*
  * Set the given Cobalt APIC Redirection Table entry to point
@@ -94,11 +94,11 @@ static unsigned int startup_cobalt_irq(u
 {
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&cobalt_lock, flags);
+	spin_lock_irqsave(&cobalt_lock, flags);
 	if ((irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS | IRQ_WAITING)))
 		irq_desc[irq].status &= ~(IRQ_DISABLED | IRQ_INPROGRESS | IRQ_WAITING);
 	enable_cobalt_irq(irq);
-	spin_unlock_irqrestore_hw(&cobalt_lock, flags);
+	spin_unlock_irqrestore(&cobalt_lock, flags);
 	return 0;
 }
 
@@ -106,20 +106,20 @@ static void ack_cobalt_irq(unsigned int 
 {
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&cobalt_lock, flags);
+	spin_lock_irqsave(&cobalt_lock, flags);
 	disable_cobalt_irq(irq);
 	apic_write(APIC_EOI, APIC_EIO_ACK);
-	spin_unlock_irqrestore_hw(&cobalt_lock, flags);
+	spin_unlock_irqrestore(&cobalt_lock, flags);
 }
 
 static void end_cobalt_irq(unsigned int irq)
 {
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&cobalt_lock, flags);
+	spin_lock_irqsave(&cobalt_lock, flags);
 	if (!(irq_desc[irq].status & (IRQ_DISABLED | IRQ_INPROGRESS)))
 		enable_cobalt_irq(irq);
-	spin_unlock_irqrestore_hw(&cobalt_lock, flags);
+	spin_unlock_irqrestore(&cobalt_lock, flags);
 }
 
 #ifdef CONFIG_IPIPE
@@ -174,9 +174,9 @@ static void end_piix4_master_irq(unsigne
 {
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&cobalt_lock, flags);
+	spin_lock_irqsave(&cobalt_lock, flags);
 	enable_cobalt_irq(irq);
-	spin_unlock_irqrestore_hw(&cobalt_lock, flags);
+	spin_unlock_irqrestore(&cobalt_lock, flags);
 }
 
 static struct irq_chip piix4_master_irq_type = {
@@ -216,7 +216,7 @@ static irqreturn_t piix4_master_intr(int
 	irq_desc_t *desc;
 	unsigned long flags;
 
-	spin_lock_irqsave_hw(&i8259A_lock, flags);
+	spin_lock_irqsave(&i8259A_lock, flags);
 
 	/* Find out what's interrupting in the PIIX4 master 8259 */
 	outb(0x0c, 0x20);		/* OCW3 Poll command */
@@ -253,7 +253,7 @@ static irqreturn_t piix4_master_intr(int
 		outb(0x60 + realirq, 0x20);
 	}
 
-	spin_unlock_irqrestore_hw(&i8259A_lock, flags);
+	spin_unlock_irqrestore(&i8259A_lock, flags);
 
 	desc = irq_desc + realirq;
 
@@ -271,7 +271,7 @@ static irqreturn_t piix4_master_intr(int
 	return IRQ_HANDLED;
 
 out_unlock:
-	spin_unlock_irqrestore_hw(&i8259A_lock, flags);
+	spin_unlock_irqrestore(&i8259A_lock, flags);
 	return IRQ_NONE;
 }
 
Index: linux-2.6.19-ipipe/arch/i386/mach-voyager/voyager_basic.c
===================================================================
--- linux-2.6.19-ipipe.orig/arch/i386/mach-voyager/voyager_basic.c
+++ linux-2.6.19-ipipe/arch/i386/mach-voyager/voyager_basic.c
@@ -185,20 +185,20 @@ voyager_timer_interrupt(void)
 		 * pointy.  */
 		__u16 val;
 
-		spin_lock_irqsave_hw(&i8253_lock);
+		spin_lock_irqsave(&i8253_lock);
 		
 		outb_p(0x00, 0x43);
 		val = inb_p(0x40);
 		val |= inb(0x40) << 8;
-		spin_unlock_irqrestore_hw(&i8253_lock);
+		spin_unlock_irqrestore(&i8253_lock);
 
 		if(val > LATCH) {
 			printk("\nVOYAGER: countdown timer value too high (%d), resetting\n\n", val);
-			spin_lock_irqsave_hw(&i8253_lock);
+			spin_lock_irqsave(&i8253_lock);
 			outb(0x34,0x43);
 			outb_p(LATCH & 0xff , 0x40);	/* LSB */
 			outb(LATCH >> 8 , 0x40);	/* MSB */
-			spin_unlock_irqrestore_hw(&i8253_lock);
+			spin_unlock_irqrestore(&i8253_lock);
 		}
 	}
 #ifdef CONFIG_SMP
Index: linux-2.6.19-ipipe/drivers/ide/legacy/hd.c
===================================================================
--- linux-2.6.19-ipipe.orig/drivers/ide/legacy/hd.c
+++ linux-2.6.19-ipipe/drivers/ide/legacy/hd.c
@@ -166,12 +166,12 @@ unsigned long read_timer(void)
 	unsigned long t, flags;
 	int i;
 
-	spin_lock_irqsave_hw(&i8253_lock, flags);
+	spin_lock_irqsave(&i8253_lock, flags);
 	t = jiffies * 11932;
     	outb_p(0, 0x43);
 	i = inb_p(0x40);
 	i |= inb(0x40) << 8;
-	spin_unlock_irqrestore_hw(&i8253_lock, flags);
+	spin_unlock_irqrestore(&i8253_lock, flags);
 	return(t - i);
 }
 #endif
Index: linux-2.6.19-ipipe/drivers/input/gameport/gameport.c
===================================================================
--- linux-2.6.19-ipipe.orig/drivers/input/gameport/gameport.c
+++ linux-2.6.19-ipipe/drivers/input/gameport/gameport.c
@@ -71,11 +71,11 @@ static unsigned int get_time_pit(void)
 	unsigned long flags;
 	unsigned int count;
 
-	spin_lock_irqsave_hw(&i8253_lock, flags);
+	spin_lock_irqsave(&i8253_lock, flags);
 	outb_p(0x00, 0x43);
 	count = inb_p(0x40);
 	count |= inb_p(0x40) << 8;
-	spin_unlock_irqrestore_hw(&i8253_lock, flags);
+	spin_unlock_irqrestore(&i8253_lock, flags);
 
 	return count;
 }
Index: linux-2.6.19-ipipe/drivers/input/joystick/analog.c
===================================================================
--- linux-2.6.19-ipipe.orig/drivers/input/joystick/analog.c
+++ linux-2.6.19-ipipe/drivers/input/joystick/analog.c
@@ -151,11 +151,11 @@ static unsigned int get_time_pit(void)
         unsigned long flags;
         unsigned int count;
 
-        spin_lock_irqsave_hw(&i8253_lock, flags);
+        spin_lock_irqsave(&i8253_lock, flags);
         outb_p(0x00, 0x43);
         count = inb_p(0x40);
         count |= inb_p(0x40) << 8;
-        spin_unlock_irqrestore_hw(&i8253_lock, flags);
+        spin_unlock_irqrestore(&i8253_lock, flags);
 
         return count;
 }
Index: linux-2.6.19-ipipe/drivers/pci/htirq.c
===================================================================
--- linux-2.6.19-ipipe.orig/drivers/pci/htirq.c
+++ linux-2.6.19-ipipe/drivers/pci/htirq.c
@@ -21,7 +21,7 @@
  * With multiple simultaneous hypertransport irq devices it might pay
  * to make this more fine grained.  But start with simple, stupid, and correct.
  */
-static DEFINE_SPINLOCK(ht_irq_lock);
+static IPIPE_DEFINE_SPINLOCK(ht_irq_lock);
 
 struct ht_irq_cfg {
 	struct pci_dev *dev;
@@ -37,7 +37,7 @@ void write_ht_irq_msg(unsigned int irq, 
 {
 	struct ht_irq_cfg *cfg = get_irq_data(irq);
 	unsigned long flags;
-	spin_lock_irqsave_hw(&ht_irq_lock, flags);
+	spin_lock_irqsave(&ht_irq_lock, flags);
 	if (cfg->msg.address_lo != msg->address_lo) {
 		pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx);
 		pci_write_config_dword(cfg->dev, cfg->pos + 4, msg->address_lo);
@@ -48,7 +48,7 @@ void write_ht_irq_msg(unsigned int irq, 
 	}
 	if (cfg->update)
 		cfg->update(cfg->dev, irq, msg);
-	spin_unlock_irqrestore_hw(&ht_irq_lock, flags);
+	spin_unlock_irqrestore(&ht_irq_lock, flags);
 	cfg->msg = *msg;
 }
 
@@ -111,10 +111,10 @@ int __ht_create_irq(struct pci_dev *dev,
 		return -EINVAL;
 
 	/* Verify the idx I want to use is in range */
-	spin_lock_irqsave_hw(&ht_irq_lock, flags);
+	spin_lock_irqsave(&ht_irq_lock, flags);
 	pci_write_config_byte(dev, pos + 2, 1);
 	pci_read_config_dword(dev, pos + 4, &data);
-	spin_unlock_irqrestore_hw(&ht_irq_lock, flags);
+	spin_unlock_irqrestore(&ht_irq_lock, flags);
 
 	max_irq = (data >> 16) & 0xff;
 	if ( idx > max_irq)
Index: linux-2.6.19-ipipe/include/asm-i386/i8253.h
===================================================================
--- linux-2.6.19-ipipe.orig/include/asm-i386/i8253.h
+++ linux-2.6.19-ipipe/include/asm-i386/i8253.h
@@ -1,6 +1,6 @@
 #ifndef __ASM_I8253_H__
 #define __ASM_I8253_H__
 
-extern spinlock_t i8253_lock;
+extern ipipe_spinlock_t i8253_lock;
 
 #endif	/* __ASM_I8253_H__ */
Index: linux-2.6.19-ipipe/include/asm-i386/i8259.h
===================================================================
--- linux-2.6.19-ipipe.orig/include/asm-i386/i8259.h
+++ linux-2.6.19-ipipe/include/asm-i386/i8259.h
@@ -7,7 +7,7 @@ extern unsigned int cached_irq_mask;
 #define cached_master_mask	(__byte(0, cached_irq_mask))
 #define cached_slave_mask	(__byte(1, cached_irq_mask))
 
-extern spinlock_t i8259A_lock;
+extern ipipe_spinlock_t i8259A_lock;
 
 extern void init_8259A(int auto_eoi);
 extern void enable_8259A_irq(unsigned int irq);
Index: linux-2.6.19-ipipe/kernel/ipipe/core.c
===================================================================
--- linux-2.6.19-ipipe.orig/kernel/ipipe/core.c
+++ linux-2.6.19-ipipe/kernel/ipipe/core.c
@@ -460,7 +460,7 @@ unsigned ipipe_alloc_virq(void)
 	unsigned long flags, irq = 0;
 	int ipos;
 
-	spin_lock_irqsave_hw(&__ipipe_pipelock, flags);
+	spin_lock_irqsave(&__ipipe_pipelock, flags);
 
 	if (__ipipe_virtual_irq_map != ~0) {
 		ipos = ffz(__ipipe_virtual_irq_map);
@@ -468,7 +468,7 @@ unsigned ipipe_alloc_virq(void)
 		irq = ipos + IPIPE_VIRQ_BASE;
 	}
 
-	spin_unlock_irqrestore_hw(&__ipipe_pipelock, flags);
+	spin_unlock_irqrestore(&__ipipe_pipelock, flags);
 
 	return irq;
 }
@@ -496,7 +496,7 @@ int ipipe_virtualize_irq(struct ipipe_do
 		/* Silently unwire interrupts for non-heading domains. */
 		modemask &= ~IPIPE_WIRED_MASK;
 
-	spin_lock_irqsave_hw(&__ipipe_pipelock, flags);
+	spin_lock_irqsave(&__ipipe_pipelock, flags);
 
 	if (handler != NULL) {
 
@@ -565,7 +565,7 @@ int ipipe_virtualize_irq(struct ipipe_do
 
       unlock_and_exit:
 
-	spin_unlock_irqrestore_hw(&__ipipe_pipelock, flags);
+	spin_unlock_irqrestore(&__ipipe_pipelock, flags);
 
 	return err;
 }
@@ -595,7 +595,7 @@ int ipipe_control_irq(unsigned irq, unsi
 	if ((clrmask & (IPIPE_HANDLE_MASK | IPIPE_STICKY_MASK)) != 0)	/* If one goes, both go. */
 		clrmask |= (IPIPE_HANDLE_MASK | IPIPE_STICKY_MASK);
 
-	spin_lock_irqsave_hw(&__ipipe_pipelock, flags);
+	spin_lock_irqsave(&__ipipe_pipelock, flags);
 
 	ipd->irqs[irq].control &= ~clrmask;
 	ipd->irqs[irq].control |= setmask;
@@ -605,7 +605,7 @@ int ipipe_control_irq(unsigned irq, unsi
 	else if ((clrmask & IPIPE_ENABLE_MASK) != 0)
 		__ipipe_disable_irq(irq);
 
-	spin_unlock_irqrestore_hw(&__ipipe_pipelock, flags);
+	spin_unlock_irqrestore(&__ipipe_pipelock, flags);
 
 	return 0;
 }
@@ -1163,7 +1163,7 @@ int ipipe_alloc_ptdkey (void)
 	unsigned long flags;
 	int key = -1;
 
-	spin_lock_irqsave_hw(&__ipipe_pipelock,flags);
+	spin_lock_irqsave(&__ipipe_pipelock,flags);
 
 	if (__ipipe_ptd_key_count < IPIPE_ROOT_NPTDKEYS) {
 		key = ffz(__ipipe_ptd_key_map);
@@ -1171,7 +1171,7 @@ int ipipe_alloc_ptdkey (void)
 		__ipipe_ptd_key_count++;
 	}
 
-	spin_unlock_irqrestore_hw(&__ipipe_pipelock,flags);
+	spin_unlock_irqrestore(&__ipipe_pipelock,flags);
 
 	return key;
 }
@@ -1183,12 +1183,12 @@ int ipipe_free_ptdkey (int key)
 	if (key < 0 || key >= IPIPE_ROOT_NPTDKEYS)
 		return -EINVAL;
 
-	spin_lock_irqsave_hw(&__ipipe_pipelock,flags);
+	spin_lock_irqsave(&__ipipe_pipelock,flags);
 
 	if (test_and_clear_bit(key,&__ipipe_ptd_key_map))
 		__ipipe_ptd_key_count--;
 
-	spin_unlock_irqrestore_hw(&__ipipe_pipelock,flags);
+	spin_unlock_irqrestore(&__ipipe_pipelock,flags);
 
 	return 0;
 }
Index: linux-2.6.19-ipipe/kernel/ipipe/tracer.c
===================================================================
--- linux-2.6.19-ipipe.orig/kernel/ipipe/tracer.c
+++ linux-2.6.19-ipipe/kernel/ipipe/tracer.c
@@ -124,7 +124,7 @@ static int max_path[NR_CPUS] =
 	{ [0 ... NR_CPUS-1] = IPIPE_DEFAULT_MAX };
 static int frozen_path[NR_CPUS] =
 	{ [0 ... NR_CPUS-1] = IPIPE_DEFAULT_FROZEN };
-static ipipe_spinlock_t global_path_lock = IPIPE_SPIN_LOCK_UNLOCKED;
+static IPIPE_DEFINE_SPINLOCK(global_path_lock);
 static int pre_trace = IPIPE_DEFAULT_PRE_TRACE;
 static int post_trace = IPIPE_DEFAULT_POST_TRACE;
 static int back_trace = IPIPE_DEFAULT_BACK_TRACE;
@@ -210,7 +210,7 @@ __ipipe_trace_end(int cpu_id, struct ipi
 	if (length > (trace_paths[cpu_id][max_path[cpu_id]]).length) {
 		/* we need protection here against other cpus trying
 		   to start a proc dump */
-		spin_lock_hw(&global_path_lock);
+		spin_lock(&global_path_lock);
 
 		/* active path holds new worst case */
 		tp->length = length;
@@ -219,7 +219,7 @@ __ipipe_trace_end(int cpu_id, struct ipi
 		/* find next unused trace path */
 		active = __ipipe_get_free_trace_path(active, cpu_id);
 
-		spin_unlock_hw(&global_path_lock);
+		spin_unlock(&global_path_lock);
 
 		tp = &trace_paths[cpu_id][active];
 
@@ -242,7 +242,7 @@ __ipipe_trace_freeze(int cpu_id, struct 
 
 	/* we need protection here against other cpus trying
 	 * to set their frozen path or to start a proc dump */
-	spin_lock_hw(&global_path_lock);
+	spin_lock(&global_path_lock);
 
 	frozen_path[cpu_id] = active;
 
@@ -256,7 +256,7 @@ __ipipe_trace_freeze(int cpu_id, struct 
 			tp->end = -1;
 	}
 
-	spin_unlock_hw(&global_path_lock);
+	spin_unlock(&global_path_lock);
 
 	tp = &trace_paths[cpu_id][active];
 
@@ -408,7 +408,7 @@ static unsigned long __ipipe_global_path
 	int cpu_id;
 	struct ipipe_trace_path *tp;
 
-	spin_lock_irqsave_hw(&global_path_lock, flags);
+	spin_lock_irqsave(&global_path_lock, flags);
 
 	cpu_id = ipipe_processor_id();
 restart:
@@ -441,7 +441,7 @@ static void __ipipe_global_path_unlock(u
 	struct ipipe_trace_path *tp;
 
 	/* release spinlock first - it's not involved in the NMI issue */
-	spin_unlock_hw(&global_path_lock);
+	spin_unlock(&global_path_lock);
 
 	cpu_id = ipipe_processor_id();
 	tp = &trace_paths[cpu_id][active_path[cpu_id]];
Index: linux-2.6.19-ipipe/kernel/printk.c
===================================================================
--- linux-2.6.19-ipipe.orig/kernel/printk.c
+++ linux-2.6.19-ipipe/kernel/printk.c
@@ -506,7 +506,7 @@ void __ipipe_flush_printk (unsigned virq
 	goto start;
 
 	do {
-		spin_unlock_irqrestore_hw(&__ipipe_printk_lock,flags);
+		spin_unlock_irqrestore(&__ipipe_printk_lock, flags);
  start:
 		lmax = __ipipe_printk_fill;
 		while (out < lmax) {
@@ -515,13 +515,13 @@ void __ipipe_flush_printk (unsigned virq
 			p += len;
 			out += len;
 		}
-		spin_lock_irqsave_hw(&__ipipe_printk_lock,flags);
+		spin_lock_irqsave(&__ipipe_printk_lock, flags);
 	}
 	while (__ipipe_printk_fill != lmax);
 
 	__ipipe_printk_fill = 0;
 
-	spin_unlock_irqrestore_hw(&__ipipe_printk_lock,flags);
+	spin_unlock_irqrestore(&__ipipe_printk_lock, flags);
 }
 
 asmlinkage int printk(const char *fmt, ...)
@@ -539,7 +539,7 @@ asmlinkage int printk(const char *fmt, .
 		goto out;
 	}
 
-	spin_lock_irqsave_hw(&__ipipe_printk_lock,flags);
+	spin_lock_irqsave(&__ipipe_printk_lock, flags);
 
 	oldcount = __ipipe_printk_fill;
 	fbytes = __LOG_BUF_LEN - oldcount;
@@ -551,7 +551,7 @@ asmlinkage int printk(const char *fmt, .
 	} else
 		r = 0;
 
-	spin_unlock_irqrestore_hw(&__ipipe_printk_lock,flags);
+	spin_unlock_irqrestore(&__ipipe_printk_lock, flags);
 
 	if (oldcount == 0)
 		ipipe_trigger_irq(__ipipe_printk_virq);
Index: linux-2.6.19-ipipe/arch/i386/kernel/ipipe.c
===================================================================
--- linux-2.6.19-ipipe.orig/arch/i386/kernel/ipipe.c
+++ linux-2.6.19-ipipe/arch/i386/kernel/ipipe.c
@@ -57,7 +57,7 @@ static cpumask_t __ipipe_cpu_sync_map;
 
 static cpumask_t __ipipe_cpu_lock_map;
 
-static ipipe_spinlock_t __ipipe_cpu_barrier = IPIPE_SPIN_LOCK_UNLOCKED;
+static IPIPE_DEFINE_SPINLOCK(__ipipe_cpu_barrier);
 
 static atomic_t __ipipe_critical_count = ATOMIC_INIT(0);
 
@@ -399,7 +399,7 @@ void __ipipe_do_critical_sync(unsigned i
 	/* Now we are in sync with the lock requestor running on another
 	   CPU. Enter a spinning wait until he releases the global
 	   lock. */
-	spin_lock_hw(&__ipipe_cpu_barrier);
+	spin_lock(&__ipipe_cpu_barrier);
 
 	/* Got it. Now get out. */
 
@@ -407,7 +407,7 @@ void __ipipe_do_critical_sync(unsigned i
 		/* Call the sync routine if any. */
 		__ipipe_cpu_sync();
 
-	spin_unlock_hw(&__ipipe_cpu_barrier);
+	spin_unlock(&__ipipe_cpu_barrier);
 
 	cpu_clear(cpuid, __ipipe_cpu_sync_map);
 }
@@ -451,7 +451,7 @@ unsigned long ipipe_critical_enter(void 
 				} while (++n < cpuid);
 			}
 
-			spin_lock_hw(&__ipipe_cpu_barrier);
+			spin_lock(&__ipipe_cpu_barrier);
 
 			__ipipe_cpu_sync = syncfn;
 
@@ -483,7 +483,7 @@ void ipipe_critical_exit(unsigned long f
 		ipipe_load_cpuid();
 
 		if (atomic_dec_and_test(&__ipipe_critical_count)) {
-			spin_unlock_hw(&__ipipe_cpu_barrier);
+			spin_unlock(&__ipipe_cpu_barrier);
 
 			while (!cpus_empty(__ipipe_cpu_sync_map))
 				cpu_relax();

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.3: map-ipipe-spinlocks.patch --]
[-- Type: text/x-patch; name="map-ipipe-spinlocks.patch", Size: 2091 bytes --]

---
 include/asm-generic/hal.h  |   10 +++++++++-
 include/rtdm/rtdm_driver.h |    6 +++---
 2 files changed, 12 insertions(+), 4 deletions(-)

Index: xenomai/include/asm-generic/hal.h
===================================================================
--- xenomai.orig/include/asm-generic/hal.h
+++ xenomai/include/asm-generic/hal.h
@@ -135,8 +135,16 @@ typedef rwlock_t rthal_rwlock_t;
 #define rthal_write_unlock(lock)	write_unlock_hw(lock)
 #define rthal_read_lock(lock)		read_lock_hw(lock)
 #define rthal_read_unlock(lock)	read_unlock_hw(lock)
+
+#ifdef spin_lock_hw
+#define rthal_spin_lock_init(lock)	spin_lock_init(lock)
 #define rthal_spin_lock(lock)		spin_lock_hw(lock)
-#define rthal_spin_unlock(lock)	spin_unlock_hw(lock)
+#define rthal_spin_unlock(lock)		spin_unlock_hw(lock)
+#else /* !spin_lock_hw */
+#define rthal_spin_lock_init(lock)	*(lock) = IPIPE_SPIN_LOCK_UNLOCKED
+#define rthal_spin_lock(lock)		spin_lock(lock)
+#define rthal_spin_unlock(lock)		spin_unlock(lock)
+#endif /* !spin_lock_hw */
 
 #define rthal_root_domain		ipipe_root_domain
 #define rthal_current_domain		ipipe_current_domain
Index: xenomai/include/rtdm/rtdm_driver.h
===================================================================
--- xenomai.orig/include/rtdm/rtdm_driver.h
+++ xenomai/include/rtdm/rtdm_driver.h
@@ -546,10 +546,10 @@ static inline nanosecs_abs_t rtdm_clock_
 /**
  * Static lock initialisation
  */
-#define RTDM_LOCK_UNLOCKED          SPIN_LOCK_UNLOCKED
+#define RTDM_LOCK_UNLOCKED          RTHAL_SPIN_LOCK_UNLOCKED
 
 /** Lock variable */
-typedef spinlock_t                  rtdm_lock_t;
+typedef rthal_spinlock_t            rtdm_lock_t;
 
 /** Variable to save the context while holding a lock */
 typedef unsigned long               rtdm_lockctx_t;
@@ -569,7 +569,7 @@ typedef unsigned long               rtdm
  *
  * Rescheduling: never.
  */
-#define rtdm_lock_init(lock)        spin_lock_init(lock)
+#define rtdm_lock_init(lock)        rthal_spin_lock_init(lock)
 
 /**
  * Acquire lock from non-preemptible contexts

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 249 bytes --]

             reply	other threads:[~2006-12-06  8:49 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-12-06  8:49 Jan Kiszka [this message]
2006-12-06  9:41 ` [Xenomai-core] Re: [Adeos-main] [RFC] type-based spinlock op selection Philippe Gerum
2006-12-13 17:04   ` Jan Kiszka
2006-12-13 17:24     ` Philippe Gerum
2006-12-13 17:27       ` Jan Kiszka
2006-12-13 17:37         ` Philippe Gerum
2006-12-14 20:50 ` Philippe Gerum

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4576842B.1090203@domain.hid \
    --to=jan.kiszka@domain.hid \
    --cc=adeos-main@gna.org \
    --cc=xenomai@xenomai.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.