Whenever the shrink_cache wakes up after a laundered page in unlocked, it should
move that page to the end of inactive list so that
the page can be freed immediately and shrink_cache dosen't have to wait for
complete list scan before freeing this page.
The patch is created against standard redhat 7.1 distribution 2.4.16 kernel.
Let me know if I need to create it for a different kernel release.
regards
Amol
--- vmscan_orig.c Mon Jan 7 11:47:43 2002
+++ vmscan.c Mon Jan 7 11:49:07 2002
@@ -387,6 +387,8 @@
wait_on_page(page);
page_cache_release(page);
spin_lock(&pagemap_lru_lock);
+ list_del(&page->lru);
+ list_add(&page->lru,inactive_list.prev);
}
continue;
}
Sorry...
I have corrected tha patch.
Thanks
Amol
--- vmscan_orig.c Fri Jan 11 13:55:25 2002
+++ vmscan.c Fri Jan 11 13:56:40 2002
@@ -387,6 +387,8 @@
wait_on_page(page);
page_cache_release(page);
spin_lock(&pagemap_lru_lock);
+ list_del(&page.lru);
+ list_add(&page.lru,inactive_list.prev);
}
continue;
}
Ken Brownfield <[email protected]> on 01/11/2002 12:34:09 PM
To: Amol Lad/HSS@HSS
cc:
Subject: Re: [PATCH] locked page handling in shrink_cache() : revised
FWIW, on a 2x933 P3, 256MB RAM, running "make -j36 bzImage".
--
Ken.
[email protected]
ksymoops 2.4.3 on i686 2.4.18-pre3kb0. Options used
-V (default)
-k ./ksyms (specified)
-l /proc/modules (default)
-o /lib/modules/2.4.18-pre3kb0/ (default)
-m /boot/System.map-x (specified)
kernel BUG at vmscan.c:387!
invalid operand: 0000
CPU: 0
EIP: 0010:[<c013092c>] Not tainted
Using defaults from ksymoops -t elf32-i386 -a i386
EFLAGS: 00010282
eax: 0000001c ebx: c13657dc ecx: c02d4568 edx: 00003998
esi: c13657c0 edi: 00000000 ebp: 00000010 esp: c9607ddc
ds: 0018 es: 0018 ss: 0018
Process cc1 (pid: 3110, stackpage=c9607000)
Stack: c027a710 00000183 00000020 000001d2 00000020 00000006 c1407070 0000006e
0000043f 000001d2 c02d5928 c0130e07 00000006 00000084 00000006 000001d2
c02d5928 000001d2 000032c6 c02d5928 c0130e71 00000020 00000000 00000000
Call Trace: [<c0130e07>] [<c0130e71>] [<c013193a>] [<c0131c23>] [<c012aab2>]
[<c01318c0>] [<c0126ba7>] [<c0126caf>] [<c0126ec4>] [<c0113d17>] [<c0113b88>]
[<c01282ee>] [<c0127345>] [<c01071fc>]
Code: 0f 0b 83 c4 08 8b 53 04 8b 03 89 50 04 89 02 a1 04 81 35 c0
>>EIP; c013092c <shrink_cache+e4/458> <=====
Trace; c0130e06 <shrink_caches+5a/90>
Trace; c0130e70 <try_to_free_pages+34/54>
Trace; c013193a <balance_classzone+76/240>
Trace; c0131c22 <__alloc_pages+11e/17c>
Trace; c012aab2 <filemap_nopage+10e/23c>
Trace; c01318c0 <_alloc_pages+18/1c>
Trace; c0126ba6 <do_anonymous_page+3a/110>
Trace; c0126cae <do_no_page+32/1ec>
Trace; c0126ec4 <handle_mm_fault+5c/bc>
Trace; c0113d16 <do_page_fault+18e/4e8>
Trace; c0113b88 <do_page_fault+0/4e8>
Trace; c01282ee <do_brk+11a/21c>
Trace; c0127344 <sys_brk+c0/f0>
Trace; c01071fc <error_code+34/3c>
Code; c013092c <shrink_cache+e4/458>
00000000 <_EIP>:
Code; c013092c <shrink_cache+e4/458> <=====
0: 0f 0b ud2a <=====
Code; c013092e <shrink_cache+e6/458>
2: 83 c4 08 add $0x8,%esp
Code; c0130930 <shrink_cache+e8/458>
5: 8b 53 04 mov 0x4(%ebx),%edx
Code; c0130934 <shrink_cache+ec/458>
8: 8b 03 mov (%ebx),%eax
Code; c0130936 <shrink_cache+ee/458>
a: 89 50 04 mov %edx,0x4(%eax)
Code; c0130938 <shrink_cache+f0/458>
d: 89 02 mov %eax,(%edx)
Code; c013093a <shrink_cache+f2/458>
f: a1 04 81 35 c0 mov 0xc0358104,%eax
On Tue, Jan 08, 2002 at 10:51:24AM +0530, [email protected] wrote:
|
|
|
| Whenever the shrink_cache wakes up after a laundered page in unlocked, it
should
| move that page to the end of inactive list so that
| the page can be freed immediately and shrink_cache dosen't have to wait for
| complete list scan before freeing this page.
|
| The patch is created against standard redhat 7.1 distribution 2.4.16 kernel.
| Let me know if I need to create it for a different kernel release.
|
| regards
| Amol
|
|
| --- vmscan_orig.c Mon Jan 7 11:47:43 2002
| +++ vmscan.c Mon Jan 7 11:49:07 2002
| @@ -387,6 +387,8 @@
| wait_on_page(page);
| page_cache_release(page);
| spin_lock(&pagemap_lru_lock);
| + list_del(&page->lru);
| + list_add(&page->lru,inactive_list.prev);
| }
| continue;
| }
|
|
|
|
| -
| To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
| the body of a message to [email protected]
| More majordomo info at http://vger.kernel.org/majordomo-info.html
| Please read the FAQ at http://www.tux.org/lkml/
Hughes Software Systems
From: [email protected]
Date: Fri, 11 Jan 2002 14:17:25 +0530
Sorry...
I have corrected tha patch.
+ list_del(&page.lru);
+ list_add(&page.lru,inactive_list.prev);
Did you try to compile this? :-) 'page' is a pointer, so
to dereference it's lru member you must use page->lru not
page.lru