Hi,
Here is the bug we found in the Linux 2.4.2 MIPS SMP kernel and the
fix for the bug.
1. Summary:
Memory leak in Linux 2.4.2 MIPS SMP kernel
2. Description:
Memory leak happens whenever a process is created and destroyed.
Whatever memory allocated during process creation is not getting
freed when the process exits. This problem can be easily reproduced
by writing any program/script which does a lot of process creation
and termination. my test script is
while true
do
cat /proc/meminfo
ls /bin
cat /proc/slabinfo
end
when /proc/slabinfo is printed, we can see that size of 32-byte
memory chunks growing indefinitely and eventually causing the
following panic:
kernel BUG at page_alloc.c:75!
Unable to handle kernel paging request at virtual address 00000000, epc ==
8013bcdc, ra == 8013bcdc
Oops in fault.c:do_page_fault, line 172:
$0 : 00000000 10009f00 0000001f 0000000a
$4 : 802afc10 00000001 00000001 00000000
$8 : 802d7636 b0060170 0000001f 0000000d
$12: 00000000 0000001f 10009f00 0000000a
$16: 80329f50 80329f50 00000000 00657a03
$20: 8053000c 806451a0 80b785a0 ffc00000
$24: 802d7617 8036dca1
$28: 8036c000 8036de08 806451a0 8013bcdc
epc : 000000008013bcdc
Status : 10009f03
Cause : 1080000c
BadAddr: 00000000ffc00000Process kswapd (pid: 5, stackpage=8036c000)
Stack: 80253434 8025344c 0000004b 00000001 806451a0 00403000 80329f50 00403000
00000001 00657a03 8053000c 806451a0 80b785a0 ffc00000 806451a0 8013cba8
00403000 00000000 80329f50 00403000 801395fc 8013967c 00000000 00000000
00000000 00000000 00000000 00000000 00657a03 00000000 00000000 00000000
00000000 00000000 00403000 8053000c 00000007 00424000 80b785a0 806451a0
ffc00000 ...
Call Trace: [<80253434>] [<8025344c>] [<8013cba8>] [<801395fc>] [<8013967c>]
[<801398b8>]
[<801399d8>] [<80139ab0>] [<80136a30>] [<8013b42c>] [<80139c1c>] [<80139c24>]
[<80162fa8>] [<8013b3e8>] [<8013b4a0>] [<8013b524>] [<8013b55c>] [<80107d38>]
[<80108d9c>] [<80108d8c>]
3. Keywords
mips, SMP, memory leak
4. Kernel version
Linux version 2.4.2
5. Output
(included as part of description)
6. testcase
(included as part of description)
7. Environment
7.1 software
None
7.2 Processor info
(NOTE *** cat /proc/cpuinfo does not print information about
both the CPUs ***)
cpu : MIPS
processor : 0
cpu model : SiByte SB1 V0.1
BogoMIPS : 332.59
processor : 1
cpu model : SiByte SB1 V0.1
BogoMIPS : 332.59
system type : SiByte unknown
byteorder : big endian
unaligned accesses : 0
wait instruction : no
microsecond timers : no
extra interrupt vector : yes
hardware watchpoint : no
VCED exceptions : not available
VCEI exceptions : not available
7.3 Module information
No modules.
7.4 Loaded driver and hardware information (/proc/ioports, /proc/iomem)
bash-2.04# cat /proc/ioports
bash-2.04# cat /proc/iomem
00000000-0fe94fff : System RAM
00100000-00267d77 : Kernel code
00299a40-002ad38f : Kernel data
7.5 PCI information
No PCI devices attached
7.6 SCSI information
No SCSI devices attached
7.7 Other information
8. Fix
I found that the bug is in destroy_context() in include/asm-mips/mmu_context.h.
destroy_context() is supposed to kfree() the memory that is allocated by
init_new_context() but it is not doing that.
I modified destroy_context as follows:
/*
* Destroy context related info for an mm_struct that is about
* to be put to rest.
*/
extern inline void destroy_context(struct mm_struct *mm)
{
#ifdef CONFIG_SMP
kfree((void *)mm->context);
#else
/* Nothing to do. */
#endif
}
And when I tested this I do not see the memory leak any more.
Krishna Kondaka
Sanera Systems Inc.
krishna@sanera.net
|