2005-01-04 21:47:32

by James Nelson

[permalink] [raw]
Subject: [PATCH 0/7] ppc: remove cli()/sti() from arch/ppc/*

This series of patches is to remove the last cli()/sti() function calls in arch/ppc.

These are the only instances in active code that grep could find.


2005-01-04 21:47:30

by James Nelson

[permalink] [raw]
Subject: [PATCH 3/7] ppc: remove cli()/sti() in arch/ppc/8xx_io/fec.c

Signed-off-by: James Nelson <[email protected]>

diff -urN --exclude='*~' linux-2.6.10-mm1-original/arch/ppc/8xx_io/fec.c linux-2.6.10-mm1/arch/ppc/8xx_io/fec.c
--- linux-2.6.10-mm1-original/arch/ppc/8xx_io/fec.c 2004-12-24 16:35:28.000000000 -0500
+++ linux-2.6.10-mm1/arch/ppc/8xx_io/fec.c 2005-01-03 19:59:15.827049038 -0500
@@ -817,8 +817,7 @@

retval = 0;

- save_flags(flags);
- cli();
+ local_irq_save(flags);

if ((mip = mii_free) != NULL) {
mii_free = mip->mii_next;
@@ -836,7 +835,7 @@
retval = 1;
}

- restore_flags(flags);
+ local_irq_restore(flags);

return(retval);
}

2005-01-04 21:47:31

by James Nelson

[permalink] [raw]
Subject: [PATCH 7/7] ppc: remove cli()/sti() in arch/ppc/syslib/qspan_pci.c

Signed-off-by: James Nelson <[email protected]>

diff -urN --exclude='*~' linux-2.6.10-mm1-original/arch/ppc/syslib/qspan_pci.c linux-2.6.10-mm1/arch/ppc/syslib/qspan_pci.c
--- linux-2.6.10-mm1-original/arch/ppc/syslib/qspan_pci.c 2004-12-24 16:34:26.000000000 -0500
+++ linux-2.6.10-mm1/arch/ppc/syslib/qspan_pci.c 2005-01-03 19:13:30.256710849 -0500
@@ -109,8 +109,7 @@
}

#ifdef CONFIG_RPXCLASSIC
- save_flags(flags);
- cli();
+ local_irq_save(flags);
*((uint *)RPX_CSR_ADDR) &= ~BCSR2_QSPACESEL;
eieio();
#endif
@@ -124,7 +123,7 @@
#ifdef CONFIG_RPXCLASSIC
*((uint *)RPX_CSR_ADDR) |= BCSR2_QSPACESEL;
eieio();
- restore_flags(flags);
+ local_irq_restore(flags);
#endif

offset ^= 0x03;
@@ -148,8 +147,7 @@
}

#ifdef CONFIG_RPXCLASSIC
- save_flags(flags);
- cli();
+ local_irq_save(flags);
*((uint *)RPX_CSR_ADDR) &= ~BCSR2_QSPACESEL;
eieio();
#endif
@@ -164,7 +162,7 @@
#ifdef CONFIG_RPXCLASSIC
*((uint *)RPX_CSR_ADDR) |= BCSR2_QSPACESEL;
eieio();
- restore_flags(flags);
+ local_irq_restore(flags);
#endif

sp = ((ushort *)&temp) + ((offset >> 1) & 1);
@@ -185,8 +183,7 @@
}

#ifdef CONFIG_RPXCLASSIC
- save_flags(flags);
- cli();
+ local_irq_save(flags);
*((uint *)RPX_CSR_ADDR) &= ~BCSR2_QSPACESEL;
eieio();
#endif
@@ -200,7 +197,7 @@
#ifdef CONFIG_RPXCLASSIC
*((uint *)RPX_CSR_ADDR) |= BCSR2_QSPACESEL;
eieio();
- restore_flags(flags);
+ local_irq_restore(flags);
#endif

return PCIBIOS_SUCCESSFUL;
@@ -225,8 +222,7 @@
*cp = val;

#ifdef CONFIG_RPXCLASSIC
- save_flags(flags);
- cli();
+ local_irq_save(flags);
*((uint *)RPX_CSR_ADDR) &= ~BCSR2_QSPACESEL;
eieio();
#endif
@@ -240,7 +236,7 @@
#ifdef CONFIG_RPXCLASSIC
*((uint *)RPX_CSR_ADDR) |= BCSR2_QSPACESEL;
eieio();
- restore_flags(flags);
+ local_irq_restore(flags);
#endif

return PCIBIOS_SUCCESSFUL;
@@ -265,8 +261,7 @@
*sp = val;

#ifdef CONFIG_RPXCLASSIC
- save_flags(flags);
- cli();
+ local_irq_save(flags);
*((uint *)RPX_CSR_ADDR) &= ~BCSR2_QSPACESEL;
eieio();
#endif
@@ -280,7 +275,7 @@
#ifdef CONFIG_RPXCLASSIC
*((uint *)RPX_CSR_ADDR) |= BCSR2_QSPACESEL;
eieio();
- restore_flags(flags);
+ local_irq_restore(flags);
#endif

return PCIBIOS_SUCCESSFUL;
@@ -297,8 +292,7 @@
return PCIBIOS_DEVICE_NOT_FOUND;

#ifdef CONFIG_RPXCLASSIC
- save_flags(flags);
- cli();
+ local_irq_save(flags);
*((uint *)RPX_CSR_ADDR) &= ~BCSR2_QSPACESEL;
eieio();
#endif
@@ -312,7 +306,7 @@
#ifdef CONFIG_RPXCLASSIC
*((uint *)RPX_CSR_ADDR) |= BCSR2_QSPACESEL;
eieio();
- restore_flags(flags);
+ local_irq_restore(flags);
#endif

return PCIBIOS_SUCCESSFUL;

2005-01-04 21:51:37

by James Nelson

[permalink] [raw]
Subject: [PATCH 1/7] ppc: remove cli()/sti() in arch/ppc/4xx_io/serial_sicc.c

Signed-off-by: James Nelson <[email protected]>

diff -urN --exclude='*~' linux-2.6.10-mm1-original/arch/ppc/4xx_io/serial_sicc.c linux-2.6.10-mm1/arch/ppc/4xx_io/serial_sicc.c
--- linux-2.6.10-mm1-original/arch/ppc/4xx_io/serial_sicc.c 2004-12-24 16:33:49.000000000 -0500
+++ linux-2.6.10-mm1/arch/ppc/4xx_io/serial_sicc.c 2005-01-03 19:55:54.048289892 -0500
@@ -385,9 +385,9 @@
struct SICC_info *info = tty->driver_data;
unsigned long flags;

- save_flags(flags); cli();
+ local_irq_save(flags);
siccuart_disable_tx_interrupt(info);
- restore_flags(flags);
+ local_irq_restore(flags);
}

static void siccuart_start(struct tty_struct *tty)
@@ -395,11 +395,11 @@
struct SICC_info *info = tty->driver_data;
unsigned long flags;

- save_flags(flags); cli();
+ local_irq_save(flags);
if (info->xmit.head != info->xmit.tail
&& info->xmit.buf)
siccuart_enable_tx_interrupt(info);
- restore_flags(flags);
+ local_irq_restore(flags);
}


@@ -604,7 +604,7 @@
return -ENOMEM;
}

- save_flags(flags); cli();
+ local_irq_save(flags);

if (info->xmit.buf)
free_page(page);
@@ -688,12 +688,12 @@
siccuart_enable_rx_interrupt(info);

info->flags |= ASYNC_INITIALIZED;
- restore_flags(flags);
+ local_irq_restore(flags);
return 0;


errout:
- restore_flags(flags);
+ local_irq_restore(flags);
return retval;
}

@@ -708,7 +708,7 @@
if (!(info->flags & ASYNC_INITIALIZED))
return;

- save_flags(flags); cli(); /* Disable interrupts */
+ local_irq_save(flags); /* Disable interrupts */

/*
* clear delta_msr_wait queue to avoid mem leaks: we may free the irq
@@ -746,7 +746,7 @@

info->flags &= ~ASYNC_INITIALIZED;

- restore_flags(flags);
+ local_irq_restore(flags);
}


@@ -869,7 +869,7 @@
}

/* first, disable everything */
- save_flags(flags); cli();
+ local_irq_save(flags);

old_rcr = readb(info->port->uart_base + BL_SICC_RCR);
old_tcr = readb(info->port->uart_base + BL_SICC_TxCR);
@@ -881,7 +881,7 @@
/*RLBtrace (&ppc403Chan0, 0x2000000c, 0, 0);*/


- restore_flags(flags);
+ local_irq_restore(flags);


/* Set baud rate */
@@ -909,12 +909,12 @@
if (!tty || !info->xmit.buf)
return;

- save_flags(flags); cli();
+ local_irq_save(flags);
if (CIRC_SPACE(info->xmit.head, info->xmit.tail, SICC_XMIT_SIZE) != 0) {
info->xmit.buf[info->xmit.head] = ch;
info->xmit.head = (info->xmit.head + 1) & (SICC_XMIT_SIZE - 1);
}
- restore_flags(flags);
+ local_irq_restore(flags);
}

static void siccuart_flush_chars(struct tty_struct *tty)
@@ -928,9 +928,9 @@
|| !info->xmit.buf)
return;

- save_flags(flags); cli();
+ local_irq_save(flags);
siccuart_enable_tx_interrupt(info);
- restore_flags(flags);
+ local_irq_restore(flags);
}

static int siccuart_write(struct tty_struct *tty,
@@ -943,8 +943,7 @@
if (!tty || !info->xmit.buf || !tmp_buf)
return 0;

- save_flags(flags);
- cli();
+ local_irq_save(flags);
while (1) {
c = CIRC_SPACE_TO_END(info->xmit.head,
info->xmit.tail,
@@ -960,7 +959,7 @@
count -= c;
ret += c;
}
- restore_flags(flags);
+ local_irq_restore(flags);
if (info->xmit.head != info->xmit.tail
&& !tty->stopped
&& !tty->hw_stopped)
@@ -988,9 +987,9 @@
unsigned long flags;

pr_debug("siccuart_flush_buffer(%d) called\n", tty->index);
- save_flags(flags); cli();
+ local_irq_save(flags);
info->xmit.head = info->xmit.tail = 0;
- restore_flags(flags);
+ local_irq_restore(flags);
wake_up_interruptible(&tty->write_wait);
if ((tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
tty->ldisc.write_wakeup)
@@ -1019,10 +1018,10 @@
siccuart_send_xchar(tty, STOP_CHAR(tty));

if (tty->termios->c_cflag & CRTSCTS) {
- save_flags(flags); cli();
+ local_irq_save(flags);
info->mctrl &= ~TIOCM_RTS;
info->port->set_mctrl(info->port, info->mctrl);
- restore_flags(flags);
+ local_irq_restore(flags);
}
}

@@ -1039,10 +1038,10 @@
}

if (tty->termios->c_cflag & CRTSCTS) {
- save_flags(flags); cli();
+ local_irq_save(flags);
info->mctrl |= TIOCM_RTS;
info->port->set_mctrl(info->port, info->mctrl);
- restore_flags(flags);
+ local_irq_restore(flags);
}
}

@@ -1181,9 +1180,9 @@
unsigned int result, status;
unsigned long flags;

- save_flags(flags); cli();
+ local_irq_save(flags);
status = readb(info->port->uart_base + BL_SICC_LSR);
- restore_flags(flags);
+ local_irq_restore(flags);
result = status & _LSR_TSR_EMPTY ? TIOCSER_TEMT : 0;

/*
@@ -1234,10 +1233,10 @@
default:
return -EINVAL;
}
- save_flags(flags); cli();
+ local_irq_save(flags);
if (old != info->mctrl)
info->port->set_mctrl(info->port, info->mctrl);
- restore_flags(flags);
+ local_irq_restore(flags);
return 0;
}

@@ -1248,14 +1247,14 @@
unsigned int lcr_h;


- save_flags(flags); cli();
+ local_irq_save(flags);
lcr_h = readb(info->port + BL_SICC_LSR);
if (break_state == -1)
lcr_h |= _LSR_LB_MASK;
else
lcr_h &= ~_LSR_LB_MASK;
writeb(lcr_h, info->port + BL_SICC_LSRS);
- restore_flags(flags);
+ local_irq_restore(flags);
}

static int siccuart_ioctl(struct tty_struct *tty, struct file *file,
@@ -1303,9 +1302,9 @@
* RI where only 0->1 is counted.
*/
case TIOCGICOUNT:
- save_flags(flags); cli();
+ local_irq_save(flags);
cnow = info->state->icount;
- restore_flags(flags);
+ local_irq_restore(flags);
icount.cts = cnow.cts;
icount.dsr = cnow.dsr;
icount.rng = cnow.rng;
@@ -1342,22 +1341,22 @@
/* Handle transition to B0 status */
if ((old_termios->c_cflag & CBAUD) &&
!(cflag & CBAUD)) {
- save_flags(flags); cli();
+ local_irq_save(flags);
info->mctrl &= ~(TIOCM_RTS | TIOCM_DTR);
info->port->set_mctrl(info->port, info->mctrl);
- restore_flags(flags);
+ local_irq_restore(flags);
}

/* Handle transition away from B0 status */
if (!(old_termios->c_cflag & CBAUD) &&
(cflag & CBAUD)) {
- save_flags(flags); cli();
+ local_irq_save(flags);
info->mctrl |= TIOCM_DTR;
if (!(cflag & CRTSCTS) ||
!test_bit(TTY_THROTTLED, &tty->flags))
info->mctrl |= TIOCM_RTS;
info->port->set_mctrl(info->port, info->mctrl);
- restore_flags(flags);
+ local_irq_restore(flags);
}

/* Handle turning off CRTSCTS */
@@ -1393,10 +1392,10 @@

//pr_debug("siccuart_close() called\n");

- save_flags(flags); cli();
+ local_irq_save(flags);

if (tty_hung_up_p(filp)) {
- restore_flags(flags);
+ local_irq_restore(flags);
return;
}

@@ -1416,11 +1415,11 @@
state->count = 0;
}
if (state->count) {
- restore_flags(flags);
+ local_irq_restore(flags);
return;
}
info->flags |= ASYNC_CLOSING;
- restore_flags(flags);
+ local_irq_restore(flags);
/*
* Now we wait for the transmit buffer to clear; and we notify
* the line discipline to only process XON/XOFF characters.
@@ -1569,20 +1568,20 @@
*/
retval = 0;
add_wait_queue(&info->open_wait, &wait);
- save_flags(flags); cli();
+ local_irq_save(flags);
if (!tty_hung_up_p(filp)) {
extra_count = 1;
state->count--;
}
- restore_flags(flags);
+ local_irq_restore(flags);
info->blocked_open++;
while (1) {
- save_flags(flags); cli();
+ local_irq_save(flags);
if (tty->termios->c_cflag & CBAUD) {
info->mctrl = TIOCM_DTR | TIOCM_RTS;
info->port->set_mctrl(info->port, info->mctrl);
}
- restore_flags(flags);
+ local_irq_restore(flags);
set_current_state(TASK_INTERRUPTIBLE);
if (tty_hung_up_p(filp) ||
!(info->flags & ASYNC_INITIALIZED)) {

2005-01-04 21:51:36

by James Nelson

[permalink] [raw]
Subject: [PATCH 2/7] ppc: remove cli()/sti() in arch/ppc/8xx_io/cs4218_tdm.c

Signed-off-by: James Nelson <[email protected]>

diff -urN --exclude='*~' linux-2.6.10-mm1-original/arch/ppc/8xx_io/cs4218_tdm.c linux-2.6.10-mm1/arch/ppc/8xx_io/cs4218_tdm.c
--- linux-2.6.10-mm1-original/arch/ppc/8xx_io/cs4218_tdm.c 2004-12-24 16:33:51.000000000 -0500
+++ linux-2.6.10-mm1/arch/ppc/8xx_io/cs4218_tdm.c 2005-01-03 19:58:01.881032015 -0500
@@ -1206,7 +1206,7 @@
volatile cbd_t *bdp;
volatile cpm8xx_t *cp;

- save_flags(flags); cli();
+ local_irq_save(flags);
#if 0
if (awacs_beep_state) {
/* sound takes precedence over beeps */
@@ -1263,7 +1263,7 @@

++sq.active;
}
- restore_flags(flags);
+ local_irq_restore(flags);
}


@@ -1275,7 +1275,7 @@
if (read_sq.active)
return;

- save_flags(flags); cli();
+ local_irq_save(flags);

/* This is all we have to do......Just start it up.
*/
@@ -1284,7 +1284,7 @@

read_sq.active = 1;

- restore_flags(flags);
+ local_irq_restore(flags);
}


@@ -1365,14 +1365,14 @@
{
unsigned long flags;

- save_flags(flags); cli();
+ local_irq_save(flags);
if (beep_playing) {
#if 0
st_le16(&beep_dbdma_cmd->command, DBDMA_STOP);
#endif
beep_playing = 0;
}
- restore_flags(flags);
+ local_irq_restore(flags);
}

static struct timer_list beep_timer = TIMER_INITIALIZER(cs_nosound, 0, 0);
@@ -1401,21 +1401,21 @@
return;
#endif
}
- save_flags(flags); cli();
+ local_irq_save(flags);
del_timer(&beep_timer);
if (ticks) {
beep_timer.expires = jiffies + ticks;
add_timer(&beep_timer);
}
if (beep_playing || sq.active || beep_buf == NULL) {
- restore_flags(flags);
+ local_irq_restore(flags);
return; /* too hard, sorry :-( */
}
beep_playing = 1;
#if 0
st_le16(&beep_dbdma_cmd->command, OUTPUT_MORE + BR_ALWAYS);
#endif
- restore_flags(flags);
+ local_irq_restore(flags);

if (hz == beep_hz_cache && beep_volume == beep_volume_cache) {
nsamples = beep_nsamples_cache;
@@ -1442,7 +1442,7 @@
st_le32(&beep_dbdma_cmd->phy_addr, virt_to_bus(beep_buf));
awacs_beep_state = 1;

- save_flags(flags); cli();
+ local_irq_save(flags);
if (beep_playing) { /* i.e. haven't been terminated already */
out_le32(&awacs_txdma->control, (RUN|WAKE|FLUSH|PAUSE) << 16);
out_le32(&awacs->control,
@@ -1453,7 +1453,7 @@
out_le32(&awacs_txdma->control, RUN | (RUN << 16));
}
#endif
- restore_flags(flags);
+ local_irq_restore(flags);
}

static MACHINE mach_cs4218 = {

2005-01-05 00:08:38

by James Nelson

[permalink] [raw]
Subject: [PATCH 4/7] ppc: remove cli()/sti() in arch/ppc/platforms/apus_setup.c

Signed-off-by: James Nelson <[email protected]>

diff -urN --exclude='*~' linux-2.6.10-mm1-original/arch/ppc/platforms/apus_setup.c linux-2.6.10-mm1/arch/ppc/platforms/apus_setup.c
--- linux-2.6.10-mm1-original/arch/ppc/platforms/apus_setup.c 2004-12-24 16:34:58.000000000 -0500
+++ linux-2.6.10-mm1/arch/ppc/platforms/apus_setup.c 2005-01-03 19:29:40.720694742 -0500
@@ -480,7 +480,7 @@
void
apus_restart(char *cmd)
{
- cli();
+ local_irq_disable();

APUS_WRITE(APUS_REG_LOCK,
REGLOCK_BLACKMAGICK1|REGLOCK_BLACKMAGICK2);

2005-01-05 00:08:10

by James Nelson

[permalink] [raw]
Subject: [PATCH 5/7] ppc: remove cli()/sti() in arch/ppc/platforms/pal4_setup.c

Signed-off-by: James Nelson <[email protected]>

diff -urN --exclude='*~' linux-2.6.10-mm1-original/arch/ppc/platforms/pal4_setup.c linux-2.6.10-mm1/arch/ppc/platforms/pal4_setup.c
--- linux-2.6.10-mm1-original/arch/ppc/platforms/pal4_setup.c 2004-12-24 16:35:28.000000000 -0500
+++ linux-2.6.10-mm1/arch/ppc/platforms/pal4_setup.c 2005-01-03 19:49:42.123501068 -0500
@@ -81,7 +81,7 @@
static void
pal4_restart(char *cmd)
{
- __cli();
+ local_irq_disable();
__asm__ __volatile__("lis 3,0xfff0\n \
ori 3,3,0x100\n \
mtspr 26,3\n \
@@ -95,7 +95,7 @@
static void
pal4_power_off(void)
{
- __cli();
+ local_irq_disable();
for(;;);
}

2005-01-05 00:08:11

by James Nelson

[permalink] [raw]
Subject: [PATCH 6/7] ppc: remove cli()/sti() in arch/ppc/syslib/m8xx_setup.c

Signed-off-by: James Nelson <[email protected]>

diff -urN --exclude='*~' linux-2.6.10-mm1-original/arch/ppc/syslib/m8xx_setup.c linux-2.6.10-mm1/arch/ppc/syslib/m8xx_setup.c
--- linux-2.6.10-mm1-original/arch/ppc/syslib/m8xx_setup.c 2004-12-24 16:34:32.000000000 -0500
+++ linux-2.6.10-mm1/arch/ppc/syslib/m8xx_setup.c 2005-01-03 19:26:53.224307353 -0500
@@ -238,7 +238,7 @@
{
__volatile__ unsigned char dummy;

- cli();
+ local_irq_disable();
((immap_t *)IMAP_ADDR)->im_clkrst.car_plprcr |= 0x00000080;

/* Clear the ME bit in MSR to cause checkstop on machine check

2005-01-05 02:19:23

by Brian Gerst

[permalink] [raw]
Subject: Re: [PATCH 0/7] ppc: remove cli()/sti() from arch/ppc/*

James Nelson wrote:
> This series of patches is to remove the last cli()/sti() function calls in arch/ppc.
>
> These are the only instances in active code that grep could find.

Are you sure none of these need real spinlocks instead of just disabling
interrupts?

--
Brian Gerst

2005-01-05 02:43:58

by James Nelson

[permalink] [raw]
Subject: Re: [PATCH 0/7] ppc: remove cli()/sti() from arch/ppc/*

Brian Gerst wrote:

> James Nelson wrote:
>
>> This series of patches is to remove the last cli()/sti() function
>> calls in arch/ppc.
>>
>> These are the only instances in active code that grep could find.
>
>
> Are you sure none of these need real spinlocks instead of just
> disabling interrupts?
>
> --
> Brian Gerst
>
These are for single-processor systems, mostly evaluation boards and
embedded processors. I coudn't find any reference to multiprocessor
setups for the processors in question after a peruse of the code or a
quick google on the boards in question.

Jim

2005-01-05 09:27:31

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH 0/7] ppc: remove cli()/sti() from arch/ppc/*

On Tue, Jan 04, 2005 at 09:44:06PM -0500, Jim Nelson wrote:
> Brian Gerst wrote:
>
> >James Nelson wrote:
> >
> >>This series of patches is to remove the last cli()/sti() function
> >>calls in arch/ppc.
> >>
> >>These are the only instances in active code that grep could find.
> >
> >
> >Are you sure none of these need real spinlocks instead of just
> >disabling interrupts?
> >
> >--
> > Brian Gerst
> >
> These are for single-processor systems, mostly evaluation boards and
> embedded processors. I coudn't find any reference to multiprocessor
> setups for the processors in question after a peruse of the code or a
> quick google on the boards in question.

think CONFIG_PREEMPT. In either case a spinlock becomes
lock_irq_disable in the !SMP, !PREEMPT case but it documents the
intention a whole lot better.

Also you're locking only in a single plpace which is a ***BIG*** warning
sign. At least look at the other users of the data structure, it's
extremly likely they'll need locking aswell.

2005-01-05 11:19:21

by James Nelson

[permalink] [raw]
Subject: Re: [PATCH 0/7] ppc: remove cli()/sti() from arch/ppc/*

Christoph Hellwig wrote:
> On Tue, Jan 04, 2005 at 09:44:06PM -0500, Jim Nelson wrote:
>
>>Brian Gerst wrote:
>>
>>
>>>James Nelson wrote:
>>>
>>>
>>>>This series of patches is to remove the last cli()/sti() function
>>>>calls in arch/ppc.
>>>>
>>>>These are the only instances in active code that grep could find.
>>>
>>>
>>>Are you sure none of these need real spinlocks instead of just
>>>disabling interrupts?
>>>
>>>--
>>> Brian Gerst
>>>
>>
>>These are for single-processor systems, mostly evaluation boards and
>>embedded processors. I coudn't find any reference to multiprocessor
>>setups for the processors in question after a peruse of the code or a
>>quick google on the boards in question.
>
>
> think CONFIG_PREEMPT. In either case a spinlock becomes
> lock_irq_disable in the !SMP, !PREEMPT case but it documents the
> intention a whole lot better.
>
> Also you're locking only in a single plpace which is a ***BIG*** warning
> sign. At least look at the other users of the data structure, it's
> extremly likely they'll need locking aswell.
>

Some of the cli() uses were in shutdown and IRQ setup code, where you'd just need
to disable interrupts. There are a few files that will need a more thourough
going-through, however.

I'll start checking those later.

Jim