[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <Pine.LNX.4.64.0805221907250.4056@sbz-30.cs.Helsinki.FI>
Date: Thu, 22 May 2008 19:09:04 +0300 (EEST)
From: Pekka J Enberg <penberg@...helsinki.fi>
To: dhowells@...hat.com
cc: clameter@....com, mpm@...enic.com, lethal@...ux-sh.org,
linux-kernel@...r.kernel.org
Subject: [PATCH] nommu: fix kobjsize() for SLOB and SLUB
From: Christoph Lameter <clameter@....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@...ux-sh.org>
Cc: Christoph Lameter <clameter@....com>
Signed-off-by: Pekka Enberg <penberg@...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);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists