* [IrDA+SMP] Lockup in handle_IRQ_event
@ 2001-01-03 22:20 Marc ZYNGIER
2001-01-03 23:18 ` Andrew Morton
0 siblings, 1 reply; 8+ messages in thread
From: Marc ZYNGIER @ 2001-01-03 22:20 UTC (permalink / raw)
To: linux-kernel; +Cc: linux-irda
Hi all,
Having just started playing with IrDA on my dual celeron (Abit "APIC
error..." BP6), I managed to kill it every single time (NMI watchdog
in handle_IRQ_event) while connecting to my mobile phone (in fact,
when closing the connection to the phone. even 'cat /dev/ircomm0' will
do...). This is perfectly repeatable.
This is with 2.4.0-prerelease (with prerelease-diff as of Wed Jan 3
15:31 UTC 2001), but also crashes with test13-pre7. Didn't test
previous kernel yet, but will do if asked.
hina:~$ ksymoops irda_oops-1
ksymoops 2.3.5 on i686 2.4.0-prerelease. Options used
-V (default)
-k /proc/ksyms (default)
-l /proc/modules (default)
-o /lib/modules/2.4.0-prerelease/ (default)
-m /usr/src/linux/System.map (default)
Warning: You did not tell me where to find symbol information. I will
assume that the log matches the kernel and modules that are running
right now and I'll use the default options above for symbol resolution.
If the current kernel and/or modules do not match the log, you can get
more accurate output by telling me the kernel version and where to find
map, modules, ksyms etc. ksymoops -h explains the options.
activating NMI Watchdog ... done.
cpu: 0, clocks: 1002414, slice: 334138
cpu: 1, clocks: 1002414, slice: 334138
NMI Watchdog detected LOCKUP on CPU0, registers:
CPU: 0
EIP: 0010:[<c010a5e5>]
Using defaults from ksymoops -t elf32-i386 -a i386
EFLAGS: 00000002
eax: 00000001 ebx: c15bc1e0 ecx: 00000000 edx: 00000000
esi: c02d1860 edi: 00000003 ebp: 00000003 esp: cd9e9d10
ds: 0018 es: 0018 ss: 0018
Process gsmctl (pid: 271, stackpage=cd9e9000)
Stack: c02eed00 c02d1860 00000003 cd9e9d48 c010a7f6 00000003 cd9e9d50 c15bc1e0
cdbe2da0 cdbe2da0 00000000 00000000 00000000 c15bc1e0 00000000 c0108fbc
cdbe2da0 00000000 cfab8d20 cdbe2da0 00000000 00000000 cfab8d2c cfab0018
Call Trace: [<c010a7f6>] [<c0108fbc>] [<d0836181>] [<d082f84e>] [<d0837299>] [<d0878d58>] [<d0878767>]
[<d08787c0>] [<d0878467>] [<d0838438>] [<d087d2eb>] [<d087d36c>] [<d087c92a>] [<d087bfac>] [<d087b8fa>]
[<c017e960>] [<c017efc9>] [<c0132af1>] [<c0131aa2>] [<c01184fb>] [<c0118cd3>] [<c0118e4a>] [<c0108efb>]
Code: a1 44 cd 2e c0 a8 01 75 f7 be 01 00 00 00 f6 43 07 20 75 01
>>EIP; c010a5e5 <handle_IRQ_event+21/78> <=====
Trace; c010a7f6 <do_IRQ+a6/f4>
Trace; c0108fbc <ret_from_intr+0/20>
Trace; d0836181 <[irda]hashbin_remove+121/13c>
Trace; d082f84e <[irda]irlmp_disconnect_request+66/98>
Trace; d0837299 <[irda]irttp_disconnect_request+f1/f8>
Trace; d0878d58 <[ircomm]ircomm_ttp_disconnect_request+14/18>
Trace; d0878767 <[ircomm]ircomm_state_conn+83/b8>
Trace; d08787c0 <[ircomm]ircomm_do_event+24/2c>
Trace; d0878467 <[ircomm]ircomm_disconnect_request+17/20>
Trace; d0838438 <[irda]__irias_delete_attrib+0/30>
Trace; d087d2eb <[ircomm-tty]ircomm_tty_state_ready+47/a4>
Trace; d087d36c <[ircomm-tty]ircomm_tty_do_event+24/2c>
Trace; d087c92a <[ircomm-tty]ircomm_tty_detach_cable+72/a8>
Trace; d087bfac <[ircomm-tty]ircomm_tty_shutdown+88/b8>
Trace; d087b8fa <[ircomm-tty]ircomm_tty_close+c2/16c>
Trace; c017e960 <release_dev+244/514>
Trace; c017efc9 <tty_release+2d/68>
Trace; c0132af1 <fput+39/e8>
Trace; c0131aa2 <filp_close+b2/bc>
Trace; c01184fb <put_files_struct+4f/b8>
Trace; c0118cd3 <do_exit+127/274>
Trace; c0118e4a <sys_exit+e/10>
Trace; c0108efb <system_call+33/38>
Code; c010a5e5 <handle_IRQ_event+21/78>
00000000 <_EIP>:
Code; c010a5e5 <handle_IRQ_event+21/78> <=====
0: a1 44 cd 2e c0 mov 0xc02ecd44,%eax <=====
Code; c010a5ea <handle_IRQ_event+26/78>
5: a8 01 test $0x1,%al
Code; c010a5ec <handle_IRQ_event+28/78>
7: 75 f7 jne 0 <_EIP>
Code; c010a5ee <handle_IRQ_event+2a/78>
9: be 01 00 00 00 mov $0x1,%esi
Code; c010a5f3 <handle_IRQ_event+2f/78>
e: f6 43 07 20 testb $0x20,0x7(%ebx)
Code; c010a5f7 <handle_IRQ_event+33/78>
12: 75 01 jne 15 <_EIP+0x15> c010a5fa <handle_IRQ_event+36/78>
activating NMI Watchdog ... done.
cpu: 0, clocks: 1002374, slice: 334124
cpu: 1, clocks: 1002374, slice: 334124
1 warning issued. Results may not be reliable.
hina:~$ grep c02ecd44 /usr/src/linux/System.map
c02ecd44 B global_irq_lock
Irk... CPU1 stuck in an interrupt, or global_irq_lock not released ?
Any idea anyone ? .config upon request.
M.
PS: if you reply to this mail from the IrDA ML, please CC to me as I'm
only subscribed to linux-kernel...
--
Places change, faces change. Life is so very strange.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [IrDA+SMP] Lockup in handle_IRQ_event 2001-01-03 22:20 [IrDA+SMP] Lockup in handle_IRQ_event Marc ZYNGIER @ 2001-01-03 23:18 ` Andrew Morton 2001-01-04 9:58 ` Marc ZYNGIER 2001-01-04 10:51 ` [Linux-IrDA]Re: " Florian Lohoff 0 siblings, 2 replies; 8+ messages in thread From: Andrew Morton @ 2001-01-03 23:18 UTC (permalink / raw) To: mzyngier; +Cc: linux-kernel, linux-irda Marc ZYNGIER wrote: > > Hi all, > > Having just started playing with IrDA on my dual celeron (Abit "APIC > error..." BP6), I managed to kill it every single time (NMI watchdog > in handle_IRQ_event) while connecting to my mobile phone (in fact, > when closing the connection to the phone. even 'cat /dev/ircomm0' will > do...). This is perfectly repeatable. > Try this: --- linux-2.4.0-prerelease/net/irda/irqueue.c Tue Nov 21 20:11:22 2000 +++ linux-akpm/net/irda/irqueue.c Thu Jan 4 10:14:10 2001 @@ -436,7 +436,7 @@ /* Release lock */ if ( hashbin->hb_type & HB_GLOBAL) { - spin_unlock_irq( &hashbin->hb_mutex[ bin]); + spin_unlock_irqrestore( &hashbin->hb_mutex[ bin], flags); } else if ( hashbin->hb_type & HB_LOCAL) { restore_flags( flags); - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [IrDA+SMP] Lockup in handle_IRQ_event 2001-01-03 23:18 ` Andrew Morton @ 2001-01-04 9:58 ` Marc ZYNGIER 2001-01-04 13:22 ` Andrew Morton 2001-01-04 10:51 ` [Linux-IrDA]Re: " Florian Lohoff 1 sibling, 1 reply; 8+ messages in thread From: Marc ZYNGIER @ 2001-01-04 9:58 UTC (permalink / raw) To: Andrew Morton; +Cc: linux-kernel, linux-irda >>>>> "AM" == Andrew Morton <andrewm@uow.edu.au> writes: Hi Andrew, AM> Try this: AM> --- linux-2.4.0-prerelease/net/irda/irqueue.c Tue Nov 21 20:11:22 2000 AM> +++ linux-akpm/net/irda/irqueue.c Thu Jan 4 10:14:10 2001 AM> @@ -436,7 +436,7 @@ AM> /* Release lock */ AM> if ( hashbin->hb_type & HB_GLOBAL) { AM> - spin_unlock_irq( &hashbin->hb_mutex[ bin]); AM> + spin_unlock_irqrestore( &hashbin->hb_mutex[ bin], flags); AM> } else if ( hashbin->hb_type & HB_LOCAL) { AM> restore_flags( flags); Ok, that wasn't enough, but you pointed me to the right direction. With your patch, the machine survived a few more seconds, that crashed with a slightly different path : >>EIP; c010a5e5 <handle_IRQ_event+21/78> <===== Trace; c010a7f6 <do_IRQ+a6/f4> Trace; c0108fbc <ret_from_intr+0/20> Trace; d0830018 <[irda]irlmp_unregister_client+20/54> Trace; d0835f01 <[irda]hashbin_insert+bd/c4> Trace; d082f863 <[irda]irlmp_disconnect_request+7b/98> Trace; d0837299 <[irda]irttp_disconnect_request+f1/f8> Trace; d0878d58 <[ircomm]ircomm_ttp_disconnect_request+14/18> Trace; d0878767 <[ircomm]ircomm_state_conn+83/b8> Trace; d08787c0 <[ircomm]ircomm_do_event+24/2c> Trace; d0878467 <[ircomm]ircomm_disconnect_request+17/20> Trace; d0838438 <[irda]__irias_delete_attrib+0/30> Trace; d087d2eb <[ircomm-tty]ircomm_tty_state_ready+47/a4> Trace; d087d36c <[ircomm-tty]ircomm_tty_do_event+24/2c> Trace; d087c92a <[ircomm-tty]ircomm_tty_detach_cable+72/a8> Trace; d087bfac <[ircomm-tty]ircomm_tty_shutdown+88/b8> Trace; d087b8fa <[ircomm-tty]ircomm_tty_close+c2/16c> Trace; c017e960 <release_dev+244/514> Trace; c017efc9 <tty_release+2d/68> Trace; c0132af1 <fput+39/e8> Trace; c0131aa2 <filp_close+b2/bc> Trace; c01184fb <put_files_struct+4f/b8> Trace; c0118cd3 <do_exit+127/274> Trace; c0118e4a <sys_exit+e/10> Trace; c0108efb <system_call+33/38> Code; c010a5e5 <handle_IRQ_event+21/78> hashbin_insert was guilty this time. So, using your patch as a guideline, I changed all spin_lock_irqsave/spin_unlock_irq pairs to spin_lock_irqsave/spin_unlock_irqrestore. Which seems to make sense anyway ! Using this patch, the machine is solid, and I've been able to play with my phone as much as I wanted to (well... while the battery lasted, anyway... ;-). Here's the patch (which of course includes yours). If it's proved to be correct, it would be a good idea to summit it to Linus while prerelease is still open to fixes. Thanks a lot for your help. M. --- linux/net/irda/irqueue.c.prerelease Thu Jan 4 10:21:13 2001 +++ linux/net/irda/irqueue.c Thu Jan 4 10:24:39 2001 @@ -198,7 +198,7 @@ /* Release lock */ if ( hashbin->hb_type & HB_GLOBAL) - spin_unlock_irq( &hashbin->hb_mutex[ bin]); + spin_unlock_irqrestore( &hashbin->hb_mutex[ bin], flags); else if (hashbin->hb_type & HB_LOCAL) { restore_flags( flags); } @@ -258,7 +258,7 @@ /* Release lock */ if ( hashbin->hb_type & HB_GLOBAL) { - spin_unlock_irq( &hashbin->hb_mutex[ bin]); + spin_unlock_irqrestore( &hashbin->hb_mutex[ bin], flags); } else if ( hashbin->hb_type & HB_LOCAL) { restore_flags( flags); @@ -327,7 +327,7 @@ /* Release lock */ if ( hashbin->hb_type & HB_GLOBAL) { - spin_unlock_irq( &hashbin->hb_mutex[ bin]); + spin_unlock_irqrestore( &hashbin->hb_mutex[ bin], flags); } else if ( hashbin->hb_type & HB_LOCAL) { restore_flags( flags); @@ -436,7 +436,7 @@ /* Release lock */ if ( hashbin->hb_type & HB_GLOBAL) { - spin_unlock_irq( &hashbin->hb_mutex[ bin]); + spin_unlock_irqrestore( &hashbin->hb_mutex[ bin], flags); } else if ( hashbin->hb_type & HB_LOCAL) { restore_flags( flags); @@ -511,7 +511,7 @@ /* Release lock */ if ( hashbin->hb_type & HB_GLOBAL) { - spin_unlock_irq( &hashbin->hb_mutex[ bin]); + spin_unlock_irqrestore( &hashbin->hb_mutex[ bin], flags); } else if ( hashbin->hb_type & HB_LOCAL) { restore_flags( flags); -- Places change, faces change. Life is so very strange. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [IrDA+SMP] Lockup in handle_IRQ_event 2001-01-04 9:58 ` Marc ZYNGIER @ 2001-01-04 13:22 ` Andrew Morton 2001-01-04 14:13 ` [PATCH] " Marc ZYNGIER 0 siblings, 1 reply; 8+ messages in thread From: Andrew Morton @ 2001-01-04 13:22 UTC (permalink / raw) To: mzyngier; +Cc: linux-kernel, linux-irda Marc ZYNGIER wrote: > > Using this patch, the machine is solid, and I've been able to play > with my phone as much as I wanted to (well... while the battery > lasted, anyway... ;-). > > Here's the patch (which of course includes yours). If it's proved to > be correct, it would be a good idea to summit it to Linus while > prerelease is still open to fixes. > Looks fine, Marc. I note that hashbin_unlock() does a restore_flags() where the flags were passed in as an argument. This doesn't work on SPARC. Conveniently, hashbin_unlock() is not actually used anywhere. So I suggest you kill that function altogether, test it, slap your name on it and send it to da man :) - - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH] [IrDA+SMP] Lockup in handle_IRQ_event 2001-01-04 13:22 ` Andrew Morton @ 2001-01-04 14:13 ` Marc ZYNGIER 0 siblings, 0 replies; 8+ messages in thread From: Marc ZYNGIER @ 2001-01-04 14:13 UTC (permalink / raw) To: torvalds; +Cc: Andrew Morton, linux-kernel, linux-irda Hi Linus, Please find enclosed a patch against 2.4.0-prerelease that : - Fixes a lockup in handle_IRQ_event when using IrDA on an SMP machine. It changes spin_lock_irqsave/spin_unlock_irq pairs to spin_lock_irqsave/spin_unlock_irqrestore, which seems to be the logical thing to do. - Removes 2 unused functions that are broken on SPARC (hashbin_unlock does a restore_flags when save_flags is done in hashbin_lock, which messes register windows). With this patch, IrDA is rock solid on my x86 SMP box (at least with my usage patern...). It was crashing immediatly before (NMI watchdog). A previous version of this patch has been reviewed by Andrew Morton, who said it looked ok. Thanks for applying it to your tree. M. --- linux/net/irda/irqueue.c.prerelease Thu Jan 4 10:21:13 2001 +++ linux/net/irda/irqueue.c Thu Jan 4 14:30:35 2001 @@ -8,6 +8,8 @@ * Created at: Tue Jun 9 13:29:31 1998 * Modified at: Sun Dec 12 13:48:22 1999 * Modified by: Dag Brattli <dagb@cs.uit.no> + * Modified at: Thu Jan 4 14:29:10 CET 2001 + * Modified by: Marc Zyngier <mzyngier@freesurf.fr> * * Copyright (C) 1998-1999, Aage Kvalnes <aage@cs.uit.no> * Copyright (C) 1998, Dag Brattli, @@ -142,69 +144,6 @@ } /* - * Function hashbin_lock (hashbin, hashv, name) - * - * Lock the hashbin - * - */ -void hashbin_lock(hashbin_t* hashbin, __u32 hashv, char* name, - unsigned long flags) -{ - int bin; - - IRDA_DEBUG(0, "hashbin_lock\n"); - - ASSERT(hashbin != NULL, return;); - ASSERT(hashbin->magic == HB_MAGIC, return;); - - /* - * Locate hashbin - */ - if (name) - hashv = hash(name); - bin = GET_HASHBIN(hashv); - - /* Synchronize */ - if ( hashbin->hb_type & HB_GLOBAL ) - spin_lock_irqsave(&hashbin->hb_mutex[ bin], flags); - else { - save_flags(flags); - cli(); - } -} - -/* - * Function hashbin_unlock (hashbin, hashv, name) - * - * Unlock the hashbin - * - */ -void hashbin_unlock(hashbin_t* hashbin, __u32 hashv, char* name, - unsigned long flags) -{ - int bin; - - IRDA_DEBUG(0, "hashbin_unlock()\n"); - - ASSERT(hashbin != NULL, return;); - ASSERT(hashbin->magic == HB_MAGIC, return;); - - /* - * Locate hashbin - */ - if (name ) - hashv = hash(name); - bin = GET_HASHBIN(hashv); - - /* Release lock */ - if ( hashbin->hb_type & HB_GLOBAL) - spin_unlock_irq( &hashbin->hb_mutex[ bin]); - else if (hashbin->hb_type & HB_LOCAL) { - restore_flags( flags); - } -} - -/* * Function hashbin_insert (hashbin, entry, name) * * Insert an entry into the hashbin @@ -258,7 +197,7 @@ /* Release lock */ if ( hashbin->hb_type & HB_GLOBAL) { - spin_unlock_irq( &hashbin->hb_mutex[ bin]); + spin_unlock_irqrestore( &hashbin->hb_mutex[ bin], flags); } else if ( hashbin->hb_type & HB_LOCAL) { restore_flags( flags); @@ -327,7 +266,7 @@ /* Release lock */ if ( hashbin->hb_type & HB_GLOBAL) { - spin_unlock_irq( &hashbin->hb_mutex[ bin]); + spin_unlock_irqrestore( &hashbin->hb_mutex[ bin], flags); } else if ( hashbin->hb_type & HB_LOCAL) { restore_flags( flags); @@ -436,7 +375,7 @@ /* Release lock */ if ( hashbin->hb_type & HB_GLOBAL) { - spin_unlock_irq( &hashbin->hb_mutex[ bin]); + spin_unlock_irqrestore( &hashbin->hb_mutex[ bin], flags); } else if ( hashbin->hb_type & HB_LOCAL) { restore_flags( flags); @@ -511,7 +450,7 @@ /* Release lock */ if ( hashbin->hb_type & HB_GLOBAL) { - spin_unlock_irq( &hashbin->hb_mutex[ bin]); + spin_unlock_irqrestore( &hashbin->hb_mutex[ bin], flags); } else if ( hashbin->hb_type & HB_LOCAL) { restore_flags( flags); -- Places change, faces change. Life is so very strange. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Linux-IrDA]Re: [IrDA+SMP] Lockup in handle_IRQ_event 2001-01-03 23:18 ` Andrew Morton 2001-01-04 9:58 ` Marc ZYNGIER @ 2001-01-04 10:51 ` Florian Lohoff 2001-01-04 12:04 ` Anton Blanchard 2001-01-04 12:06 ` Keith Owens 1 sibling, 2 replies; 8+ messages in thread From: Florian Lohoff @ 2001-01-04 10:51 UTC (permalink / raw) To: linux-irda; +Cc: mzyngier, linux-kernel On Thu, Jan 04, 2001 at 10:18:46AM +1100, Andrew Morton wrote: > Marc ZYNGIER wrote: > > > > Hi all, > > > > Having just started playing with IrDA on my dual celeron (Abit "APIC > > error..." BP6), I managed to kill it every single time (NMI watchdog > > in handle_IRQ_event) while connecting to my mobile phone (in fact, > > when closing the connection to the phone. even 'cat /dev/ircomm0' will > > do...). This is perfectly repeatable. > > > > Try this: > > --- linux-2.4.0-prerelease/net/irda/irqueue.c Tue Nov 21 20:11:22 2000 > +++ linux-akpm/net/irda/irqueue.c Thu Jan 4 10:14:10 2001 > @@ -436,7 +436,7 @@ > > /* Release lock */ > if ( hashbin->hb_type & HB_GLOBAL) { > - spin_unlock_irq( &hashbin->hb_mutex[ bin]); > + spin_unlock_irqrestore( &hashbin->hb_mutex[ bin], flags); > > } else if ( hashbin->hb_type & HB_LOCAL) { > restore_flags( flags); BTW: What i have seen in the ircomm_tty.c (2.2.18): 647 save_flags(flags); 648 cli(); 649 650 skb = self->tx_skb; 651 self->tx_skb = NULL; 652 653 restore_flags(flags); and a lot of other places simply use "save_flags(flags); cli(); restore_flags()". Can someone enlighten me how this is supposed to work on SMP machines ? AFAIK "cli()" only disables IRQs on the local CPU so a different CPU could easily stumple half way as this is definitly non atomic. Or is the tty layer protected by some "big tty lock" ? Flo -- Florian Lohoff flo@rfc822.org +49-5201-669912 Why is it called "common sense" when nobody seems to have any? - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Linux-IrDA]Re: [IrDA+SMP] Lockup in handle_IRQ_event 2001-01-04 10:51 ` [Linux-IrDA]Re: " Florian Lohoff @ 2001-01-04 12:04 ` Anton Blanchard 2001-01-04 12:06 ` Keith Owens 1 sibling, 0 replies; 8+ messages in thread From: Anton Blanchard @ 2001-01-04 12:04 UTC (permalink / raw) To: Florian Lohoff; +Cc: linux-irda, mzyngier, linux-kernel > BTW: What i have seen in the ircomm_tty.c (2.2.18): > > 647 save_flags(flags); > 648 cli(); > 649 > 650 skb = self->tx_skb; > 651 self->tx_skb = NULL; > 652 > 653 restore_flags(flags); > > and a lot of other places simply use "save_flags(flags); cli(); > restore_flags()". Can someone enlighten me how this is supposed to work > on SMP machines ? AFAIK "cli()" only disables IRQs on the local > CPU so a different CPU could easily stumple half way as this > is definitly non atomic. Or is the tty layer protected by some > "big tty lock" ? On SMP __cli() disables interrupts on the local cpu, cli() also grabs the global irq lock which serialises irqs between cpus. Using a spinlock is much preferred if possible as grabbing the global irq lock is expensive (and in most cases unnecessary). Anton - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Linux-IrDA]Re: [IrDA+SMP] Lockup in handle_IRQ_event 2001-01-04 10:51 ` [Linux-IrDA]Re: " Florian Lohoff 2001-01-04 12:04 ` Anton Blanchard @ 2001-01-04 12:06 ` Keith Owens 1 sibling, 0 replies; 8+ messages in thread From: Keith Owens @ 2001-01-04 12:06 UTC (permalink / raw) To: Florian Lohoff; +Cc: linux-irda, mzyngier, linux-kernel On Thu, 4 Jan 2001 11:51:59 +0100, Florian Lohoff <flo@rfc822.org> wrote: >and a lot of other places simply use "save_flags(flags); cli(); >restore_flags()". Can someone enlighten me how this is supposed to work >on SMP machines ? AFAIK "cli()" only disables IRQs on the local >CPU so a different CPU could easily stumple half way as this >is definitly non atomic. cli() is not the cli instruction anymore. On smp cli() maps to __global_cli() which is responsible for disabling interrupts on the other processors. See __global_cli in arch/*/kernel/irq.c. - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org Please read the FAQ at http://www.tux.org/lkml/ ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2001-01-04 14:12 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2001-01-03 22:20 [IrDA+SMP] Lockup in handle_IRQ_event Marc ZYNGIER 2001-01-03 23:18 ` Andrew Morton 2001-01-04 9:58 ` Marc ZYNGIER 2001-01-04 13:22 ` Andrew Morton 2001-01-04 14:13 ` [PATCH] " Marc ZYNGIER 2001-01-04 10:51 ` [Linux-IrDA]Re: " Florian Lohoff 2001-01-04 12:04 ` Anton Blanchard 2001-01-04 12:06 ` Keith Owens
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
Powered by JetHome