* [PATCH] Fix kernel BUGs when enable SLOB allocator
@ 2006-06-26 12:51 Aubrey
2006-06-26 17:44 ` Nick Piggin
0 siblings, 1 reply; 3+ messages in thread
From: Aubrey @ 2006-06-26 12:51 UTC (permalink / raw)
To: linux-kernel
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@gmail.com>
------
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);
BUG_ON(page->index < 0);
------
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] Fix kernel BUGs when enable SLOB allocator
2006-06-26 12:51 [PATCH] Fix kernel BUGs when enable SLOB allocator Aubrey
@ 2006-06-26 17:44 ` Nick Piggin
2006-06-27 1:54 ` Aubrey
0 siblings, 1 reply; 3+ messages in thread
From: Nick Piggin @ 2006-06-26 17:44 UTC (permalink / raw)
To: Aubrey; +Cc: linux-kernel
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@gmail.com>
>
> ------
> 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
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Fix kernel BUGs when enable SLOB allocator
2006-06-26 17:44 ` Nick Piggin
@ 2006-06-27 1:54 ` Aubrey
0 siblings, 0 replies; 3+ messages in thread
From: Aubrey @ 2006-06-27 1:54 UTC (permalink / raw)
To: Nick Piggin; +Cc: linux-kernel
Hi Nick,
We are using SLOB allocator, why need to set PageSlab?
If later there come forth another type of allocator(SLEB, SLUB), Do we
still need to set PageSlab bit?
On the other hand, I'm not sure if the current SLOB code works
properly on the MMU system. If so, I think changing the nommu.c should
be a better solution.
Regards,
-Aubrey
On 6/27/06, Nick Piggin <nickpiggin@yahoo.com.au> wrote:
> 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
>
>
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2006-06-27 1:54 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-06-26 12:51 [PATCH] Fix kernel BUGs when enable SLOB allocator Aubrey
2006-06-26 17:44 ` Nick Piggin
2006-06-27 1:54 ` Aubrey
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox