1Kernel Memory Leak Detector
   7Kmemleak provides a way of detecting possible kernel memory leaks in a
   8way similar to a tracing garbage collector
  10with the difference that the orphan objects are not freed but only
  11reported via /sys/kernel/debug/kmemleak. A similar method is used by the
  12Valgrind tool (memcheck --leak-check) to detect the memory leaks in
  13user-space applications.
  18CONFIG_DEBUG_KMEMLEAK in "Kernel hacking" has to be enabled. A kernel
  19thread scans the memory every 10 minutes (by default) and prints the
  20number of new unreferenced objects found. To display the details of all
  21the possible memory leaks:
  23  # mount -t debugfs nodev /sys/kernel/debug/
  24  # cat /sys/kernel/debug/kmemleak
  26To trigger an intermediate memory scan:
  28  # echo scan > /sys/kernel/debug/kmemleak
  30To clear the list of all current possible memory leaks:
  32  # echo clear > /sys/kernel/debug/kmemleak
  34New leaks will then come up upon reading /sys/kernel/debug/kmemleak
  37Note that the orphan objects are listed in the order they were allocated
  38and one object at the beginning of the list may cause other subsequent
  39objects to be reported as orphan.
  41Memory scanning parameters can be modified at run-time by writing to the
  42/sys/kernel/debug/kmemleak file. The following parameters are supported:
  44  off           - disable kmemleak (irreversible)
  45  stack=on      - enable the task stacks scanning (default)
  46  stack=off     - disable the tasks stacks scanning
  47  scan=on       - start the automatic memory scanning thread (default)
  48  scan=off      - stop the automatic memory scanning thread
  49  scan=<secs>   - set the automatic memory scanning period in seconds
  50                  (default 600, 0 to stop the automatic scanning)
  51  scan          - trigger a memory scan
  52  clear         - clear list of current memory leak suspects, done by
  53                  marking all current reported unreferenced objects grey
  54  dump=<addr>   - dump information about the object found at <addr>
  56Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on
  57the kernel command line.
  59Memory may be allocated or freed before kmemleak is initialised and
  60these actions are stored in an early log buffer. The size of this buffer
  61is configured via the CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE option.
  63Basic Algorithm
  66The memory allocations via kmalloc, vmalloc, kmem_cache_alloc and
  67friends are traced and the pointers, together with additional
  68information like size and stack trace, are stored in a prio search tree.
  69The corresponding freeing function calls are tracked and the pointers
  70removed from the kmemleak data structures.
  72An allocated block of memory is considered orphan if no pointer to its
  73start address or to any location inside the block can be found by
  74scanning the memory (including saved registers). This means that there
  75might be no way for the kernel to pass the address of the allocated
  76block to a freeing function and therefore the block is considered a
  77memory leak.
  79The scanning algorithm steps:
  81  1. mark all objects as white (remaining white objects will later be
  82     considered orphan)
  83  2. scan the memory starting with the data section and stacks, checking
  84     the values against the addresses stored in the prio search tree. If
  85     a pointer to a white object is found, the object is added to the
  86     gray list
  87  3. scan the gray objects for matching addresses (some white objects
  88     can become gray and added at the end of the gray list) until the
  89     gray set is finished
  90  4. the remaining white objects are considered orphan and reported via
  91     /sys/kernel/debug/kmemleak
  93Some allocated memory blocks have pointers stored in the kernel's
  94internal data structures and they cannot be detected as orphans. To
  95avoid this, kmemleak can also store the number of values pointing to an
  96address inside the block address range that need to be found so that the
  97block is not considered a leak. One example is __vmalloc().
  99Testing specific sections with kmemleak
 102Upon initial bootup your /sys/kernel/debug/kmemleak output page may be
 103quite extensive. This can also be the case if you have very buggy code
 104when doing development. To work around these situations you can use the
 105'clear' command to clear all reported unreferenced objects from the
 106/sys/kernel/debug/kmemleak output. By issuing a 'scan' after a 'clear'
 107you can find new unreferenced objects; this should help with testing
 108specific sections of code.
 110To test a critical section on demand with a clean kmemleak do:
 112  # echo clear > /sys/kernel/debug/kmemleak
 113  ... test your kernel or modules ...
 114  # echo scan > /sys/kernel/debug/kmemleak
 116Then as usual to get your report with:
 118  # cat /sys/kernel/debug/kmemleak
 120Kmemleak API
 123See the include/linux/kmemleak.h header for the functions prototype.
 125kmemleak_init            - initialize kmemleak
 126kmemleak_alloc           - notify of a memory block allocation
 127kmemleak_free            - notify of a memory block freeing
 128kmemleak_not_leak        - mark an object as not a leak
 129kmemleak_ignore          - do not scan or report an object as leak
 130kmemleak_scan_area       - add scan areas inside a memory block
 131kmemleak_no_scan         - do not scan a memory block
 132kmemleak_erase           - erase an old value in a pointer variable
 133kmemleak_alloc_recursive - as kmemleak_alloc but checks the recursiveness
 134kmemleak_free_recursive  - as kmemleak_free but checks the recursiveness
 136Dealing with false positives/negatives
 139The false negatives are real memory leaks (orphan objects) but not
 140reported by kmemleak because values found during the memory scanning
 141point to such objects. To reduce the number of false negatives, kmemleak
 142provides the kmemleak_ignore, kmemleak_scan_area, kmemleak_no_scan and
 143kmemleak_erase functions (see above). The task stacks also increase the
 144amount of false negatives and their scanning is not enabled by default.
 146The false positives are objects wrongly reported as being memory leaks
 147(orphan). For objects known not to be leaks, kmemleak provides the
 148kmemleak_not_leak function. The kmemleak_ignore could also be used if
 149the memory block is known not to contain other pointers and it will no
 150longer be scanned.
 152Some of the reported leaks are only transient, especially on SMP
 153systems, because of pointers temporarily stored in CPU registers or
 154stacks. Kmemleak defines MSECS_MIN_AGE (defaulting to 1000) representing
 155the minimum age of an object to be reported as a memory leak.
 157Limitations and Drawbacks
 160The main drawback is the reduced performance of memory allocation and
 161freeing. To avoid other penalties, the memory scanning is only performed
 162when the /sys/kernel/debug/kmemleak file is read. Anyway, this tool is
 163intended for debugging purposes where the performance might not be the
 164most important requirement.
 166To keep the algorithm simple, kmemleak scans for values pointing to any
 167address inside a block's address range. This may lead to an increased
 168number of false negatives. However, it is likely that a real memory leak
 169will eventually become visible.
 171Another source of false negatives is the data stored in non-pointer
 172values. In a future version, kmemleak could only scan the pointer
 173members in the allocated structures. This feature would solve many of
 174the false negative cases described above.
 176The tool can report false positives. These are cases where an allocated
 177block doesn't need to be freed (some cases in the init_call functions),
 178the pointer is calculated by other methods than the usual container_of
 179macro or the pointer is stored in a location not scanned by kmemleak.
 181Page allocations and ioremap are not tracked. Only the ARM and x86
 182architectures are currently supported.
 183 kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.