Philippe Gerum wrote:
> On Wed, 2006-12-06 at 09:49 +0100, Jan Kiszka wrote:
>> 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.
>>
> 
> I definitely like this. Queued for testing, thanks.
> 

Small update of the ipipe part: typecasts were missing for the
SMP||DEBUG_SPINLOCK case.
---
 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/arch/i386/kernel/apic.c
===================================================================
--- linux-2.6.19.orig/arch/i386/kernel/apic.c
+++ linux-2.6.19/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/arch/i386/kernel/i8253.c
===================================================================
--- linux-2.6.19.orig/arch/i386/kernel/i8253.c
+++ linux-2.6.19/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/arch/i386/kernel/i8259.c
===================================================================
--- linux-2.6.19.orig/arch/i386/kernel/i8259.c
+++ linux-2.6.19/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/arch/i386/kernel/io_apic.c
===================================================================
--- linux-2.6.19.orig/arch/i386/kernel/io_apic.c
+++ linux-2.6.19/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/arch/i386/kernel/time.c
===================================================================
--- linux-2.6.19.orig/arch/i386/kernel/time.c
+++ linux-2.6.19/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/include/asm-i386/mach-default/do_timer.h
===================================================================
--- linux-2.6.19.orig/include/asm-i386/mach-default/do_timer.h
+++ linux-2.6.19/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/include/linux/ipipe.h
===================================================================
--- linux-2.6.19.orig/include/linux/ipipe.h
+++ linux-2.6.19/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/include/linux/spinlock.h
===================================================================
--- linux-2.6.19.orig/include/linux/spinlock.h
+++ linux-2.6.19/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((spinlock_t *)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((spinlock_t *)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((spinlock_t *)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((spinlock_t *)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((spinlock_t *)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((spinlock_t *)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(&((spinlock_t *)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(&((spinlock_t *)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((spinlock_t *)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/include/linux/spinlock_types.h
===================================================================
--- linux-2.6.19.orig/include/linux/spinlock_types.h
+++ linux-2.6.19/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/arch/i386/mach-visws/visws_apic.c
===================================================================
--- linux-2.6.19.orig/arch/i386/mach-visws/visws_apic.c
+++ linux-2.6.19/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/arch/i386/mach-voyager/voyager_basic.c
===================================================================
--- linux-2.6.19.orig/arch/i386/mach-voyager/voyager_basic.c
+++ linux-2.6.19/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/drivers/ide/legacy/hd.c
===================================================================
--- linux-2.6.19.orig/drivers/ide/legacy/hd.c
+++ linux-2.6.19/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/drivers/input/gameport/gameport.c
===================================================================
--- linux-2.6.19.orig/drivers/input/gameport/gameport.c
+++ linux-2.6.19/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/drivers/input/joystick/analog.c
===================================================================
--- linux-2.6.19.orig/drivers/input/joystick/analog.c
+++ linux-2.6.19/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/drivers/pci/htirq.c
===================================================================
--- linux-2.6.19.orig/drivers/pci/htirq.c
+++ linux-2.6.19/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/include/asm-i386/i8253.h
===================================================================
--- linux-2.6.19.orig/include/asm-i386/i8253.h
+++ linux-2.6.19/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/include/asm-i386/i8259.h
===================================================================
--- linux-2.6.19.orig/include/asm-i386/i8259.h
+++ linux-2.6.19/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/kernel/ipipe/core.c
===================================================================
--- linux-2.6.19.orig/kernel/ipipe/core.c
+++ linux-2.6.19/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/kernel/ipipe/tracer.c
===================================================================
--- linux-2.6.19.orig/kernel/ipipe/tracer.c
+++ linux-2.6.19/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/kernel/printk.c
===================================================================
--- linux-2.6.19.orig/kernel/printk.c
+++ linux-2.6.19/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/arch/i386/kernel/ipipe.c
===================================================================
--- linux-2.6.19.orig/arch/i386/kernel/ipipe.c
+++ linux-2.6.19/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();

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to