diff --git a/sys/sys/buf.h b/sys/sys/buf.h index a099a972efc0..a3e2c69773e4 100644 --- a/sys/sys/buf.h +++ b/sys/sys/buf.h @@ -143,6 +143,7 @@ struct buf { struct vm_page *b_pages[btoc(MAXPHYS)]; int b_npages; struct workhead b_dep; /* (D) List of filesystem dependencies. */ + int b_ticks; void *b_fsprivate1; void *b_fsprivate2; void *b_fsprivate3; diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c index 858a9e884626..57866227d804 100644 --- a/sys/vm/swap_pager.c +++ b/sys/vm/swap_pager.c @@ -1402,7 +1402,11 @@ swap_pager_putpages(vm_object_t object, vm_page_t *ma, int count, if (sync == TRUE) { bp = getpbuf(&nsw_wcount_sync); } else { + int oticks = ticks; bp = getpbuf(&nsw_wcount_async); + if ((ticks - oticks) / hz >= 3) + printf("waited %ds for swap buffer\n", + (ticks - oticks) / hz); bp->b_flags = B_ASYNC; } bp->b_flags |= B_PAGING; @@ -1454,6 +1458,7 @@ swap_pager_putpages(vm_object_t object, vm_page_t *ma, int count, * NOTE: b_blkno is destroyed by the call to swapdev_strategy */ if (sync == FALSE) { + bp->b_ticks = ticks; bp->b_iodone = swp_pager_async_iodone; BUF_KERNPROC(bp); swp_pager_strategy(bp); @@ -1511,6 +1516,11 @@ swp_pager_async_iodone(struct buf *bp) ); } + if (bp->b_iocmd == BIO_WRITE && (bp->b_flags & B_ASYNC) != 0 && + (ticks - bp->b_ticks) / hz >= 3) + printf("waited %ds for async swap write\n", + (ticks - bp->b_ticks) / hz); + /* * remove the mapping for kernel virtual */ diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index e7b6891d47ff..6044cdbcd60e 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -2946,6 +2946,7 @@ vm_wait_doms(const domainset_t *wdoms) * race-free vm_wait_domain(). */ if (curproc == pageproc) { + printf("thread %d waiting for memory\n", curthread->td_tid); mtx_lock(&vm_domainset_lock); vm_pageproc_waiters++; msleep(&vm_pageproc_waiters, &vm_domainset_lock, PVM | PDROP,