Re: 2.6.16-rc1-mm3

From: Michal Piotrowski
Date: Thu Jan 26 2006 - 14:57:07 EST


Hi,

On 26/01/06, Nick Piggin <nickpiggin@xxxxxxxxxxxx> wrote:
[snip]
> Thanks, it confirms my suspicions.
>
> Can you try the following patch, please?
> It appears the warnings were brought out by my improvement to
> the put_page_testzero debugging code (which previously did not
> check that we might be attempting to free a constituent compound
> page).
>
> Can you test the following patch please?
>
> --
> SUSE Labs, Novell Inc.
>
>
> Index: linux-2.6/include/linux/mm.h
> ===================================================================
> --- linux-2.6.orig/include/linux/mm.h
> +++ linux-2.6/include/linux/mm.h
> @@ -15,6 +15,7 @@
> #include <linux/prio_tree.h>
> #include <linux/fs.h>
> #include <linux/mutex.h>
> +#include <linux/kallsyms.h>
>
> struct mempolicy;
> struct anon_vma;
> @@ -264,6 +265,8 @@ struct page {
> void *virtual; /* Kernel virtual address (NULL if
> not kmapped, ie. highmem) */
> #endif /* WANT_PAGE_VIRTUAL */
> +
> + void *debug;
> };
>
> #define page_private(page) ((page)->private)
> @@ -294,8 +297,14 @@ struct page {
> */
> static inline int put_page_testzero(struct page *page)
> {
> - BUG_ON(atomic_read(&page->_count) == 0);
> - return atomic_dec_and_test(&page->_count);
> + if (unlikely(atomic_read(&page->_count) == 0)) {
> + printk(KERN_WARNING "put_page_testzero found free page (flags = %lx)\n", page->flags);
> + if (page->debug)
> + print_symbol(KERN_WARNING "nopage is %s\n", (unsigned long)page->debug);
> + WARN_ON(1);
> + return 0;
> + } else
> + return atomic_dec_and_test(&page->_count);
> }
>
> /*
> Index: linux-2.6/mm/memory.c
> ===================================================================
> --- linux-2.6.orig/mm/memory.c
> +++ linux-2.6/mm/memory.c
> @@ -2056,6 +2056,8 @@ retry:
> if (new_page == NOPAGE_OOM)
> return VM_FAULT_OOM;
>
> + new_page->debug = (struct address_space *)vma->vm_ops->nopage;
> +
> /*
> * Should we do an early C-O-W break?
> */
> Index: linux-2.6/mm/page_alloc.c
> ===================================================================
> --- linux-2.6.orig/mm/page_alloc.c
> +++ linux-2.6/mm/page_alloc.c
> @@ -521,6 +521,8 @@ static int prep_new_page(struct page *pa
> if (PageReserved(page))
> return 1;
>
> + page->debug = NULL;
> +
> page->flags &= ~(1 << PG_uptodate | 1 << PG_error |
> 1 << PG_referenced | 1 << PG_arch_1 |
> 1 << PG_checked | 1 << PG_mappedtodisk);
>
>
>

I have tried this patch, here is dmesg:
http://www.stardust.webpages.pl/files/mm/2.6.16-rc1-mm3/mm-dmesg

Regards,
Michal Piotrowski
-
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/