Re: [patch V3 01/32] mm/slab: Fix broken stack trace storage

From: Thomas Gleixner
Date: Sun Apr 14 2019 - 12:34:32 EST


On Sun, 14 Apr 2019, Andy Lutomirski wrote:
> > + struct stack_trace trace = {
> > + .max_entries = size - 4;
> > + .entries = addr;
> > + .skip = 3;
> > + };
>
> This looks correct, but I think that it would have been clearer if you
> left the size -= 3 above. You're still incrementing addr, but you're
> not decrementing size, so they're out of sync and the resulting code
> is hard to follow.

What about the below?

--- a/mm/slab.c
+++ b/mm/slab.c
@@ -1480,10 +1480,12 @@ static void store_stackinfo(struct kmem_
*addr++ = 0x12345678;
*addr++ = caller;
*addr++ = smp_processor_id();
+ size -= 3;
#ifdef CONFIG_STACKTRACE
{
struct stack_trace trace = {
- .max_entries = size - 4;
+ /* Leave one for the end marker below */
+ .max_entries = size - 1;
.entries = addr;
.skip = 3;
};