Re: [PATCH] Fix kernel BUGs when enable SLOB allocator

From: Nick Piggin
Date: Mon Jun 26 2006 - 13:43:22 EST


Aubrey wrote:
Hi all,

When enable the SLOB allocator on a nommu system(uClinux), the
following bug occurs when remove a large file.
=========================================================
root:~> cp /bin/busybox /busy
root:~> ls -l /bin/busybox /busy
-rwxr-xr-x 1 0 0 423904 /bin/busybox
-rwxr-xr-x 1 0 0 423904 /busy
root:~> md5sum /bin/busybox
7db253a2259ab71bc854c9e5dac544d6 /bin/busybox
root:~> md5sum /busy
7db253a2259ab71bc854c9e5dac544d6 /busy
root:~> rm /busy
kernel BUG at mm/nommu.c:124!
Kernel panic - not syncing: BUG!
=========================================================

The root cause is the slob allocator get the pages but does not set
the PageSlab bit.
So when kobjsize is called, the bug occurs.

My patch found a simple way to fix the issue. When SLOB is enabled, we
don't need to set the PageSlab bit, and don't need to check the
PageSlab bit(PageSlab(page)) in the kobjsize routine call.

Signed-off-by: Aubrey Li <aubrey.adi@xxxxxxxxx>

------
diff --git a/mm/nommu.c b/mm/nommu.c
index 029fada..8a54391 100644
--- a/mm/nommu.c
+++ b/mm/nommu.c
@@ -18,7 +18,9 @@ #include <linux/swap.h>
#include <linux/file.h>
#include <linux/highmem.h>
#include <linux/pagemap.h>
-#include <linux/slab.h>
+#ifdef CONFIG_SLAB
+# include <linux/slab.h>
+#endif
#include <linux/vmalloc.h>
#include <linux/ptrace.h>
#include <linux/blkdev.h>
@@ -112,7 +114,9 @@ unsigned int kobjsize(const void *objp)
if (!objp || !((page = virt_to_page(objp))))
return 0;

+#ifdef CONFIG_SLAB
if (PageSlab(page))
+#endif
return ksize(objp);

Then what if objp isn't a slob object?

I think the better fix would be to make slob set PageSlab.

--
SUSE Labs, Novell Inc.
Send instant messages to your online friends http://au.messenger.yahoo.com -
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/