From: Ingo Molnar <mingo@elte.hu>
To: Linus Torvalds <torvalds@osdl.org>
Cc: Gerd Hoffmann <kraxel@suse.de>, Andrew Morton <akpm@osdl.org>,
linux-kernel@vger.kernel.org,
Chuck Ebbert <76306.1226@compuserve.com>
Subject: Re: smp/up alternatives crash when CONFIG_HOTPLUG_CPU
Date: Fri, 21 Apr 2006 09:48:58 +0200 [thread overview]
Message-ID: <20060421074858.GA28858@elte.hu> (raw)
In-Reply-To: <20060420152609.GA21993@elte.hu>
[-- Attachment #1: Type: text/plain, Size: 4201 bytes --]
* Ingo Molnar <mingo@elte.hu> wrote:
> * Linus Torvalds <torvalds@osdl.org> wrote:
>
> > There must be another bug there somewhere. It's not about cache
> > coherency.
>
> ok. Maybe it's in one of the patches i have applied. I'll re-check
> with vanilla.
ok, found the bug after quite some debugging - it seems to be caused by
a tools bug related to section nesting, which triggered with some valid
changes to mutex.c i had in my tree, but which changes are not upstream.
to reproduce the bug on vanilla, turn on CONFIG_DEBUG_MUTEXES and apply
the hack-patch i attached (WARNING: it is a totally broken,
non-functional patch, it just demonstrates the build bug! This is a
minimalized version of the effects the locking-correctness prover i'm
working has on mutex.c)
with that done i get these warnings from the assembler:
CC kernel/mutex.o
{standard input}: Assembler messages:
{standard input}:226: Warning: .space or .fill with negative value, ignored
{standard input}:314: Warning: .space or .fill with negative value, ignored
{standard input}:371: Warning: .space or .fill with negative value, ignored
{standard input}:533: Warning: .space or .fill with negative value, ignored
{standard input}:586: Warning: .space or .fill with negative value, ignored
you can also try the mutex.bad.s file i attached:
$ as mutex.s.bad
mutex.s.bad: Assembler messages:
mutex.s.bad:267: Warning: .space or .fill with negative value, ignored
mutex.s.bad:355: Warning: .space or .fill with negative value, ignored
mutex.s.bad:412: Warning: .space or .fill with negative value, ignored
mutex.s.bad:574: Warning: .space or .fill with negative value, ignored
mutex.s.bad:627: Warning: .space or .fill with negative value, ignored
which is caused by the following, pretty valid assembly code of the
smp-alternatives feature:
.fill 662b-661b,1,0x42
this is only a build-time warning, but the .smp_altinstr_replacement
sections get fatally mis-sized due to this, and this caused the
cpu-hotplug related crash i reported.
i dont know the precise reason why this is causing problems for the
assembler - the assembly code is 100% perfect AFAICS, but it's related
to section nesting: when i move around the first such .fill instance
within the .s assembly file, it suddenly starts working. In particular,
moving the first .smp_altinstr_replacement section to within the
.sched.text section made things work fine. This is true even if
.smp_altinstr_replacement is an empty section - the assembler gets
confused. I tried multiple versions of gas:
GNU assembler 2.16.91.0.3 20050821
GNU assembler 2.16.91.0.6 20060212
all produce this problem.
This led me to the second patch below: moving mutex_trylock into __sched
works around the problem.
Ingo
NOT-Signed-off-by: Ingo Molnar <mingo@elte.hu>
Index: linux/kernel/mutex.c
===================================================================
--- linux.orig/kernel/mutex.c
+++ linux/kernel/mutex.c
@@ -30,6 +30,19 @@
# include <asm/mutex.h>
#endif
+#undef spin_lock_mutex
+#undef spin_unlock_mutex
+
+#define spin_lock_mutex(lock) \
+ do { \
+ __raw_spin_lock(&(lock)->raw_lock); \
+ } while (0)
+
+#define spin_unlock_mutex(lock) \
+ do { \
+ __raw_spin_unlock(&(lock)->raw_lock); \
+ } while (0)
+
/***
* mutex_init - initialize the mutex
* @lock: the mutex to be initialized
--------------
From: Ingo Molnar <mingo@elte.hu>
work around weird section nesting build bug causing smp-alternatives
failures under certain circumstances.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
----
kernel/mutex.c | 2 +-
1 files changed, 1 insertion(+), 1 deletion(-)
Index: linux/kernel/mutex.c
===================================================================
--- linux.orig/kernel/mutex.c
+++ linux/kernel/mutex.c
@@ -306,7 +306,7 @@ static inline int __mutex_trylock_slowpa
* This function must not be used in interrupt context. The
* mutex must be released by the same task that acquired it.
*/
-int fastcall mutex_trylock(struct mutex *lock)
+int fastcall __sched mutex_trylock(struct mutex *lock)
{
return __mutex_fastpath_trylock(&lock->count,
__mutex_trylock_slowpath);
[-- Attachment #2: mutex.bad.s --]
[-- Type: text/plain, Size: 17439 bytes --]
.file "mutex.c"
# GNU C version 4.0.2 20051125 (Red Hat 4.0.2-8) (i386-redhat-linux)
# compiled by GNU C version 4.0.2 20051125 (Red Hat 4.0.2-8).
# GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
# options passed: -nostdinc -Iinclude -Iinclude/asm-i386/mach-default
# -D__KERNEL__ -DKBUILD_STR(s)=#s -DKBUILD_BASENAME=KBUILD_STR(mutex)
# -DKBUILD_MODNAME=KBUILD_STR(mutex) -isystem -include -MD -m32
# -msoft-float -mpreferred-stack-boundary=2 -march=i686 -mtune=pentium3
# -auxbase-strip -Os -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs
# -Wdeclaration-after-statement -Wno-pointer-sign -fno-strict-aliasing
# -fno-common -fno-omit-frame-pointer -fno-optimize-sibling-calls
# -ffreestanding -fverbose-asm
# options enabled: -falign-loops -fargument-alias -fbranch-count-reg
# -fcaller-saves -fcprop-registers -fcrossjumping -fcse-follow-jumps
# -fcse-skip-blocks -fdefer-pop -fdelete-null-pointer-checks
# -feliminate-unused-debug-types -fexpensive-optimizations -fforce-mem
# -ffunction-cse -fgcse -fgcse-lm -fguess-branch-probability -fident
# -fif-conversion -fif-conversion2 -finline-functions
# -finline-functions-called-once -fivopts -fkeep-static-consts
# -fleading-underscore -floop-optimize -floop-optimize2 -fmath-errno
# -fmerge-constants -foptimize-register-move -fpcc-struct-return -fpeephole
# -fpeephole2 -fregmove -freorder-functions -frerun-cse-after-loop
# -frerun-loop-opt -fsched-interblock -fsched-spec
# -fsched-stalled-insns-dep -fschedule-insns2 -fsplit-ivs-in-unroller
# -fstrength-reduce -fthread-jumps -ftrapping-math -ftree-ccp
# -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-fre
# -ftree-loop-im -ftree-loop-ivcanon -ftree-loop-optimize -ftree-lrs
# -ftree-sra -ftree-ter -funit-at-a-time -fverbose-asm
# -fzero-initialized-in-bss -mieee-fp -mno-fancy-math-387 -mno-red-zone
# -mtls-direct-seg-refs -mtune=pentium3 -march=i686
# -mpreferred-stack-boundary=2
.section __ksymtab,"a",@progbits
.align 4
.type __ksymtab_mutex_trylock, @object
.size __ksymtab_mutex_trylock, 8
__ksymtab_mutex_trylock:
# value:
.long mutex_trylock
# name:
.long __kstrtab_mutex_trylock
.section __ksymtab_strings,"a",@progbits
.type __kstrtab_mutex_trylock, @object
.size __kstrtab_mutex_trylock, 14
__kstrtab_mutex_trylock:
.string "mutex_trylock"
.section __ksymtab
.align 4
.type __ksymtab_mutex_lock_interruptible, @object
.size __ksymtab_mutex_lock_interruptible, 8
__ksymtab_mutex_lock_interruptible:
# value:
.long mutex_lock_interruptible
# name:
.long __kstrtab_mutex_lock_interruptible
.section __ksymtab_strings
.type __kstrtab_mutex_lock_interruptible, @object
.size __kstrtab_mutex_lock_interruptible, 25
__kstrtab_mutex_lock_interruptible:
.string "mutex_lock_interruptible"
.section __ksymtab
.align 4
.type __ksymtab_mutex_unlock, @object
.size __ksymtab_mutex_unlock, 8
__ksymtab_mutex_unlock:
# value:
.long mutex_unlock
# name:
.long __kstrtab_mutex_unlock
.section __ksymtab_strings
.type __kstrtab_mutex_unlock, @object
.size __kstrtab_mutex_unlock, 13
__kstrtab_mutex_unlock:
.string "mutex_unlock"
.section __ksymtab
.align 4
.type __ksymtab_mutex_lock, @object
.size __ksymtab_mutex_lock, 8
__ksymtab_mutex_lock:
# value:
.long mutex_lock
# name:
.long __kstrtab_mutex_lock
.section __ksymtab_strings
.type __kstrtab_mutex_lock, @object
.size __kstrtab_mutex_lock, 11
__kstrtab_mutex_lock:
.string "mutex_lock"
.section __ksymtab
.align 4
.type __ksymtab___mutex_init, @object
.size __ksymtab___mutex_init, 8
__ksymtab___mutex_init:
# value:
.long __mutex_init
# name:
.long __kstrtab___mutex_init
.section __ksymtab_strings
.type __kstrtab___mutex_init, @object
.size __kstrtab___mutex_init, 13
__kstrtab___mutex_init:
.string "__mutex_init"
.text
.globl __mutex_init
.type __mutex_init, @function
__mutex_init:
pushl %ebp #
movl %esp, %ebp #,
pushl %ecx #
movl $1, (%eax) #, <variable>.count.counter
movl $0, -4(%ebp) #, SR.124
movl $1, -4(%ebp) #, SR.124
movl $0, 8(%eax) #, <variable>.wait_lock.break_lock
movl -4(%ebp), %ecx # SR.124, SR.124
movl %ecx, 4(%eax) # SR.124, <variable>.wait_lock.raw_lock.slock
leal 12(%eax), %ecx #, list
movl %ecx, 12(%eax) # list, <variable>.next
movl %ecx, 4(%ecx) # list, <variable>.prev
pushl %edx # name
pushl %eax # lock
call debug_mutex_init #
popl %eax #
popl %edx #
leave
ret
.size __mutex_init, .-__mutex_init
.globl mutex_trylock
.type mutex_trylock, @function
mutex_trylock:
pushl %ebp #
movl %esp, %ebp #,
pushl %esi #
pushl %ebx #
movl %eax, %ebx # lock, lock
#APP
661:
1: lock ; decb 4(%eax) # <variable>.slock
jns 3f
2: rep;nop
cmpb $0,4(%eax) # <variable>.slock
jle 2b
jmp 1b
3:
662:
.section .smp_altinstructions,"a"
.align 4
.long 661b
.long 663f
.byte 0x68
.byte 662b-661b
.byte 664f-663f
.previous
.section .smp_altinstr_replacement,"awx"
663:
decb 4(%eax) # <variable>.slock
664:
.fill 662b-661b,1,0x42
.previous
#NO_APP
orl $-1, %esi #, x
#APP
xchgl %esi,(%eax) # x,* lock
#NO_APP
cmpl $1, %esi #, x
jne .L4 #,
pushl 4(%ebp) #
movl $-4096, %eax #, tmp70
#APP
andl %esp,%eax; # tmp70
#NO_APP
pushl %eax # tmp70
pushl %ebx # lock
call debug_mutex_set_owner #
addl $12, %esp #,
.L4:
leal 12(%ebx), %eax #, head
cmpl %eax, 12(%ebx) # head, <variable>.next
jne .L6 #,
movl $0, (%ebx) #, <variable>.count.counter
.L6:
#APP
movb $1,4(%ebx) # <variable>.slock
#NO_APP
xorl %eax, %eax # tmp72
cmpl $1, %esi #, x
sete %al #, tmp72
leal -8(%ebp), %esp #,
popl %ebx #
popl %esi #
popl %ebp #
ret
.size mutex_trylock, .-mutex_trylock
.section .rodata
.type __func__.9091, @object
.size __func__.9091, 24
__func__.9091:
.string "__mutex_unlock_slowpath"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "kernel/mutex.c"
.LC1:
.string "BUG: warning at %s:%d/%s()\n"
.section .sched.text,"ax",@progbits
.type __mutex_unlock_slowpath, @function
__mutex_unlock_slowpath:
pushl %ebp #
movl %esp, %ebp #,
pushl %esi #
movl %eax, %esi # lock_count, lock
movl $-4096, %eax #, tmp74
#APP
andl %esp,%eax; # tmp74
#NO_APP
cmpl %eax, 20(%esi) # tmp74, <variable>.owner
pushl %ebx #
je .L14 #,
cmpl $0, debug_mutex_on #, debug_mutex_on
je .L14 #,
movl console_printk, %eax # console_printk, console_printk
movl $15, %edx #, tmp82
movl $0, debug_mutex_on #, debug_mutex_on
testl %eax, %eax # console_printk
cmove %eax, %edx # console_printk,, tmp82
movb debug_mutex_lock, %al #, D.9103
movl %edx, console_printk # tmp82, console_printk
testb %al, %al # D.9103
jg .L16 #,
movl $debug_mutex_lock, %eax #,
call _spin_unlock #
.L16:
pushl $__func__.9091 #
pushl $220 #
pushl $.LC0 #
pushl $.LC1 #
call printk #
call dump_stack #
addl $16, %esp #,
.L14:
#APP
661:
1: lock ; decb 4(%esi) # <variable>.slock
jns 3f
2: rep;nop
cmpb $0,4(%esi) # <variable>.slock
jle 2b
jmp 1b
3:
662:
.section .smp_altinstructions,"a"
.align 4
.long 661b
.long 663f
.byte 0x68
.byte 662b-661b
.byte 664f-663f
.previous
.section .smp_altinstr_replacement,"awx"
663:
decb 4(%esi) # <variable>.slock
664:
.fill 662b-661b,1,0x42
.previous
#NO_APP
movl $1, (%esi) #, <variable>.count.counter
pushl %esi # lock
call debug_mutex_unlock #
movl 12(%esi), %ebx # <variable>.next, D.9228
leal 12(%esi), %eax #, D.9105
cmpl %eax, %ebx # D.9105, D.9228
popl %edx #
je .L21 #,
pushl %ebx # D.9228
pushl %esi # lock
call debug_mutex_wake_waiter #
movl 8(%ebx), %eax # <variable>.task, D.9107
call wake_up_process #
popl %ebx #
popl %eax #
.L21:
movl $0, 20(%esi) #, <variable>.owner
#APP
movb $1,4(%esi) # <variable>.slock
#NO_APP
leal -8(%ebp), %esp #,
popl %ebx #
popl %esi #
popl %ebp #
ret
.size __mutex_unlock_slowpath, .-__mutex_unlock_slowpath
.globl mutex_unlock
.type mutex_unlock, @function
mutex_unlock:
pushl %ebp #
movl %esp, %ebp #,
movl 4(%ebp), %edx #, tmp60
call __mutex_unlock_slowpath #
popl %ebp #
ret
.size mutex_unlock, .-mutex_unlock
.section .rodata
.type __func__.9044, @object
.size __func__.9044, 20
__func__.9044:
.string "__mutex_lock_common"
.section .sched.text
.type __mutex_lock_interruptible_slowpath, @function
__mutex_lock_interruptible_slowpath:
pushl %ebp #
movl %esp, %ebp #,
pushl %edi #
pushl %esi #
movl %eax, %esi # lock_count, lock_count
pushl %ebx #
movl $-4096, %eax #, tmp97
subl $24, %esp #,
leal -32(%ebp), %ebx #, tmp98
movl %edx, -36(%ebp) # ip, ip
#APP
andl %esp,%eax; # tmp97
#NO_APP
movl (%eax), %edi # <variable>.task, tsk
pushl %ebx # tmp98
call debug_mutex_init_waiter #
#APP
661:
1: lock ; decb 4(%esi) # <variable>.slock
jns 3f
2: rep;nop
cmpb $0,4(%esi) # <variable>.slock
jle 2b
jmp 1b
3:
662:
.section .smp_altinstructions,"a"
.align 4
.long 661b
.long 663f
.byte 0x68
.byte 662b-661b
.byte 664f-663f
.previous
.section .smp_altinstr_replacement,"awx"
663:
decb 4(%esi) # <variable>.slock
664:
.fill 662b-661b,1,0x42
.previous
#NO_APP
pushl -36(%ebp) # ip
pushl 4(%edi) # <variable>.thread_info
pushl %ebx # tmp98
pushl %esi # lock_count
call debug_mutex_add_waiter #
leal 12(%esi), %eax #, next
movl 4(%eax), %edx # <variable>.prev, prev
movl %eax, -32(%ebp) # next, waiter.list.next
movl %ebx, 4(%eax) # tmp98, <variable>.prev
movl %ebx, (%edx) # tmp98, <variable>.next
movl %edx, -28(%ebp) # prev, waiter.list.prev
addl $20, %esp #,
movl %edi, -24(%ebp) # tsk, waiter.task
.L29:
orl $-1, %eax #, tmp102
#APP
xchgl %eax,(%esi) # tmp102,* lock_count
#NO_APP
decl %eax # tmp102
movl 4(%edi), %edx # <variable>.thread_info, <variable>.thread_info
je .L30 #,
movl 8(%edx), %eax #, D.9357
testb $4, %al #, D.9357
jne .L60 #,
movl $1, (%edi) #, <variable>.state
#APP
movb $1,4(%esi) # <variable>.slock
#NO_APP
call schedule #
#APP
661:
1: lock ; decb 4(%esi) # <variable>.slock
jns 3f
2: rep;nop
cmpb $0,4(%esi) # <variable>.slock
jle 2b
jmp 1b
3:
662:
.section .smp_altinstructions,"a"
.align 4
.long 661b
.long 663f
.byte 0x68
.byte 662b-661b
.byte 664f-663f
.previous
.section .smp_altinstr_replacement,"awx"
663:
decb 4(%esi) # <variable>.slock
664:
.fill 662b-661b,1,0x42
.previous
#NO_APP
jmp .L29 #
.L30:
pushl %edx # <variable>.thread_info
leal -32(%ebp), %ebx #, tmp106
pushl %ebx # tmp106
pushl %esi # lock_count
call mutex_remove_waiter #
pushl -36(%ebp) # ip
pushl 4(%edi) # <variable>.thread_info
pushl %esi # lock_count
call debug_mutex_set_owner #
leal 12(%esi), %eax #, D.9269
addl $24, %esp #,
cmpl %eax, 12(%esi) # D.9269, <variable>.next
jne .L35 #,
movl $0, (%esi) #, <variable>.count.counter
.L35:
#APP
movb $1,4(%esi) # <variable>.slock
#NO_APP
pushl %ebx # tmp106
call debug_mutex_free_waiter #
leal 24(%esi), %eax #, D.9281
cmpl %eax, 24(%esi) # D.9281, <variable>.next
popl %ecx #
jne .L41 #,
cmpl $0, debug_mutex_on #, debug_mutex_on
je .L41 #,
movl console_printk, %eax # console_printk, console_printk
movl $15, %edx #, tmp124
movl $0, debug_mutex_on #, debug_mutex_on
testl %eax, %eax # console_printk
cmove %eax, %edx # console_printk,, tmp124
movb debug_mutex_lock, %al #, D.9286
movl %edx, console_printk # tmp124, console_printk
testb %al, %al # D.9286
jg .L43 #,
movl $debug_mutex_lock, %eax #,
call _spin_unlock #
.L43:
pushl $__func__.9044 #
pushl $198 #
pushl $.LC0 #
pushl $.LC1 #
call printk #
call dump_stack #
addl $16, %esp #,
.L41:
movl 4(%edi), %eax # <variable>.thread_info, temp.136
cmpl %eax, 20(%esi) # temp.136, <variable>.owner
je .L48 #,
cmpl $0, debug_mutex_on #, debug_mutex_on
jne .L64 #,
.L48:
xorl %eax, %eax # D.9130
jmp .L34 #
.L60:
pushl %edx # <variable>.thread_info
leal -32(%ebp), %ebx #, tmp104
pushl %ebx # tmp104
pushl %esi # lock_count
call mutex_remove_waiter #
#APP
movb $1,4(%esi) # <variable>.slock
#NO_APP
pushl %ebx # tmp104
call debug_mutex_free_waiter #
movl $-4, %eax #, D.9130
jmp .L65 #
.L64:
movl console_printk, %eax # console_printk, console_printk
movl $15, %edx #, tmp127
movl $0, debug_mutex_on #, debug_mutex_on
testl %eax, %eax # console_printk
cmove %eax, %edx # console_printk,, tmp127
movb debug_mutex_lock, %al #, D.9291
movl %edx, console_printk # tmp127, console_printk
testb %al, %al # D.9291
jg .L54 #,
movl $debug_mutex_lock, %eax #,
call _spin_unlock #
.L54:
pushl $__func__.9044 #
pushl $199 #
pushl $.LC0 #
pushl $.LC1 #
call printk #
call dump_stack #
xorl %eax, %eax # D.9130
.L65:
addl $16, %esp #,
.L34:
leal -12(%ebp), %esp #,
popl %ebx #
popl %esi #
popl %edi #
popl %ebp #
ret
.size __mutex_lock_interruptible_slowpath, .-__mutex_lock_interruptible_slowpath
.globl mutex_lock_interruptible
.type mutex_lock_interruptible, @function
mutex_lock_interruptible:
pushl %ebp #
movl %esp, %ebp #,
pushl %ebx #
movl %eax, %ebx # lock, lock
pushl $270 #
pushl $.LC0 #
call __might_sleep #
movl 4(%ebp), %edx #, tmp62
movl %ebx, %eax # lock, lock
call __mutex_lock_interruptible_slowpath #
movl -4(%ebp), %ebx #,
leave
ret
.size mutex_lock_interruptible, .-mutex_lock_interruptible
.type __mutex_lock_slowpath, @function
__mutex_lock_slowpath:
pushl %ebp #
movl %esp, %ebp #,
pushl %edi #
pushl %esi #
movl %eax, %esi # lock_count, lock_count
pushl %ebx #
movl $-4096, %eax #, tmp89
subl $24, %esp #,
leal -32(%ebp), %ebx #, tmp90
movl %edx, -36(%ebp) # ip, ip
#APP
andl %esp,%eax; # tmp89
#NO_APP
movl (%eax), %edi # <variable>.task, tsk
pushl %ebx # tmp90
call debug_mutex_init_waiter #
#APP
661:
1: lock ; decb 4(%esi) # <variable>.slock
jns 3f
2: rep;nop
cmpb $0,4(%esi) # <variable>.slock
jle 2b
jmp 1b
3:
662:
.section .smp_altinstructions,"a"
.align 4
.long 661b
.long 663f
.byte 0x68
.byte 662b-661b
.byte 664f-663f
.previous
.section .smp_altinstr_replacement,"awx"
663:
decb 4(%esi) # <variable>.slock
664:
.fill 662b-661b,1,0x42
.previous
#NO_APP
pushl -36(%ebp) # ip
pushl 4(%edi) # <variable>.thread_info
pushl %ebx # tmp90
pushl %esi # lock_count
call debug_mutex_add_waiter #
leal 12(%esi), %eax #, next
movl 4(%eax), %edx # <variable>.prev, prev
movl %eax, -32(%ebp) # next, waiter.list.next
movl %ebx, 4(%eax) # tmp90, <variable>.prev
movl %ebx, (%edx) # tmp90, <variable>.next
movl %edx, -28(%ebp) # prev, waiter.list.prev
addl $20, %esp #,
movl %edi, -24(%ebp) # tsk, waiter.task
.L69:
orl $-1, %eax #, tmp94
#APP
xchgl %eax,(%esi) # tmp94,* lock_count
#NO_APP
decl %eax # tmp94
je .L70 #,
movl $2, (%edi) #, <variable>.state
#APP
movb $1,4(%esi) # <variable>.slock
#NO_APP
call schedule #
#APP
661:
1: lock ; decb 4(%esi) # <variable>.slock
jns 3f
2: rep;nop
cmpb $0,4(%esi) # <variable>.slock
jle 2b
jmp 1b
3:
662:
.section .smp_altinstructions,"a"
.align 4
.long 661b
.long 663f
.byte 0x68
.byte 662b-661b
.byte 664f-663f
.previous
.section .smp_altinstr_replacement,"awx"
663:
decb 4(%esi) # <variable>.slock
664:
.fill 662b-661b,1,0x42
.previous
#NO_APP
jmp .L69 #
.L70:
pushl 4(%edi) # <variable>.thread_info
leal -32(%ebp), %ebx #, tmp95
pushl %ebx # tmp95
pushl %esi # lock_count
call mutex_remove_waiter #
pushl -36(%ebp) # ip
pushl 4(%edi) # <variable>.thread_info
pushl %esi # lock_count
call debug_mutex_set_owner #
leal 12(%esi), %eax #, D.9462
addl $24, %esp #,
cmpl %eax, 12(%esi) # D.9462, <variable>.next
jne .L72 #,
movl $0, (%esi) #, <variable>.count.counter
.L72:
#APP
movb $1,4(%esi) # <variable>.slock
#NO_APP
pushl %ebx # tmp95
call debug_mutex_free_waiter #
leal 24(%esi), %eax #, D.9474
cmpl %eax, 24(%esi) # D.9474, <variable>.next
popl %ebx #
jne .L78 #,
cmpl $0, debug_mutex_on #, debug_mutex_on
je .L78 #,
movl console_printk, %eax # console_printk, console_printk
movl $15, %edx #, tmp111
movl $0, debug_mutex_on #, debug_mutex_on
testl %eax, %eax # console_printk
cmove %eax, %edx # console_printk,, tmp111
movb debug_mutex_lock, %al #, D.9479
movl %edx, console_printk # tmp111, console_printk
testb %al, %al # D.9479
jg .L80 #,
movl $debug_mutex_lock, %eax #,
call _spin_unlock #
.L80:
pushl $__func__.9044 #
pushl $198 #
pushl $.LC0 #
pushl $.LC1 #
call printk #
call dump_stack #
addl $16, %esp #,
.L78:
movl 4(%edi), %eax # <variable>.thread_info, temp.150
cmpl %eax, 20(%esi) # temp.150, <variable>.owner
je .L96 #,
cmpl $0, debug_mutex_on #, debug_mutex_on
je .L96 #,
movl console_printk, %eax # console_printk, console_printk
movl $15, %edx #, tmp114
movl $0, debug_mutex_on #, debug_mutex_on
testl %eax, %eax # console_printk
cmove %eax, %edx # console_printk,, tmp114
movb debug_mutex_lock, %al #, D.9484
movl %edx, console_printk # tmp114, console_printk
testb %al, %al # D.9484
jg .L91 #,
movl $debug_mutex_lock, %eax #,
call _spin_unlock #
.L91:
pushl $__func__.9044 #
pushl $199 #
pushl $.LC0 #
pushl $.LC1 #
call printk #
call dump_stack #
addl $16, %esp #,
.L96:
leal -12(%ebp), %esp #,
popl %ebx #
popl %esi #
popl %edi #
popl %ebp #
ret
.size __mutex_lock_slowpath, .-__mutex_lock_slowpath
.globl mutex_lock
.type mutex_lock, @function
mutex_lock:
pushl %ebp #
movl %esp, %ebp #,
pushl %ebx #
movl %eax, %ebx # lock, lock
pushl $97 #
pushl $.LC0 #
call __might_sleep #
movl 4(%ebp), %edx #, tmp60
movl %ebx, %eax # lock, lock
call __mutex_lock_slowpath #
movl -4(%ebp), %ebx #,
popl %eax #
popl %edx #
leave
ret
.size mutex_lock, .-mutex_lock
.ident "GCC: (GNU) 4.0.2 20051125 (Red Hat 4.0.2-8)"
.section .note.GNU-stack,"",@progbits
next prev parent reply other threads:[~2006-04-21 7:45 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-04-19 9:46 smp/up alternatives crash when CONFIG_HOTPLUG_CPU Ingo Molnar
2006-04-20 5:29 ` Ingo Molnar
2006-04-20 7:45 ` Andi Kleen
2006-04-20 15:14 ` Linus Torvalds
2006-04-20 15:26 ` Ingo Molnar
2006-04-21 7:48 ` Ingo Molnar [this message]
2006-05-05 8:40 ` as bug (was: Re: smp/up alternatives crash when CONFIG_HOTPLUG_CPU) Denis Vlasenko
2006-05-05 8:45 ` Denis Vlasenko
2006-05-05 12:20 ` Alan Modra
2006-05-05 13:13 ` Denis Vlasenko
2006-05-06 3:11 ` Alan Modra
-- strict thread matches above, loose matches on Subject: below --
2006-04-21 23:31 smp/up alternatives crash when CONFIG_HOTPLUG_CPU Chuck Ebbert
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=20060421074858.GA28858@elte.hu \
--to=mingo@elte.hu \
--cc=76306.1226@compuserve.com \
--cc=akpm@osdl.org \
--cc=kraxel@suse.de \
--cc=linux-kernel@vger.kernel.org \
--cc=torvalds@osdl.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.