memory leak detector, 2.0.32, patch

Ingo Molnar (mingo@pc7537.hil.siemens.at)
Tue, 2 Dec 1997 02:17:56 +0100 (MET)


Here it is, the memory leak detector patch. Sorry about the delay, but i
had to rewrite it from scratch to get zero-CPU-cost.

Usage: everything that is needed to get memory leak detection running is
included in this mail. Apply the attached patch to 2.0.32,
recompile/install the kernel, reboot, thats all. It has mostly been tested
for stability so far, correctness wasnt checked too hard.

after rebooting, a new /proc entry should appear: /proc/memleak. This
oneliner script converts the file to human readable format:

cat /proc/memleak | cut -c12- | sort | gawk -- 'BEGIN{Y=0;}//{if ($0 == \
X) {Y=Y+1;} else {if (Y) printf ("%d\t %s\n", Y, X); Y=1;} X=$0}END{ \
printf \ ("%d\t %s\n", Y, $0);}'

sample output:
----------------------->
1 3c509.c:299
1 af_unix.c:417
8 aic7xxx.c:1857
1 aic7xxx.c:5322
1 aic7xxx.c:5488
159 buffer.c:1001
129 buffer.c:1349
<------------------------

first field is 'allocation count': the number of not-freed-yet buffers
that were allocated at that point. Second entry is the file:line pair, it
identifies the allocation point in the Linux source tree.

eg. the '8 aic7xxx.c:1857' line means: 'there are 8 outstanding
allocations that werent freed yet, in drivers/scsi/aic7xxx.c, line 1857'.

A 'memory leak' can be identified eg. the following way: save the above
output into a file every eg. 5 minutes, then watch how the system
'evolves', and check out constantly increasing (and never decreasing)
allocation points. Those are almost certainly memory leaks.

the detector covers 99.9% of all Linux buffer allocations in a finegrained
way: kmalloc/kfree, get_free_pages/free_pages and all the networking skb_*
allocations. The detector takes care of all kinds of cross-allocation
interaction, eg. kmalloc() allocating a page, etc., and (naturally)
handles the very typical 'allocate here, free there' allocation path
correctly as well.

The algorithms used are extremely fast [O(1) everywhere], so it should
make no visible speed difference on a running RL system. Memory object
structures are not touched as well. [i couldnt measure any slowdown on my
system]. It still contains lots of safety code. The hard work is done in
the user-space postprocessing script. Currently we waste 10% of real
memory with this detector. Those 10% are well spent IMO, but if there is
enough demand then it can be decreased to under 5%.

Also, i can add an 'object age' feature, this way we can see memory leaks
easily by sorting out older (ie. possibly never freed) memory objects.

Let me know if i've missed something. Comments, reports, flames welcome.

-- mingo

begin 600 memleak-2.0.32-patch.gz
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
@):T7XUMU4V=$I]*P0-TE%%_H#VPZ<?6_HJ^_P`]'``#L
`
end