Re: Hang on x86-64, 2.6.9-rc3-bk4

From: Nick Piggin
Date: Sat Oct 16 2004 - 20:27:11 EST


Jeff Garzik wrote:

Free pages: 2264kB (0kB HighMem)
Active:31606 inactive:78376 dirty:12 writeback:0 unstable:0 free:566 slab:16353 mapped:31544 pagetables:121
DMA free:80kB min:20kB low:40kB high:60kB active:0kB inactive:0kB present:16384kB
protections[]: 0 0 0
Normal free:2184kB min:700kB low:1400kB high:2100kB active:126424kB inactive:313504kB present:507840kB
protections[]: 0 0 0
HighMem free:0kB min:128kB low:256kB high:384kB active:0kB inactive:0kB present:0kB
protections[]: 0 0 0
DMA: 10*4kB 1*8kB 0*16kB 1*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 80kB
Normal: 8*4kB 31*8kB 11*16kB 10*32kB 4*64kB 1*128kB 0*256kB 0*512kB 1*1024kB 0*2048kB 0*4096kB = 2184kB
HighMem: empty
Swap cache: add 1976, delete 1938, find 120/152, race 0+0
Free swap: 2041740kB
131056 pages of RAM
3391 reserved pages
79434 pages shared
38 pages swap cached

No LRU pages in ZONE_DMA. Lots of crap stops working in these sorts of
corner cases. I have (unfortunately?) been fairly good at exposing these
latent bugs.

Can you try this patch. It A fixes the (rare) possibility that DMA might
have reclaimable slab (this shouldn't affect you); and B fixes
all_unreclaimable to at least have a hope of working when there are no
LRU pages.

Thanks.


---

linux-2.6-npiggin/mm/vmscan.c | 5 +++--
1 files changed, 3 insertions(+), 2 deletions(-)

diff -puN mm/vmscan.c~vm-fix mm/vmscan.c
--- linux-2.6/mm/vmscan.c~vm-fix 2004-10-17 11:14:02.000000000 +1000
+++ linux-2.6-npiggin/mm/vmscan.c 2004-10-17 11:20:55.000000000 +1000
@@ -181,7 +181,7 @@ static int shrink_slab(unsigned long sca
struct shrinker *shrinker;

if (scanned == 0)
- return 0;
+ scanned = 1;

if (!down_read_trylock(&shrinker_rwsem))
return 0;
@@ -1065,7 +1065,8 @@ scan:
total_reclaimed += sc.nr_reclaimed;
if (zone->all_unreclaimable)
continue;
- if (zone->pages_scanned > zone->present_pages * 2)
+ if (zone->pages_scanned > (zone->nr_active +
+ zone->nr_inactive) * 4)
zone->all_unreclaimable = 1;
/*
* If we've done a decent amount of scanning and

_