public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Ingo Molnar <mingo@elte.hu>
Cc: Catalin Marinas <catalin.marinas@gmail.com>,
	Pekka J Enberg <penberg@cs.helsinki.fi>,
	linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2.6.17-rc6 7/9] Remove some of the kmemleak false positives
Date: Tue, 13 Jun 2006 22:53:58 -0700	[thread overview]
Message-ID: <448FA476.8000705@goop.org> (raw)
In-Reply-To: <20060614040707.GA7503@elte.hu>

Ingo Molnar wrote:
> For a GC a false negative is no big problem - it will reduce the 
> efficiency of the GC a bit, but that's all. For leak detection, if we 
> happen to have a persistent false pointer in .data (or any other 
> persistently allocated memory), it may prevent the detection of a leak 
> permanently - at least for that bootup. Statistically it could still be 
> found on other systems, but it would be better to have a design that 
> will eventually lead to having no false negatives.
>
> But it's not just about the amount of false negatives, but also about 
> the overhead of scanning. You are concentrated on embedded systems with 
> small RAM - but most of the testers will be running this with at last 
> 1GB of RAM - which is _alot_ of memory to scan.
>   
It seems to me that most types with any pointers are fairly 
pointer-dense.  There's not much point in trying to skip a couple of 
non-pointers nested among a dozen others; once you've worn the cost of 
pulling in the cache line there's not much else to worry about.  The 
most useful thing is to distinguish between completely pointerless 
allocations and allocations which have pointers.  Pointerless 
allocations are generally just data (strings, numbers, user data), and 
so are a waste of effort to scan, and possibly full of false pointers.  
In the kernel, you could probably do it by making it a property of 
slabs, assume all kmalloc allocations are pointerful (perhaps add 
GFP_POINTERLESS), and make sure all user-data pages are considered 
pointerless.

False pointers in kernel allocations can be avoided in a few ways.  The 
first, obviously, is the make sure all memory is initialized to a known 
non-pointer value.  The second is to ignore pointers which don't point 
near the start of an allocated region (possibly unsafe in the kernel, 
depending on the definition of "near").  You can get more sophisticated 
from there; the Boehm GC keeps tracks of things which look like pointers 
but turn out not to be (they don't point to allocated memory); it marks 
that memory as being unusable, so that the false pointer won't get 
mistaken for one later on, with the obvious risk that lots of false 
pointers can render large parts of your heap address space unusable.

In general, false pointers aren't a huge problem.  They'll generally 
lead to a bounded number of allocations being unreported as leaks; its 
highly unlikely that a large heap graph will remain hidden from a leak 
checker forever; espectially since kernel pointers are fairly unlike 
other kinds of data (large enough to not be aliased to most normal 
integer values, don't look like strings, and there are no FP numbers in 
the kernel).

> (But, if it's not possible to implement it in a sane manner then that's 
> not an issue either - it's rather the false positives that must be 
> avoided.)
>   

There's some risk of false positives.  You can imagine cases where the 
last reference to a block is transformed into a bus address, and in 
effect a piece of hardware holds it.  You don't get to know about the 
pointer until the hardware gives it back.  You might want a GFP_ROOT 
flag (or whatever), to mark a block as being always referenced in order 
to suppress these cases.

> there are a couple of possibilities.
>
> If the ID is string based then you dont even have to touch containr_of() 
> calls - just generate the typename string via the "#y" stringification 
> preprocessor directive, where 'y' is the second parameter of 
> container_of().
> [...]
> it needs some thought, but this way it's quite possible to build-time 
> map types to IDs.
>   

This seems pretty over-engineered.  I wouldn't go this far unless you're 
actually seeing performance/correctness problems, and a simple 
with/without pointers flag isn't enough.  It also doesn't address the 
most troublesome source of false pointers: stacks.  There is all sorts 
of junk lying around on stacks, and you can have an old dead pointer 
sitting there pinning old dead memory for a long time.

    J

  parent reply	other threads:[~2006-06-14  5:54 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-06-11 11:18 [PATCH 2.6.17-rc6 0/9] Kernel memory leak detector 0.7 Catalin Marinas
2006-06-11 11:21 ` [PATCH 2.6.17-rc6 1/9] Base support for kmemleak Catalin Marinas
2006-06-13 11:14   ` Pekka Enberg
2006-06-13 12:47     ` Catalin Marinas
2006-06-11 11:21 ` [PATCH 2.6.17-rc6 2/9] Some documentation " Catalin Marinas
2006-06-11 11:21 ` [PATCH 2.6.17-rc6 3/9] Add the memory allocation/freeing hooks " Catalin Marinas
2006-06-11 11:21 ` [PATCH 2.6.17-rc6 4/9] Modules support " Catalin Marinas
2006-06-11 11:21 ` [PATCH 2.6.17-rc6 5/9] Add kmemleak support for i386 Catalin Marinas
2006-06-11 11:21 ` [PATCH 2.6.17-rc6 6/9] Add kmemleak support for ARM Catalin Marinas
2006-06-11 11:21 ` [PATCH 2.6.17-rc6 7/9] Remove some of the kmemleak false positives Catalin Marinas
2006-06-12  5:19   ` Pekka Enberg
2006-06-12  8:11     ` Catalin Marinas
2006-06-12  8:17       ` Pekka J Enberg
2006-06-12  8:43         ` Catalin Marinas
2006-06-12 10:53         ` Ingo Molnar
2006-06-12 11:08           ` Pekka J Enberg
2006-06-12 11:36             ` Ingo Molnar
2006-06-12 11:56               ` Pekka J Enberg
2006-06-12 12:53                 ` Catalin Marinas
2006-06-12 13:12                 ` Ingo Molnar
2006-06-12 14:38                   ` Catalin Marinas
2006-06-12 22:29                   ` Catalin Marinas
2006-06-12 12:56           ` Catalin Marinas
2006-06-12 19:22             ` Ingo Molnar
2006-06-12 22:24               ` Catalin Marinas
2006-06-13  5:53               ` Pekka J Enberg
2006-06-13  6:59                 ` Catalin Marinas
2006-06-13  7:57                   ` Pekka J Enberg
2006-06-13  9:45                     ` Catalin Marinas
2006-06-13 10:04                       ` Pekka Enberg
2006-06-13 10:37                         ` Catalin Marinas
2006-06-13  7:26                 ` Ingo Molnar
2006-06-13  8:11                   ` Pekka J Enberg
2006-06-13 10:49                   ` Catalin Marinas
2006-06-14  4:07                     ` Ingo Molnar
2006-06-14  5:46                       ` Andi Kleen
2006-06-14  5:53                       ` Jeremy Fitzhardinge [this message]
2006-06-14 12:03                         ` Ingo Molnar
2006-06-14 13:46                           ` Catalin Marinas
2006-06-14 13:35                         ` Catalin Marinas
2006-06-14 13:21                       ` Catalin Marinas
2006-06-12  9:17       ` Peter Zijlstra
2006-06-12  9:35         ` Catalin Marinas
2006-06-24 10:20     ` Catalin Marinas
2006-06-24 10:22       ` Ingo Molnar
2006-06-24 10:55         ` Catalin Marinas
2006-07-24 11:15         ` Ingo Molnar
2006-07-24 13:28           ` Catalin Marinas
2006-08-03  6:32             ` Jakub Jelinek
2006-08-03  8:31               ` Catalin Marinas
2006-06-11 11:22 ` [PATCH 2.6.17-rc6 8/9] Simple testing for kmemleak Catalin Marinas
2006-06-11 11:22 ` [PATCH 2.6.17-rc6 9/9] Keep the __init functions after initialization Catalin Marinas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=448FA476.8000705@goop.org \
    --to=jeremy@goop.org \
    --cc=catalin.marinas@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=penberg@cs.helsinki.fi \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox