BUG : Memory leak in Linux 2.4.2 MIPS SMP kernel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux MIPS Home]     [LKML Archive]     [Linux ARM Kernel]     [Linux ARM]     [Linux]     [Git]     [Yosemite News]     [Linux SCSI]     [Linux Hams]

  Powered by Linux