Index: sys/vm/swap_pager.c =================================================================== RCS file: /home/ncvs/src/sys/vm/swap_pager.c,v retrieving revision 1.273.2.2 diff -u -r1.273.2.2 swap_pager.c --- sys/vm/swap_pager.c 10 May 2006 07:00:08 -0000 1.273.2.2 +++ sys/vm/swap_pager.c 2 Jun 2006 21:20:01 -0000 @@ -972,6 +972,9 @@ vm_page_t mreq; int i; int j; + int retry = 0; +#define TIMO_CHUNK 1 + static int timo_secs = 20; /* set low to force quick first timeout */ daddr_t blk; mreq = m[reqpage]; @@ -1099,13 +1102,23 @@ */ vm_page_lock_queues(); while ((mreq->flags & PG_SWAPINPROG) != 0) { - vm_page_flag_set(mreq, PG_WANTED | PG_REFERENCED); - cnt.v_intrans++; - if (msleep(mreq, &vm_page_queue_mtx, PSWP, "swread", hz*20)) { - printf( -"swap_pager: indefinite wait buffer: bufobj: %p, blkno: %jd, size: %ld\n", - bp->b_bufobj, (intmax_t)bp->b_blkno, bp->b_bcount); + if (retry == 0) { + vm_page_flag_set(mreq, PG_WANTED | PG_REFERENCED); + cnt.v_intrans++; } + if (msleep(mreq, &vm_page_queue_mtx, PSWP, "swread", hz*timo_secs)) { + printf( +"swap_pager: wait buffer timeout %d (%d secs): bufobj: %p, blkno: %jd, size: %ld\n", + ++retry, timo_secs, bp->b_bufobj, (intmax_t)bp->b_blkno, bp->b_bcount); + if ( retry+TIMO_CHUNK > timo_secs) { + timo_secs = retry+TIMO_CHUNK; + } + } else { + if (retry > 0) { + printf( +"swap_pager: wait buffer completed (%d retry): bufobj: %p, blkno: %jd, size: %ld\n", + retry, bp->b_bufobj, (intmax_t)bp->b_blkno, bp->b_bcount); + }} } vm_page_unlock_queues(); @@ -1584,6 +1597,7 @@ swp_pager_force_pagein(vm_object_t object, vm_pindex_t pindex) { vm_page_t m; + int ret; vm_object_pip_add(object, 1); m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL|VM_ALLOC_RETRY); @@ -1598,8 +1612,18 @@ return; } - if (swap_pager_getpages(object, &m, 1, 0) != VM_PAGER_OK) - panic("swap_pager_force_pagein: read from swap failed");/*XXX*/ + if ((ret=swap_pager_getpages(object, &m, 1, 0)) != VM_PAGER_OK) { + if (ret == VM_PAGER_FAIL) { + printf("swp_pager_force_pagein: VM_PAGER_FAIL\n"); + } + else { + if (ret == VM_PAGER_ERROR) { + printf("swp_pager_force_pagein: VM_PAGER_ERROR\n"); + } + else + panic("swap_pager_force_pagein: read from swap failed");/*XXX*/ + } + } vm_object_pip_subtract(object, 1); vm_page_lock_queues(); vm_page_dirty(m);