On Wed, 5 Nov 2014, Andrey Ryabinin wrote: > Adding __printf(3, 4) to slab_err exposed following: > > mm/slub.c: In function ‘check_slab’: > mm/slub.c:852:4: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 4 has type ‘const char *’ [-Wformat=] > s->name, page->objects, maxobj); > ^ > mm/slub.c:852:4: warning: too many arguments for format [-Wformat-extra-args] > mm/slub.c:857:4: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 4 has type ‘const char *’ [-Wformat=] > s->name, page->inuse, page->objects); > ^ > mm/slub.c:857:4: warning: too many arguments for format [-Wformat-extra-args] > Wow, that's an ancient issue, thanks for finding it. > mm/slub.c: In function ‘on_freelist’: > mm/slub.c:905:4: warning: format ‘%d’ expects argument of type ‘int’, but argument 5 has type ‘long unsigned int’ [-Wformat=] > "should be %d", page->objects, max_objects); > > Signed-off-by: Andrey Ryabinin <a.ryabinin@xxxxxxxxxxx> > Cc: Christoph Lameter <cl@xxxxxxxxx> > Cc: Pekka Enberg <penberg@xxxxxxxxxx> > Cc: David Rientjes <rientjes@xxxxxxxxxx> > Cc: Joonsoo Kim <iamjoonsoo.kim@xxxxxxx> > --- > mm/slub.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/mm/slub.c b/mm/slub.c > index 80c170e..850a94a 100644 > --- a/mm/slub.c > +++ b/mm/slub.c > @@ -849,12 +849,12 @@ static int check_slab(struct kmem_cache *s, struct page *page) > maxobj = order_objects(compound_order(page), s->size, s->reserved); > if (page->objects > maxobj) { > slab_err(s, page, "objects %u > max %u", > - s->name, page->objects, maxobj); > + page->objects, maxobj); > return 0; > } > if (page->inuse > page->objects) { > slab_err(s, page, "inuse %u > max %u", > - s->name, page->inuse, page->objects); > + page->inuse, page->objects); > return 0; > } > /* Slab_pad_check fixes things up after itself */ > @@ -902,7 +902,7 @@ static int on_freelist(struct kmem_cache *s, struct page *page, void *search) > > if (page->objects != max_objects) { > slab_err(s, page, "Wrong number of objects. Found %d but " > - "should be %d", page->objects, max_objects); > + "should be %ld", page->objects, max_objects); > page->objects = max_objects; > slab_fix(s, "Number of objects adjusted."); > } Instead of this hunk, I think that max_objects should be declared as int rather than unsigned long since that's what order_objects() returns and it is being compared to page->objects which is also int.