lkml.org 
[lkml]   [2011]   [Sep]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
SubjectRe: 3.0.1: pagevec_lookup+0x1d/0x30, SLAB issues?
From
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;
\
 
 \ /
  Last update: 2011-09-14 10:59    [W:0.782 / U:0.064 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site