Re: [RFC] kmemcheck: trap uses of uninitialized memory (v2)

From: Vegard Nossum
Date: Thu Nov 29 2007 - 04:11:23 EST


Hi,

On Nov 29, 2007 9:02 AM, Pekka Enberg <penberg@xxxxxxxxxxxxxx> wrote:
> Hi Vegard,
>
> On Nov 27, 2007 5:16 PM, Vegard Nossum <vegard.nossum@xxxxxxxxx> wrote:
> > +config KMEMCHECK
> > + bool "Trap use of uninitialized memory"
> > + depends on X86_32 && !CC_OPTIMIZE_FOR_SIZE
> > + help
> > + This option enables tracing of dynamically allocated kernel memory
> > + to see if memory is used before it has been given an initial value.
> > + Be aware that this requires half of your memory for bookkeeping and
> > + will insert extra code at *every* read and write to tracked memory
> > + thus slow down the kernel code (but user code is unaffected).
>
> Is it really necessary to track every memory address? Tracking slab
> objects would require far less memory. You might also want to make
> kzalloc() and GFP_ZERO mark the memory area as initialized to avoid
> some page faults.

Yes, we are in fact only tracking the memory within SLUB allocations
(minus what SLUB itself needs for bookkeeping -- like the caches).
Maybe the Kconfig text was unclear?

As for the kzalloc() and GFP_ZERO, I believe these will write zeros to
the data in question before the memory is returned to the caller. In
that case, the area will be "automatically" set to initialized since
these writes are also intercepted by kmemcheck. If not, I will have to
investigate some more :-)

> On Nov 27, 2007 5:16 PM, Vegard Nossum <vegard.nossum@xxxxxxxxx> wrote:
> > + /* Actually allocate twice as much, since we need to track the
> > + * status of each byte within the allocation. */
> > + if (!(flags & __GFP_NOTRACK)) {
>
> If you change __GFP_NOTRACK to __GFP_TRACK, you can avoid the double
> negation here.

I deliberately chose this form. Here is my rationale: By default, when
kmemcheck is enabled, we want to track as much as possible. So every
"normal" allocation should be tracked. It seems easier to make an
exception for the pages that should *not* be tracked (like the SLUB
caches, DMA allocations), since this group of allocations is much
smaller than the group of allocations that should be tracked.

I could embed __GFP_TRACK into GFP_KERNEL, but then I would have to
mask this out at every non-tracked allocation, which leaves us with
the exact opposite problem, just in a different place.

Thank you for looking :)

>
> Pekka
>

Vegard
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/