All of lore.kernel.org
 help / color / mirror / Atom feed
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

  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.