Messages in this thread Patch in this message | | | Date | Wed, 14 Sep 2011 16:56:15 +0800 | Subject | Re: 3.0.1: pagevec_lookup+0x1d/0x30, SLAB issues? | From | Lin Ming <> |
| |
On Mon, Sep 12, 2011 at 6:44 AM, Justin Piszcz <jpiszcz@lucidpixels.com> wrote: > > > On Sun, 11 Sep 2011, Justin Piszcz wrote: > >> Hi, >> >> With 3.0.1 now and all options compiled in and threadirqs removed, I get >> the same error this user is seeing: >> http://www.gossamer-threads.com/lists/linux/kernel/1424997 >> > > Hello Lin, > > I missed your mail (sender IP is in a CIDR blacklist), disabled & > whitelisted for now: > http://marc.info/?l=linux-kernel&m=131567477126674&w=2 > > I've enabled this and I will post a new e-mail / output if it happens > again with debug enabled for SLAB. > > Response to your e-mail: > >> Could you tell how to reproduce this? > > Running a lot of processes at the same time (memory/cpu+i/o) > >> And would you please turn on more debug options to capture more info? > > Yup, done now; however, I am using SLAB, not SLUB; so I've enabled: > > -> [*] Debug slab memory allocations -> [*] Memory leak debugging -> [*] > Debug VM > >> CONFIG_SLUB_DEBUG=y >> CONFIG_SLUB_DEBUG_ON=y >> CONFIG_DEBUG_VM=y > > Please let me know if there are any other options you think would be useful > to enable or if this should be good, if it recurs again-- as noted above > I will post an update.
Hi, Justin
There is a similar bug report at: http://marc.info/?t=131594190600005&r=1&w=2
The attached patch from Shaohua fixed the bug.
Could you have a try it?
Lin Ming diff --git a/mm/filemap.c b/mm/filemap.c index 645a080..f177e96 100644 --- a/mm/filemap.c +++ b/mm/filemap.c @@ -827,13 +827,14 @@ unsigned find_get_pages(struct address_space *mapping, pgoff_t start, { unsigned int i; unsigned int ret; - unsigned int nr_found; + unsigned int nr_found, nr_skip; rcu_read_lock(); restart: nr_found = radix_tree_gang_lookup_slot(&mapping->page_tree, (void ***)pages, NULL, start, nr_pages); ret = 0; + nr_skip = 0; for (i = 0; i < nr_found; i++) { struct page *page; repeat: @@ -856,6 +857,7 @@ repeat: * here as an exceptional entry: so skip over it - * we only reach this from invalidate_mapping_pages(). */ + nr_skip++; continue; } @@ -876,7 +878,7 @@ repeat: * If all entries were removed before we could secure them, * try again, because callers stop trying once 0 is returned. */ - if (unlikely(!ret && nr_found)) + if (unlikely(!ret && nr_found && (nr_found != nr_skip))) goto restart; rcu_read_unlock(); return ret; | |