[PATCH] nommu: fix kobjsize() for SLOB and SLUB

Pekka J Enberg
2008-05-22T16:09:19Z

From: Christoph Lameter <clameter@sgi.com>

As reported by Paul Mundt, kobjsize() does not work properly with SLOB and SLUB
that re-use parts of struct page for their own purposes. Fix it up by using
compound_order() for compound pages that don't have PageSlab set.

Reported-by: Paul Mundt <lethal@linux-sh.org>
Cc: Christoph Lameter <clameter@sgi.com>
Signed-off-by: Pekka Enberg <penberg@cs.helsinki.fi>
---
I kept the original object size calculation for non-compound pages in this
version. It looks like the nommu code uses kobjsize() for all sorts of
interesting things.

mm/nommu.c | 14 +++++++++-----
1 files changed, 9 insertions(+), 5 deletions(-)

Index: slab-2.6/mm/nommu.c
===================================================================
--- slab-2.6.orig/mm/nommu.c 2008-05-22 18:59:01.000000000 +0300
+++ slab-2.6/mm/nommu.c 2008-05-22 19:00:36.000000000 +0300
@@ -109,12 +109,22 @@
* If the object we have should not have ksize performed on it,
* return size of 0
*/
- if (!objp || (unsigned long)objp >= memory_end || !((page = virt_to_page(objp))))
+ if (!objp)
+ return 0;
+
+ if ((unsigned long) objp >= memory_end)
+ return 0;
+
+ page = virt_to_head_page(objp);
+ if (!page)
return 0;

if (PageSlab(page))
return ksize(objp);

+ if (PageCompound(page))
+ return PAGE_SIZE << compound_order(page);
+
BUG_ON(page->index < 0);
BUG_ON(page->index >= MAX_ORDER);