Date: 01 Nov 2007 21:20:42 +0100 From: "Arno J. Klaassen" <arno@heho.snv.jussieu.fr> To: freebsd-hackers@freebsd.org Subject: "indefinite" wait buffer patch Message-ID: <wpsl3p1zvp.fsf@heho.snv.jussieu.fr>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
while slowly testing releng_7, I remembered I have since about
two years the attached diff in my releng_6 sources (patch
recreated against releng_7 with low timeouts for debugging) :
it addresses the situation when one creates a huge swap-space on
a (relatively) slow disk-subsystem : e.g. for scientific computing
it sometimes makes sense to have, e.g. 8G swap for 2G main memory
if you know you're treating N less then 2G matrices and process
is CPU-bound for quite a while for 1 matrix before switching to
the other.
But then, when switching from one matrix to another, dmesg gets
flooded by :
"indefinite wait buffer"
messages.
The attached patch shows in fact that the wait buffer is never
"indefinite" (unless a real HW-problem probably) and linearly
increases timeout to match with reality.
The last chunk is just to prevent for a panic at reboot when
there is so much data swapped out that is doesn't get treated
before 'reboot-finish-time-out'.
With this patch, dmesg lookes like following (with low timeout
values, on production systems I use
TIMO_CHUNK 20
TIMO_START 1O
) :
Nov 1 20:09:52 install kernel: swap_pager: wait buffer timeout 1 (1 secs): bufobj: 0, blkno: 1649, size: 28672
Nov 1 20:09:52 install kernel: swap_pager: wait buffer timeout 2 (2 secs): bufobj: 0, blkno: 1649, size: 28672
Nov 1 20:09:52 install kernel: swap_pager: wait buffer completed (2 retry): bufobj: 0, blkno: 1649, size: 28672
Nov 1 20:37:09 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 329073, size: 32768
Nov 1 20:37:10 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 329073, size: 32768
Nov 1 20:39:06 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 381137, size: 32768
Nov 1 20:39:07 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 381137, size: 32768
Nov 1 20:39:11 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 381161, size: 32768
Nov 1 20:39:14 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 381161, size: 32768
Nov 1 20:39:19 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 381209, size: 32768
Nov 1 20:39:20 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 381209, size: 32768
Nov 1 20:43:18 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 300329, size: 32768
Nov 1 20:43:18 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 300329, size: 32768
Nov 1 20:44:23 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 330617, size: 32768
Nov 1 20:44:24 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 330617, size: 32768
Nov 1 20:44:28 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 330649, size: 32768
Nov 1 20:44:28 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 330649, size: 32768
Nov 1 20:44:33 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 330665, size: 32768
Nov 1 20:44:36 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 330665, size: 32768
Nov 1 20:45:18 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 356481, size: 32768
Nov 1 20:45:18 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 356481, size: 32768
Nov 1 20:45:23 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 356521, size: 32768
Nov 1 20:45:27 install kernel: swap_pager: wait buffer timeout 2 (4 secs): bufobj: 0, blkno: 356521, size: 32768
Nov 1 20:45:31 install kernel: swap_pager: wait buffer completed (2 retry): bufobj: 0, blkno: 356521, size: 32768
Nov 1 20:46:37 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 391113, size: 32768
Nov 1 20:46:37 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 391113, size: 32768
Nov 1 20:46:42 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 391129, size: 32768
Nov 1 20:46:45 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 391129, size: 32768
Nov 1 20:48:18 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 432249, size: 32768
Nov 1 20:48:18 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 432249, size: 32768
Nov 1 20:48:25 install kernel: swap_pager: wait buffer timeout 1 (4 secs): bufobj: 0, blkno: 432273, size: 32768
Nov 1 20:48:25 install kernel: swap_pager: wait buffer completed (1 retry): bufobj: 0, blkno: 432273, size: 32768
(And then the timeout of 8 secs apperently is enough for this test setup).
Any thoughts?
Regards,
Arno
[-- Attachment #2 --]
Index: sys/vm/swap_pager.c
===================================================================
RCS file: /home/ncvs/src/sys/vm/swap_pager.c,v
retrieving revision 1.295
diff -u -r1.295 swap_pager.c
--- sys/vm/swap_pager.c 5 Aug 2007 21:04:32 -0000 1.295
+++ sys/vm/swap_pager.c 1 Nov 2007 18:59:18 -0000
@@ -941,6 +941,10 @@
vm_page_t mreq;
int i;
int j;
+ int retry = 0;
+#define TIMO_CHUNK 2
+#define TIMO_START 1 /* set low to force quick first timeout */
+ static int timo_secs = TIMO_START;
daddr_t blk;
mreq = m[reqpage];
@@ -1066,16 +1070,28 @@
*/
VM_OBJECT_LOCK(object);
while ((mreq->oflags & VPO_SWAPINPROG) != 0) {
+ if (retry == 0) {
mreq->oflags |= VPO_WANTED;
vm_page_lock_queues();
vm_page_flag_set(mreq, PG_REFERENCED);
vm_page_unlock_queues();
PCPU_INC(cnt.v_intrans);
- if (msleep(mreq, VM_OBJECT_MTX(object), PSWP, "swread", hz*20)) {
+ }
+ if (msleep(mreq, VM_OBJECT_MTX(object), PSWP, "swread", hz*timo_secs)) {
printf(
-"swap_pager: indefinite wait buffer: bufobj: %p, blkno: %jd, size: %ld\n",
- bp->b_bufobj, (intmax_t)bp->b_blkno, bp->b_bcount);
+"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);
+ }
}
+
}
/*
@@ -1553,6 +1569,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);
@@ -1567,8 +1584,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);
[-- Attachment #3 --]
Arno J. Klaassen
SCITO S.A.
8 rue des Haies
F-75020 Paris, France
http://scito.com
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?wpsl3p1zvp.fsf>
