[Crash-utility] [PATCH 1/2] Fix cpu_slab freelist handling on SLUB
Dave Anderson
anderson at redhat.com
Thu Apr 21 15:31:15 UTC 2016
----- Original Message -----
> Dave Anderson <anderson at redhat.com> writes:
>
> > ----- Original Message -----
> >> OGAWA Hirofumi <hirofumi at mail.parknet.co.jp> writes:
> >>
> >> OK. More simpler proof, the following is enough to convince you?
>
> [...]
>
> > But going back to the error report, the "slab: 0" is kind of confusing:
> >
> > crash> kmem -s kmalloc-32
> > CACHE NAME OBJSIZE ALLOCATED TOTAL SLABS
> > SSIZE
> > kmem: kmalloc-32: slab: 0 invalid freepointer: ffff001090e33f80
> > ffff880333001c00 kmalloc-32 32 122658 125440 980
> > 4k
> > crash>
>
> [...]
>
> > I'm thinking we should clarify that error message, perhaps by storing the cpu
> > number in si->cpu, and displaying it when si->slab is NULL?
>
> Just a idea for now though (means not tested error path at all), how
> about the following?
>
> We know already slab pointer at that point. So, this sets si->slab
> temporarily. (and slub_page_objects() just uses slab in argument, not
> si->slab).
OK great, that works nicely -- let's go with that.
Both patches are now queued for crash-7.1.5:
https://github.com/crash-utility/crash/commit/f6918567d72bd1ca98dd4119092e25157961e3c2
https://github.com/crash-utility/crash/commit/7f324a41449728fb0a1c36b2264a69aeb65a87b1
Thanks,
Dave
>
> Thanks.
>
> ---
>
> memory.c | 23 +++++++++++++++++------
> 1 file changed, 17 insertions(+), 6 deletions(-)
>
> diff -puN memory.c~crash-slub-freelist-error-fix memory.c
> --- crash-64/memory.c~crash-slub-freelist-error-fix 2016-04-21
> 05:04:11.660627253 +0900
> +++ crash-64-hirofumi/memory.c 2016-04-21 05:20:01.673010107 +0900
> @@ -17947,12 +17947,12 @@ static ushort slub_page_objects(struct m
> if (CRASHDEBUG(1) && (objects != si->objects))
> error(NOTE, "%s: slab: %lx oo objects: %ld "
> "slab objects: %d\n",
> - si->curname, si->slab,
> + si->curname, page,
> si->objects, objects);
>
> if (objects == (ushort)(-1)) {
> error(INFO, "%s: slab: %lx invalid page.objects: -1\n",
> - si->curname, si->slab);
> + si->curname, page);
> return 0;
> }
> } else
> @@ -18039,14 +18039,22 @@ get_kmem_cache_slub_data(long cmd, struc
>
> switch (cmd)
> {
> - case GET_SLUB_OBJECTS:
> + case GET_SLUB_OBJECTS: {
> + /* For better error report, set cur slab to si->slab. */
> + ulong orig_slab = si->slab;
> + si->slab = cpu_slab_ptr;
> +
> if (!readmem(cpu_slab_ptr + OFFSET(page_inuse),
> - KVADDR, &inuse, sizeof(short),
> - "page inuse", RETURN_ON_ERROR))
> + KVADDR, &inuse, sizeof(short),
> + "page inuse", RETURN_ON_ERROR)) {
> + si->slab = orig_slab;
> return FALSE;
> + }
> objects = slub_page_objects(si, cpu_slab_ptr);
> - if (!objects)
> + if (!objects) {
> + si->slab = orig_slab;
> return FALSE;
> + }
>
> free_objects += objects - inuse;
> free_objects += count_free_objects(si, cpu_freelist);
> @@ -18055,6 +18063,9 @@ get_kmem_cache_slub_data(long cmd, struc
> if (!node_total_avail)
> total_objects += inuse;
> total_slabs++;
> +
> + si->slab = orig_slab;
> + }
> break;
>
> case GET_SLUB_SLABS:
> _
> --
> OGAWA Hirofumi <hirofumi at mail.parknet.co.jp>
>
More information about the Crash-utility
mailing list