Hello, After studying dependencies I concluded the Flo's patch for R3k swapping is OK -- it correctly zeroes the valid and global bits of swapped-out PTEs. Additionally the R4k+ version didn't zero the global bit. Here is a patch I successfully tested using an NVRAM and a RAM-disk as swap devices on my R3k system. I took quite some time, but weird Oopses and init crashes were distracting me. It turned out these were signal delivery bugs (or at least that's what I suspect) that were not directly related to the patch but to the test environment I created (the bugs are still a mystery and are under investigation) -- without the patch they happen as well, usually under conditions near OOM. The patch consists mostly of the Flo's changes with R4k+ bits as well as comment updates added by me. Given enough virtual memory the patch works very well -- I've run `tar -jxf glibc-2.2.5.tar.bz2; rm -rf glibc-2.2.5' for a few hours in a loop which with RAM clipped to 16MB and 32MB of swap gives a considerable swap activity, with no problems noticed. Ralf, the patch is *CRITICAL* for R3k -- please apply it as soon as possible. The R4k+ update is not so important as MAX_SWAPFILES protects us, but it should go in anyway for correctness. Maciej -- + Maciej W. Rozycki, Technical University of Gdansk, Poland + +--------------------------------------------------------------+ + e-mail: macro@ds2.pg.gda.pl, PGP key available + patch-mips-2.4.17-20020129-swap-2 diff -up --recursive --new-file linux-mips-2.4.17-20020129.macro/include/asm-mips/pgtable.h linux-mips-2.4.17-20020129/include/asm-mips/pgtable.h --- linux-mips-2.4.17-20020129.macro/include/asm-mips/pgtable.h Fri Jan 25 05:27:42 2002 +++ linux-mips-2.4.17-20020129/include/asm-mips/pgtable.h Wed Feb 27 00:55:35 2002 @@ -165,7 +165,7 @@ extern int add_temporary_entry(unsigned #define _PAGE_SILENT_READ (1<<9) /* synonym */ #define _PAGE_DIRTY (1<<10) /* The MIPS dirty bit */ #define _PAGE_SILENT_WRITE (1<<10) -#define _CACHE_UNCACHED (1<<11) /* R4[0246]00 */ +#define _CACHE_UNCACHED (1<<11) #define _CACHE_MASK (1<<11) #define _CACHE_CACHABLE_NONCOHERENT 0 @@ -518,9 +518,19 @@ extern void paging_init(void); extern void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte); -#define SWP_TYPE(x) (((x).val >> 1) & 0x3f) +/* Swap entries must have VALID and GLOBAL bits cleared. */ +#if defined(CONFIG_CPU_R3000) || defined(CONFIG_CPU_TX39XX) + +#define SWP_TYPE(x) (((x).val >> 1) & 0x7f) +#define SWP_OFFSET(x) ((x).val >> 10) +#define SWP_ENTRY(type,offset) ((swp_entry_t) { ((type) << 1) | ((offset) << 10) }) +#else + +#define SWP_TYPE(x) (((x).val >> 1) & 0x1f) #define SWP_OFFSET(x) ((x).val >> 8) #define SWP_ENTRY(type,offset) ((swp_entry_t) { ((type) << 1) | ((offset) << 8) }) +#endif + #define pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) }) #define swp_entry_to_pte(x) ((pte_t) { (x).val })