Date: Thu, 1 Nov 2007 23:29:57 +0200 From: Kostik Belousov <kostikbel@gmail.com> To: "Arno J. Klaassen" <arno@heho.snv.jussieu.fr> Cc: freebsd-hackers@freebsd.org Subject: Re: "indefinite" wait buffer patch Message-ID: <20071101212957.GZ37471@deviant.kiev.zoral.com.ua> In-Reply-To: <wpsl3p1zvp.fsf@heho.snv.jussieu.fr> References: <wpsl3p1zvp.fsf@heho.snv.jussieu.fr>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
On Thu, Nov 01, 2007 at 09:20:42PM +0100, Arno J. Klaassen wrote:
> Hello,
>
>
> 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.
I think this is mostly good. See below.
>
> 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'.
This chunk would cause (non-silent) data corruption. Besides reboot,
the code is used when swap is turned off on live system.
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 @@
...
+ static int timo_secs = TIMO_START;
...
+ if (retry*TIMO_CHUNK > timo_secs) {
+ timo_secs = retry*TIMO_CHUNK;
Imagine that two buffers got the timeout on swap-in simultaneously.
I think that, instead, making timo_secs local variable would be right.
Also, timeout reading one buffer shall not increase the timeout swapping
in another one.
[-- Attachment #2 --]
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.4 (FreeBSD)
iD8DBQFHKkVUC3+MBN1Mb4gRAgjWAKDJrXg8thPMtMTC8wHGbSsYjsWXLgCguYBd
s4RAJQ+rNiAF7Qh9apE/qz0=
=c0cx
-----END PGP SIGNATURE-----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20071101212957.GZ37471>
