2.2.13pre14 lockup caused by do_check_pgt_cache()

Mike Black (mblack@csihq.com)
Wed, 29 Sep 1999 07:34:15 -0400


Running 2.2.13pre14 SMP on Dual PIII/450 w/256Meg RAM compiled with
egcs-2.91.66, 2.2.12-ikd1, and raid0145-19990824-2.2.11

Lockup occurred in do_check_pgt_cache() -- this would jive with the reports
of lockups under heavy I/O...my application runs fine until vmstat shows
cache being maxed out and then locks up shortly thereafter (within about 10
seconds of max cache).

It looks like do_check_pgt_cache got stuck in it's loop. Not sure which
path it was following but it looks like get_pgd_fast->get_pgd_slow does NOT
always change pgtable_cache_size. get_pmd_fast does NOTHING, and
get_pte_fast decrements. I'm adding an escape counter inside the loop to
test further...(and disabling SMP).

int do_check_pgt_cache(int low, int high)
{
int freed = 0;
if(pgtable_cache_size > high) {
do {
if(pgd_quicklist)
free_pgd_slow(get_pgd_fast()), freed++;
if(pmd_quicklist)
free_pmd_slow(get_pmd_fast()), freed++;
if(pte_quicklist)
free_pte_slow(get_pte_fast()), freed++;
} while(pgtable_cache_size > low);
}
return freed;
}

extern __inline__ void free_pgd_slow(pgd_t *pgd)
{
free_page((unsigned long)pgd);
}

extern __inline__ void free_pmd_slow(pmd_t *pmd)
{
}

extern __inline__ void free_pte_slow(pte_t *pte)
{
free_page((unsigned long)pte);
}

extern __inline__ void free_pgd_fast(pgd_t *pgd)
{
*(unsigned long *)pgd = (unsigned long) pgd_quicklist;
pgd_quicklist = (unsigned long *) pgd;
pgtable_cache_size++;
}

extern __inline__ pgd_t *get_pgd_fast(void)
{
unsigned long *ret;

if((ret = pgd_quicklist) != NULL) {
pgd_quicklist = (unsigned long *)(*ret);
ret[0] = ret[1];
pgtable_cache_size--;
} else
ret = (unsigned long *)get_pgd_slow();
return (pgd_t *)ret;
}

________________________________________
Michael D. Black Principal Engineer
mblack@csi.cc 407-676-2923,x203
http://www.csi.cc Computer Science Innovations
http://www.csi.cc/~mike My home page
FAX 407-676-2355

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/