The Linux Kernel Mailing List
 help / color / mirror / Atom feed
* [RFC][PATCH][2.5] Possible race in wait_task_zombie and finish_task_switch
@ 2003-05-25 10:11 Zwane Mwaikambo
  2003-05-25 10:27 ` Ingo Molnar
  0 siblings, 1 reply; 7+ messages in thread
From: Zwane Mwaikambo @ 2003-05-25 10:11 UTC (permalink / raw)
  To: Linux Kernel; +Cc: Manfred Spraul, William Lee Irwin III, Ingo Molnar

There appears to be a race between callers of wait_task_zombie and a 
processor carrying out a fork, the end result is that the loser ends up 
accessing a freed task_struct. The following scenario has been 
reconstructed based on various oopses and slab debugging messages. Patch 
prepended.

thread of execution 1:
wait_task_zombie() {
	tsk->state = TASK_DEAD;
	/* now assume no other thread will reap this task */
	...
	...
	free_task_struct_memory()
}

thread of execution 2:
ret_from_fork
schedule_tail
finish_task_struct {
	if (prev->state & (TASK_DEAD | TASK_ZOMBIE))
		put_task_struct(prev);
}

Finally, why did the if (prev->state & TASK...) get put there?

debugging messages:
===================================================================================
kernel BUG at kernel/sched.c:746!
invalid operand: 0000 [#1]
CPU:    0
EIP:    0060:[<c011adbd>]    Not tainted VLI
EFLAGS: 00000246
EIP is at schedule_tail+0xdd/0x130
eax: 00000008   ebx: 00000000   ecx: c5af0180   edx: c5758000
esi: c5af3580   edi: c5ad9d14   ebp: c5759fb8   esp: c5759fb0
ds: 007b   es: 007b   ss: 0068
Process minilogd (pid: 112, threadinfo=c5758000 task=c5f32180)
Stack: c5af3580 c5f32180 c575dfbc c0109c26 c5af3580 01200011 00000000 00000000
       00000000 40016a28 bffffd88 00000000 0000007b 0000007b 00000078 ffffe402
       00000073 00000206 bffffd38 0000007b
Call Trace:
 [<c0109c26>] ret_from_fork+0x6/0x20

Code: 00 85 d2 74 16 89 d6 83 c6 04 19 c9 39 70 18 83 d9 00 85 c9 75 05 8b 
43 7c 89 02 8d 65 f8 5b 5e 5d c3 56 e8 b6 31
 00 00 5a eb c7 <0f> 0b ea 02 ed be 49 c0 eb b3 89 d8 e8 02 60 00 00 eb 97 
e8 9b

Unable to handle kernel paging request at virtual address 6b6b6b6b
 printing eip:
c0134de6
*pde = 00000000
Oops: 0000 [#1]
CPU:    0
EIP:    0060:[<c0134de6>]    Not tainted VLI
EFLAGS: 00010046
EIP is at detach_pid+0x16/0x170
eax: cb42d360   ebx: 6b6b6b6b   ecx: cb42d410   edx: 0000000a
esi: 6b6b6b6b   edi: cb42d90c   ebp: 00000000   esp: cad47f00
ds: 007b   es: 007b   ss: 0068
Process gkrellmd (pid: 1657, threadinfo=cad46000 task=c9e746b0)
Stack: cb42d310 00000000 cb42d90c 00000000 c012476c cb42d310 c0124871 cb42d310 
       cb42d310 cb42d8d4 cb42d310 000049b7 08057978 00000000 c01268c4 cb42d310 
       08057978 08057978 cb42d3b4 cb42d310 c9e746b0 c9e7474c c0126dd9 cb42d310 
Call Trace:
 [<c012476c>] __unhash_process+0x5c/0xb0
 [<c0124871>] release_task+0xb1/0x290
 [<c01268c4>] wait_task_zombie+0x154/0x1c0
 [<c0126dd9>] sys_wait4+0x259/0x2b0
 [<c011dce0>] default_wake_function+0x0/0x20
 [<c0108931>] sys_sigreturn+0x101/0x170
 [<c011dce0>] default_wake_function+0x0/0x20
 [<c01095d7>] syscall_call+0x7/0xb

Code: be 2b 47 c0 e9 71 ff ff ff 8d b6 00 00 00 00 8d bf 00 00 00 00 8d 14 
92 55 57 8d 04 d0 56 53 8d  

Slab corruption: start=cba072d0, expend=cba078ff, problemat=cba072d8
Data: ********6A 
********************************************************************************** 
Next: 00 00 00 00 00 E0 D4 C6 06 00 00 00 00 01 00 00 00 00 00 00 FF FF FF 
FF 7B 00 00 00 78 00 00  
slab error in check_poison_obj(): cache `task_struct': object was modified after freeing
Call Trace:
 [<c014432c>] check_poison_obj+0x12c/0x170
 [<c01463e7>] kmem_cache_alloc+0x127/0x170
 [<c012042e>] dup_task_struct+0x9e/0xc0
 [<c012042e>] dup_task_struct+0x9e/0xc0
 [<c01212ab>] copy_process+0x7b/0xe30
 [<c012209f>] do_fork+0x3f/0x170
 [<c015dd9f>] sys_llseek+0xcf/0xe0
 [<c01077f7>] sys_fork+0x17/0x20
 [<c0109547>] syscall_call+0x7/0xb

Index: linux-2.5/kernel/sched.c
===================================================================
RCS file: /home/cvs/linux-2.5/kernel/sched.c,v
retrieving revision 1.175
diff -u -p -B -r1.175 sched.c
--- linux-2.5/kernel/sched.c	19 May 2003 17:46:39 -0000	1.175
+++ linux-2.5/kernel/sched.c	25 May 2003 09:11:38 -0000
@@ -610,8 +610,6 @@ static inline void finish_task_switch(ta
 	finish_arch_switch(rq, prev);
 	if (mm)
 		mmdrop(mm);
-	if (prev->state & (TASK_DEAD | TASK_ZOMBIE))
-		put_task_struct(prev);
 }
 
 /**
-- 
function.linuxpower.ca

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC][PATCH][2.5] Possible race in wait_task_zombie and finish_task_switch
  2003-05-25 10:11 [RFC][PATCH][2.5] Possible race in wait_task_zombie and finish_task_switch Zwane Mwaikambo
@ 2003-05-25 10:27 ` Ingo Molnar
  2003-05-25 10:29   ` Zwane Mwaikambo
  0 siblings, 1 reply; 7+ messages in thread
From: Ingo Molnar @ 2003-05-25 10:27 UTC (permalink / raw)
  To: Zwane Mwaikambo; +Cc: Linux Kernel, Manfred Spraul, William Lee Irwin III


On Sun, 25 May 2003, Zwane Mwaikambo wrote:

> 	if (prev->state & (TASK_DEAD | TASK_ZOMBIE))
> 		put_task_struct(prev);

we initialize tsk->usage with 2 in fork() - are you sure the removal of
the above code will not result in a memory leak?

	Ingo



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC][PATCH][2.5] Possible race in wait_task_zombie and finish_task_switch
  2003-05-25 10:27 ` Ingo Molnar
@ 2003-05-25 10:29   ` Zwane Mwaikambo
  2003-05-25 11:00     ` Mika Penttilä
  0 siblings, 1 reply; 7+ messages in thread
From: Zwane Mwaikambo @ 2003-05-25 10:29 UTC (permalink / raw)
  To: Ingo Molnar; +Cc: Linux Kernel, Manfred Spraul, William Lee Irwin III

On Sun, 25 May 2003, Ingo Molnar wrote:

> On Sun, 25 May 2003, Zwane Mwaikambo wrote:
> 
> > 	if (prev->state & (TASK_DEAD | TASK_ZOMBIE))
> > 		put_task_struct(prev);
> 
> we initialize tsk->usage with 2 in fork() - are you sure the removal of
> the above code will not result in a memory leak?

Isn't current the forked task? Also we initialise the forked task's state 
to TASK_UNINTERRUPTIBLE.

	Zwane
-- 
function.linuxpower.ca

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC][PATCH][2.5] Possible race in wait_task_zombie and finish_task_switch
  2003-05-25 10:29   ` Zwane Mwaikambo
@ 2003-05-25 11:00     ` Mika Penttilä
  2003-05-25 11:23       ` Manfred Spraul
  0 siblings, 1 reply; 7+ messages in thread
From: Mika Penttilä @ 2003-05-25 11:00 UTC (permalink / raw)
  To: Zwane Mwaikambo
  Cc: Ingo Molnar, Linux Kernel, Manfred Spraul, William Lee Irwin III



Zwane Mwaikambo wrote:

>On Sun, 25 May 2003, Ingo Molnar wrote:
>
>  
>
>>On Sun, 25 May 2003, Zwane Mwaikambo wrote:
>>
>>    
>>
>>>	if (prev->state & (TASK_DEAD | TASK_ZOMBIE))
>>>		put_task_struct(prev);
>>>      
>>>
>>we initialize tsk->usage with 2 in fork() - are you sure the removal of
>>the above code will not result in a memory leak?
>>    
>>
>
>Isn't current the forked task? Also we initialise the forked task's state 
>to TASK_UNINTERRUPTIBLE.
>
>	Zwane
>  
>

The put_task_struct() above is for dropping our own reference after we 
exit. The other reference gets dropped by who is waiting for us.

--Mika



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC][PATCH][2.5] Possible race in wait_task_zombie and finish_task_switch
  2003-05-25 11:00     ` Mika Penttilä
@ 2003-05-25 11:23       ` Manfred Spraul
  2003-05-25 11:29         ` Zwane Mwaikambo
  2003-05-25 20:31         ` William Lee Irwin III
  0 siblings, 2 replies; 7+ messages in thread
From: Manfred Spraul @ 2003-05-25 11:23 UTC (permalink / raw)
  To: Mika Penttilä
  Cc: Zwane Mwaikambo, Ingo Molnar, Linux Kernel, William Lee Irwin III

Do we have an idea which reference is miscounted? It seems that there 
are 4 different kinds of references to a task structure:

- the reference for the stack itself, acquired by setting usage to 2, 
dropped by schedule_tail.
- the reference for wait4, acquired by setting usage to 2, dropped by 
wait_task_zombie.
- references for the pid structures, maintained by pid.c
- temporary references for looking at tsk->{fs,mm,files,tty}, used by 
/proc, ptrace, tty.

>kernel BUG at kernel/sched.c:746!
>  
>
Hmm. What is schedule.c:746? There is no BUG in that area in the bk tree.

Zwane, is it easy to reproduce the crash? I could write a patch that 
adds 4 refcounters, then we could find out in which area we must look.

--
    Manfred


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC][PATCH][2.5] Possible race in wait_task_zombie and finish_task_switch
  2003-05-25 11:23       ` Manfred Spraul
@ 2003-05-25 11:29         ` Zwane Mwaikambo
  2003-05-25 20:31         ` William Lee Irwin III
  1 sibling, 0 replies; 7+ messages in thread
From: Zwane Mwaikambo @ 2003-05-25 11:29 UTC (permalink / raw)
  To: Manfred Spraul
  Cc: Mika Penttilä, Ingo Molnar, Linux Kernel,
	William Lee Irwin III

On Sun, 25 May 2003, Manfred Spraul wrote:

> - the reference for the stack itself, acquired by setting usage to 2, 
> dropped by schedule_tail.
> - the reference for wait4, acquired by setting usage to 2, dropped by 
> wait_task_zombie.
> - references for the pid structures, maintained by pid.c
> - temporary references for looking at tsk->{fs,mm,files,tty}, used by 
> /proc, ptrace, tty.

it's the one dropped by wait_task_zombie, the task coming out from 
schedule_tail is fine.

> 
> >kernel BUG at kernel/sched.c:746!
> >  
> >
> Hmm. What is schedule.c:746? There is no BUG in that area in the bk tree.

It's in finish_arch_switch at the put_task_struct()

> Zwane, is it easy to reproduce the crash? I could write a patch that 
> adds 4 refcounters, then we could find out in which area we must look.

I haven't found a direct way of triggering it, so far it's just been 
cropping up ~6 times over a period of 2days with the box normally taking a 
fatal one and dying completely.

	Zwane
-- 
function.linuxpower.ca

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [RFC][PATCH][2.5] Possible race in wait_task_zombie and finish_task_switch
  2003-05-25 11:23       ` Manfred Spraul
  2003-05-25 11:29         ` Zwane Mwaikambo
@ 2003-05-25 20:31         ` William Lee Irwin III
  1 sibling, 0 replies; 7+ messages in thread
From: William Lee Irwin III @ 2003-05-25 20:31 UTC (permalink / raw)
  To: Manfred Spraul; +Cc: Mika Penttil?, Zwane Mwaikambo, Ingo Molnar, Linux Kernel

On Sun, May 25, 2003 at 01:23:59PM +0200, Manfred Spraul wrote:
> Hmm. What is schedule.c:746? There is no BUG in that area in the bk tree.
> Zwane, is it easy to reproduce the crash? I could write a patch that 
> adds 4 refcounters, then we could find out in which area we must look.

There's a check in -mm that reads an otherwise unused chunk of the task_t
and checks to see if it's slab poison.


-- wli

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2003-05-25 20:18 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-05-25 10:11 [RFC][PATCH][2.5] Possible race in wait_task_zombie and finish_task_switch Zwane Mwaikambo
2003-05-25 10:27 ` Ingo Molnar
2003-05-25 10:29   ` Zwane Mwaikambo
2003-05-25 11:00     ` Mika Penttilä
2003-05-25 11:23       ` Manfred Spraul
2003-05-25 11:29         ` Zwane Mwaikambo
2003-05-25 20:31         ` William Lee Irwin III

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox