On Fri, 9 Feb 2001, Karsten Merker wrote: > Do other Linux/MIPS-targets besides the DECstations show similar problems > (kernel crash due to NULL-pointer dereference in __free_pages_ok just > after mounting the rootfs) or is this a decstation-specific effect? The > problems happens both on R3k and R4k (tested on 5000/20 and 5000/150). The following patch should fix it. Hmm, I wonder how it worked before at all... There is a related small fix for ARC included. Ralf, please apply these changes. Still 2.4.1 is rather unstable here -- it crashes silently under moderate system activity after boot. If nothing gets executed the system survives for long. A single `ls -la' is able to kill it if unfortunate enough, though. I'm still using 2.4.0-test12 taken on Jan 10, which is rock solid apart from a single libtool script which kills it repeatedly always at the same point (currently investigating it). Maciej -- + Maciej W. Rozycki, Technical University of Gdansk, Poland + +--------------------------------------------------------------+ + e-mail: macro@ds2.pg.gda.pl, PGP key available + patch-mips-2.4.1-20010208-mem_map-43 diff -up --recursive --new-file linux-mips-2.4.1-20010208.macro/arch/mips/arc/memory.c linux-mips-2.4.1-20010208/arch/mips/arc/memory.c --- linux-mips-2.4.1-20010208.macro/arch/mips/arc/memory.c Wed Jan 17 05:25:58 2001 +++ linux-mips-2.4.1-20010208/arch/mips/arc/memory.c Sun Feb 11 11:19:37 2001 @@ -145,7 +145,7 @@ prom_free_prom_memory (void) + boot_mem_map.map[i].size) { ClearPageReserved(virt_to_page(__va(addr))); set_page_count(virt_to_page(__va(addr)), 1); - free_page(__va(addr)); + free_page((unsigned long)__va(addr)); addr += PAGE_SIZE; freed += PAGE_SIZE; } diff -up --recursive --new-file linux-mips-2.4.1-20010208.macro/arch/mips/dec/prom/memory.c linux-mips-2.4.1-20010208/arch/mips/dec/prom/memory.c --- linux-mips-2.4.1-20010208.macro/arch/mips/dec/prom/memory.c Tue Dec 12 05:26:20 2000 +++ linux-mips-2.4.1-20010208/arch/mips/dec/prom/memory.c Sun Feb 11 11:41:12 2001 @@ -108,10 +108,10 @@ void __init prom_meminit(unsigned int ma rex_setup_memory_region(); } -void prom_free_prom_memory (void) +void __init prom_free_prom_memory (void) { unsigned long addr, end; - extern char _ftext; + extern char _ftext; /* * Free everything below the kernel itself but leave @@ -126,16 +126,16 @@ void prom_free_prom_memory (void) * XXX: save this address for use in dec_lance.c? */ if (IOASIC) - end = PHYSADDR(&_ftext) - 0x00020000; + end = __pa(&_ftext) - 0x00020000; else #endif - end = PHYSADDR(&_ftext); + end = __pa(&_ftext); addr = PAGE_SIZE; while (addr < end) { - ClearPageReserved(virt_to_page(addr)); - set_page_count(virt_to_page(addr), 1); - free_page(addr); + ClearPageReserved(virt_to_page(__va(addr))); + set_page_count(virt_to_page(__va(addr)), 1); + free_page((unsigned long)__va(addr)); addr += PAGE_SIZE; }