10aa028ffSDag-Erling Smørgrav.\"- 26e18fca1SUlrich Spörlein.\" Copyright (c) 2001 Dag-Erling Coïdan Smørgrav 30aa028ffSDag-Erling Smørgrav.\" All rights reserved. 40aa028ffSDag-Erling Smørgrav.\" 50aa028ffSDag-Erling Smørgrav.\" Redistribution and use in source and binary forms, with or without 60aa028ffSDag-Erling Smørgrav.\" modification, are permitted provided that the following conditions 70aa028ffSDag-Erling Smørgrav.\" are met: 80aa028ffSDag-Erling Smørgrav.\" 1. Redistributions of source code must retain the above copyright 90aa028ffSDag-Erling Smørgrav.\" notice, this list of conditions and the following disclaimer. 100aa028ffSDag-Erling Smørgrav.\" 2. Redistributions in binary form must reproduce the above copyright 110aa028ffSDag-Erling Smørgrav.\" notice, this list of conditions and the following disclaimer in the 120aa028ffSDag-Erling Smørgrav.\" documentation and/or other materials provided with the distribution. 130aa028ffSDag-Erling Smørgrav.\" 140aa028ffSDag-Erling Smørgrav.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 150aa028ffSDag-Erling Smørgrav.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 160aa028ffSDag-Erling Smørgrav.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 170aa028ffSDag-Erling Smørgrav.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 180aa028ffSDag-Erling Smørgrav.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 190aa028ffSDag-Erling Smørgrav.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 200aa028ffSDag-Erling Smørgrav.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 210aa028ffSDag-Erling Smørgrav.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 220aa028ffSDag-Erling Smørgrav.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 230aa028ffSDag-Erling Smørgrav.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 240aa028ffSDag-Erling Smørgrav.\" SUCH DAMAGE. 250aa028ffSDag-Erling Smørgrav.\" 260aa028ffSDag-Erling Smørgrav.\" $FreeBSD$ 270aa028ffSDag-Erling Smørgrav.\" 2807f490acSGleb Smirnoff.Dd March 21, 2013 290aa028ffSDag-Erling Smørgrav.Dt ZONE 9 300aa028ffSDag-Erling Smørgrav.Os 310aa028ffSDag-Erling Smørgrav.Sh NAME 32382682b2SJeroen Ruigrok van der Werven.Nm uma_zcreate , 337c32182eSJeroen Ruigrok van der Werven.Nm uma_zalloc , 346a4c41d1SRemko Lodder.Nm uma_zalloc_arg , 357c32182eSJeroen Ruigrok van der Werven.Nm uma_zfree , 366a4c41d1SRemko Lodder.Nm uma_zfree_arg , 3707f490acSGleb Smirnoff.Nm uma_find_refcnt , 38d7bbb21aSHartmut Brandt.Nm uma_zdestroy , 39c4ae7908SLawrence Stewart.Nm uma_zone_set_max, 40c4ae7908SLawrence Stewart.Nm uma_zone_get_max, 412f891cd5SPawel Jakub Dawidek.Nm uma_zone_get_cur, 422f891cd5SPawel Jakub Dawidek.Nm uma_zone_set_warning 43f5fccbbcSDag-Erling Smørgrav.Nd zone allocator 440aa028ffSDag-Erling Smørgrav.Sh SYNOPSIS 4532eef9aeSRuslan Ermilov.In sys/param.h 46f16b3c0dSChad David.In sys/queue.h 473a347a6eSJeroen Ruigrok van der Werven.In vm/uma.h 48382682b2SJeroen Ruigrok van der Werven.Ft uma_zone_t 499be1948fSRuslan Ermilov.Fo uma_zcreate 509be1948fSRuslan Ermilov.Fa "char *name" "int size" 519be1948fSRuslan Ermilov.Fa "uma_ctor ctor" "uma_dtor dtor" "uma_init uminit" "uma_fini fini" 526b99842aSEd Schouten.Fa "int align" "uint16_t flags" 539be1948fSRuslan Ermilov.Fc 549be1948fSRuslan Ermilov.Ft "void *" 559be1948fSRuslan Ermilov.Fn uma_zalloc "uma_zone_t zone" "int flags" 566a4c41d1SRemko Lodder.Ft "void *" 576a4c41d1SRemko Lodder.Fn uma_zalloc_arg "uma_zone_t zone" "void *arg" "int flags" 580aa028ffSDag-Erling Smørgrav.Ft void 59f1de92e6SJeroen Ruigrok van der Werven.Fn uma_zfree "uma_zone_t zone" "void *item" 605ca0c84eSThomas Moestl.Ft void 616a4c41d1SRemko Lodder.Fn uma_zfree_arg "uma_zone_t zone" "void *item" "void *arg" 6207f490acSGleb Smirnoff.Ft "uint32_t *" 6307f490acSGleb Smirnoff.Fn uma_find_refcnt "uma_zone_t zone" "void *item" 646a4c41d1SRemko Lodder.Ft void 65f1de92e6SJeroen Ruigrok van der Werven.Fn uma_zdestroy "uma_zone_t zone" 661c6cae97SLawrence Stewart.Ft int 67d7bbb21aSHartmut Brandt.Fn uma_zone_set_max "uma_zone_t zone" "int nitems" 68c4ae7908SLawrence Stewart.Ft int 69c4ae7908SLawrence Stewart.Fn uma_zone_get_max "uma_zone_t zone" 70c4ae7908SLawrence Stewart.Ft int 71c4ae7908SLawrence Stewart.Fn uma_zone_get_cur "uma_zone_t zone" 722f891cd5SPawel Jakub Dawidek.Ft void 732f891cd5SPawel Jakub Dawidek.Fn uma_zone_set_warning "uma_zone_t zone" "const char *warning" 740aa028ffSDag-Erling Smørgrav.Sh DESCRIPTION 750aa028ffSDag-Erling SmørgravThe zone allocator provides an efficient interface for managing 760aa028ffSDag-Erling Smørgravdynamically-sized collections of items of similar size. 770aa028ffSDag-Erling SmørgravThe zone allocator can work with preallocated zones as well as with 780aa028ffSDag-Erling Smørgravruntime-allocated ones, and is therefore available much earlier in the 790aa028ffSDag-Erling Smørgravboot process than other memory management routines. 800aa028ffSDag-Erling Smørgrav.Pp 810aa028ffSDag-Erling SmørgravA zone is an extensible collection of items of identical size. 820aa028ffSDag-Erling SmørgravThe zone allocator keeps track of which items are in use and which 83008080bdSJeroen Ruigrok van der Wervenare not, and provides functions for allocating items from the zone and 840aa028ffSDag-Erling Smørgravfor releasing them back (which makes them available for later use). 850aa028ffSDag-Erling Smørgrav.Pp 86ced699e3SRuslan ErmilovAfter the first allocation of an item, 8790d83886SJulian Elischerit will have been cleared to zeroes, however subsequent allocations 887251f557SKonstantin Belousovwill retain the contents as of the last free. 8990d83886SJulian Elischer.Pp 90382682b2SJeroen Ruigrok van der WervenThe 91382682b2SJeroen Ruigrok van der Werven.Fn uma_zcreate 92382682b2SJeroen Ruigrok van der Wervenfunction creates a new zone from which items may then be allocated from. 93382682b2SJeroen Ruigrok van der WervenThe 94382682b2SJeroen Ruigrok van der Werven.Fa name 95382682b2SJeroen Ruigrok van der Wervenargument is a text name of the zone for debugging and stats; this memory 96382682b2SJeroen Ruigrok van der Wervenshould not be freed until the zone has been deallocated. 97382682b2SJeroen Ruigrok van der Werven.Pp 984919e8cbSAlfred PerlsteinThe 994919e8cbSAlfred Perlstein.Fa ctor 1004919e8cbSAlfred Perlsteinand 1014919e8cbSAlfred Perlstein.Fa dtor 1024919e8cbSAlfred Perlsteinarguments are callback functions that are called by 1034919e8cbSAlfred Perlsteinthe uma subsystem at the time of the call to 1044919e8cbSAlfred Perlstein.Fn uma_zalloc 1054919e8cbSAlfred Perlsteinand 1064919e8cbSAlfred Perlstein.Fn uma_zfree 107d962d52aSRuslan Ermilovrespectively. 108d962d52aSRuslan ErmilovTheir purpose is to provide hooks for initializing or 1094919e8cbSAlfred Perlsteindestroying things that need to be done at the time of the allocation 110d962d52aSRuslan Ermilovor release of a resource. 111e07f1d5fSHiten PandyaA good usage for the 1124919e8cbSAlfred Perlstein.Fa ctor 1134919e8cbSAlfred Perlsteinand 1144919e8cbSAlfred Perlstein.Fa dtor 1154919e8cbSAlfred Perlsteincallbacks 1164919e8cbSAlfred Perlsteinmight be to adjust a global count of the number of objects allocated. 1174919e8cbSAlfred Perlstein.Pp 1184919e8cbSAlfred PerlsteinThe 1194919e8cbSAlfred Perlstein.Fa uminit 1204919e8cbSAlfred Perlsteinand 1214919e8cbSAlfred Perlstein.Fa fini 1224919e8cbSAlfred Perlsteinarguments are used to optimize the allocation of 123d962d52aSRuslan Ermilovobjects from the zone. 124d962d52aSRuslan ErmilovThey are called by the uma subsystem whenever 1254919e8cbSAlfred Perlsteinit needs to allocate or free several items to satisfy requests or memory 126d962d52aSRuslan Ermilovpressure. 127d962d52aSRuslan ErmilovA good use for the 128d962d52aSRuslan Ermilov.Fa uminit 129d962d52aSRuslan Ermilovand 130d962d52aSRuslan Ermilov.Fa fini 131d962d52aSRuslan Ermilovcallbacks might be to 132d962d52aSRuslan Ermilovinitialize and destroy mutexes contained within the object. 133d962d52aSRuslan ErmilovThis would 1344919e8cbSAlfred Perlsteinallow one to re-use already initialized mutexes when an object is returned 135d962d52aSRuslan Ermilovfrom the uma subsystem's object cache. 136d962d52aSRuslan ErmilovThey are not called on each call to 1374919e8cbSAlfred Perlstein.Fn uma_zalloc 1384919e8cbSAlfred Perlsteinand 1394919e8cbSAlfred Perlstein.Fn uma_zfree 1404919e8cbSAlfred Perlsteinbut rather in a batch mode on several objects. 1414919e8cbSAlfred Perlstein.Pp 142*b7e2b86cSGleb SmirnoffThe 143*b7e2b86cSGleb Smirnoff.Fa flags 144*b7e2b86cSGleb Smirnoffargument of the 145*b7e2b86cSGleb Smirnoff.Fn uma_zcreate 146*b7e2b86cSGleb Smirnoffis a subset of the following flags: 147*b7e2b86cSGleb Smirnoff.Bl -tag -width "foo" 148*b7e2b86cSGleb Smirnoff.It Dv UMA_ZONE_NOFREE 149*b7e2b86cSGleb SmirnoffSlabs of the zone are never returned back to VM. 150*b7e2b86cSGleb Smirnoff.It Dv UMA_ZONE_REFCNT 151*b7e2b86cSGleb SmirnoffEach item in the zone would have internal reference counter associated with it. 152*b7e2b86cSGleb SmirnoffSee 153*b7e2b86cSGleb Smirnoff.Fn uma_find_refcnt . 154*b7e2b86cSGleb Smirnoff.It Dv UMA_ZONE_NODUMP 155*b7e2b86cSGleb SmirnoffPages belonging to the zone will not be included into mini-dumps. 156*b7e2b86cSGleb Smirnoff.It Dv UMA_ZONE_OFFPAGE 157*b7e2b86cSGleb SmirnoffBy default book-keeping of items within a slab is done in the slab page itself. 158*b7e2b86cSGleb SmirnoffThis flag explicitly tells subsystem that book-keeping structure should be 159*b7e2b86cSGleb Smirnoffallocated separately from special internal zone. 160*b7e2b86cSGleb SmirnoffThis flag requires either 161*b7e2b86cSGleb Smirnoff.Dv UMA_ZONE_VTOSLAB 162*b7e2b86cSGleb Smirnoffor 163*b7e2b86cSGleb Smirnoff.Dv UMA_ZONE_HASH , 164*b7e2b86cSGleb Smirnoffsince subsystem requires a mechanism to find a book-keeping structure 165*b7e2b86cSGleb Smirnoffto an item beeing freed. 166*b7e2b86cSGleb SmirnoffThe subsystem may choose to prefer offpage book-keeping for certain zones 167*b7e2b86cSGleb Smirnoffimplicitly. 168*b7e2b86cSGleb Smirnoff.It Dv UMA_ZONE_ZINIT 169*b7e2b86cSGleb SmirnoffThe zone will have its 170*b7e2b86cSGleb Smirnoff.Ft uma_init 171*b7e2b86cSGleb Smirnoffmethod set to internal method that initializes a new allocated slab 172*b7e2b86cSGleb Smirnoffto all zeros. 173*b7e2b86cSGleb SmirnoffDon't mistake 174*b7e2b86cSGleb Smirnoff.Ft uma_init 175*b7e2b86cSGleb Smirnoffmethod with 176*b7e2b86cSGleb Smirnoff.Ft uma_ctor . 177*b7e2b86cSGleb SmirnoffA zone with 178*b7e2b86cSGleb Smirnoff.Dv UMA_ZONE_ZINIT 179*b7e2b86cSGleb Smirnoffflag would not return zeroed memory on every 180*b7e2b86cSGleb Smirnoff.Fn uma_zalloc . 181*b7e2b86cSGleb Smirnoff.It Dv UMA_ZONE_HASH 182*b7e2b86cSGleb SmirnoffThe zone should use an internal hash table to find slab book-keeping 183*b7e2b86cSGleb Smirnoffstructure where an allocation being freed belongs to. 184*b7e2b86cSGleb Smirnoff.It Dv UMA_ZONE_VTOSLAB 185*b7e2b86cSGleb SmirnoffThe zone should use special field of 186*b7e2b86cSGleb Smirnoff.Vt vm_page_t 187*b7e2b86cSGleb Smirnoffto find slab book-keeping structure where an allocation being freed belongs to. 188*b7e2b86cSGleb Smirnoff.It Dv UMA_ZONE_MALLOC 189*b7e2b86cSGleb SmirnoffThe zone is for the 190*b7e2b86cSGleb Smirnoff.Xr malloc 9 191*b7e2b86cSGleb Smirnoffsubsystem. 192*b7e2b86cSGleb Smirnoff.It Dv UMA_ZONE_VM 193*b7e2b86cSGleb SmirnoffThe zone is for the VM subsystem. 194*b7e2b86cSGleb Smirnoff.El 195*b7e2b86cSGleb Smirnoff.Pp 1960aa028ffSDag-Erling SmørgravTo allocate an item from a zone, simply call 1977c32182eSJeroen Ruigrok van der Werven.Fn uma_zalloc 1981437c79aSJeroen Ruigrok van der Wervenwith a pointer to that zone 1991437c79aSJeroen Ruigrok van der Wervenand set the 200acff84fbSJeroen Ruigrok van der Werven.Fa flags 201acff84fbSJeroen Ruigrok van der Wervenargument to selected flags as documented in 202acff84fbSJeroen Ruigrok van der Werven.Xr malloc 9 . 2031437c79aSJeroen Ruigrok van der WervenIt will return a pointer to an item if successful, 2041437c79aSJeroen Ruigrok van der Wervenor 2050aa028ffSDag-Erling Smørgrav.Dv NULL 2060aa028ffSDag-Erling Smørgravin the rare case where all items in the zone are in use and the 2071437c79aSJeroen Ruigrok van der Wervenallocator is unable to grow the zone 2082864c799SEdward Tomasz Napieralaand 2091437c79aSJeroen Ruigrok van der Werven.Dv M_NOWAIT 2101437c79aSJeroen Ruigrok van der Wervenis specified. 2110aa028ffSDag-Erling Smørgrav.Pp 2120aa028ffSDag-Erling SmørgravItems are released back to the zone from which they were allocated by 2130aa028ffSDag-Erling Smørgravcalling 2147c32182eSJeroen Ruigrok van der Werven.Fn uma_zfree 2150aa028ffSDag-Erling Smørgravwith a pointer to the zone and a pointer to the item. 21620ed0cb0SMatthew D FlemingIf 21720ed0cb0SMatthew D Fleming.Fa item 21820ed0cb0SMatthew D Flemingis 21920ed0cb0SMatthew D Fleming.Dv NULL , 22020ed0cb0SMatthew D Flemingthen 22120ed0cb0SMatthew D Fleming.Fn uma_zfree 22220ed0cb0SMatthew D Flemingdoes nothing. 2235ca0c84eSThomas Moestl.Pp 2246a4c41d1SRemko LodderThe variations 2256a4c41d1SRemko Lodder.Fn uma_zalloc_arg 2266a4c41d1SRemko Lodderand 2276a4c41d1SRemko Lodder.Fn uma_zfree_arg 2286a4c41d1SRemko Lodderallow to 2296a4c41d1SRemko Lodderspecify an argument for the 2306a4c41d1SRemko Lodder.Dv ctor 2316a4c41d1SRemko Lodderand 2326a4c41d1SRemko Lodder.Dv dtor 2336a4c41d1SRemko Lodderfunctions, respectively. 2346a4c41d1SRemko Lodder.Pp 23507f490acSGleb SmirnoffIf zone was created with 23607f490acSGleb Smirnoff.Dv UMA_ZONE_REFCNT 23707f490acSGleb Smirnoffflag, then pointer to reference counter for an item can be retrieved with 23807f490acSGleb Smirnoffhelp of the 23907f490acSGleb Smirnoff.Fn uma_find_refcnt 24007f490acSGleb Smirnofffunction. 24107f490acSGleb Smirnoff.Pp 24255407559SJeroen Ruigrok van der WervenCreated zones, 24355407559SJeroen Ruigrok van der Wervenwhich are empty, 2445ca0c84eSThomas Moestlcan be destroyed using 2457c32182eSJeroen Ruigrok van der Werven.Fn uma_zdestroy , 2465ca0c84eSThomas Moestlfreeing all memory that was allocated for the zone. 2475ca0c84eSThomas MoestlAll items allocated from the zone with 2487c32182eSJeroen Ruigrok van der Werven.Fn uma_zalloc 2495ca0c84eSThomas Moestlmust have been freed with 2507c32182eSJeroen Ruigrok van der Werven.Fn uma_zfree 2515ca0c84eSThomas Moestlbefore. 252d7bbb21aSHartmut Brandt.Pp 253c4ae7908SLawrence StewartThe 254d7bbb21aSHartmut Brandt.Fn uma_zone_set_max 255c4ae7908SLawrence Stewartfunction limits the number of items 256c4ae7908SLawrence Stewart.Pq and therefore memory 257c4ae7908SLawrence Stewartthat can be allocated to 258c4ae7908SLawrence Stewart.Fa zone . 259d7bbb21aSHartmut BrandtThe 260d7bbb21aSHartmut Brandt.Fa nitems 261c4ae7908SLawrence Stewartargument specifies the requested upper limit number of items. 2621c6cae97SLawrence StewartThe effective limit is returned to the caller, as it may end up being higher 2631c6cae97SLawrence Stewartthan requested due to the implementation rounding up to ensure all memory pages 2641c6cae97SLawrence Stewartallocated to the zone are utilised to capacity. 265c4ae7908SLawrence StewartThe limit applies to the total number of items in the zone, which includes 266d7bbb21aSHartmut Brandtallocated items, free items and free items in the per-cpu caches. 267d7bbb21aSHartmut BrandtOn systems with more than one CPU it may not be possible to allocate 268d7bbb21aSHartmut Brandtthe specified number of items even when there is no shortage of memory, 269d7bbb21aSHartmut Brandtbecause all of the remaining free items may be in the caches of the 270d7bbb21aSHartmut Brandtother CPUs when the limit is hit. 271c4ae7908SLawrence Stewart.Pp 272c4ae7908SLawrence StewartThe 273c4ae7908SLawrence Stewart.Fn uma_zone_get_max 274c4ae7908SLawrence Stewartfunction returns the effective upper limit number of items for a zone. 275c4ae7908SLawrence Stewart.Pp 276c4ae7908SLawrence StewartThe 277c4ae7908SLawrence Stewart.Fn uma_zone_get_cur 278c4ae7908SLawrence Stewartfunction returns the approximate current occupancy of the zone. 279c4ae7908SLawrence StewartThe returned value is approximate because appropriate synchronisation to 2803102cfe2SGlen Barberdetermine an exact value is not performed by the implementation. 281c4ae7908SLawrence StewartThis ensures low overhead at the expense of potentially stale data being used 282c4ae7908SLawrence Stewartin the calculation. 2832f891cd5SPawel Jakub Dawidek.Pp 2842f891cd5SPawel Jakub DawidekThe 2852f891cd5SPawel Jakub Dawidek.Fn uma_zone_set_warning 2862f891cd5SPawel Jakub Dawidekfunction sets a warning that will be printed on the system console when the 2872f891cd5SPawel Jakub Dawidekgiven zone becomes full and fails to allocate an item. 2882f891cd5SPawel Jakub DawidekThe warning will be printed not often than every five minutes. 2892f891cd5SPawel Jakub DawidekWarnings can be turned off globally by setting the 2902f891cd5SPawel Jakub Dawidek.Va vm.zone_warnings 2912f891cd5SPawel Jakub Dawideksysctl tunable to 2922f891cd5SPawel Jakub Dawidek.Va 0 . 2930aa028ffSDag-Erling Smørgrav.Sh RETURN VALUES 2940aa028ffSDag-Erling SmørgravThe 2957c32182eSJeroen Ruigrok van der Werven.Fn uma_zalloc 2960aa028ffSDag-Erling Smørgravfunction returns a pointer to an item, or 2970aa028ffSDag-Erling Smørgrav.Dv NULL 2982864c799SEdward Tomasz Napieralaif the zone ran out of unused items 2992864c799SEdward Tomasz Napieralaand 3002864c799SEdward Tomasz Napierala.Dv M_NOWAIT 3012864c799SEdward Tomasz Napieralawas specified. 3020aa028ffSDag-Erling Smørgrav.Sh SEE ALSO 3030aa028ffSDag-Erling Smørgrav.Xr malloc 9 3040aa028ffSDag-Erling Smørgrav.Sh HISTORY 3050aa028ffSDag-Erling SmørgravThe zone allocator first appeared in 3060aa028ffSDag-Erling Smørgrav.Fx 3.0 . 3079a795583SJeroen Ruigrok van der WervenIt was radically changed in 3089a795583SJeroen Ruigrok van der Werven.Fx 5.0 3099a795583SJeroen Ruigrok van der Wervento function as a slab allocator. 3100aa028ffSDag-Erling Smørgrav.Sh AUTHORS 3110aa028ffSDag-Erling Smørgrav.An -nosplit 3120aa028ffSDag-Erling SmørgravThe zone allocator was written by 3130aa028ffSDag-Erling Smørgrav.An John S. Dyson . 3149a795583SJeroen Ruigrok van der WervenThe zone allocator was rewritten in large parts by 3159a795583SJeroen Ruigrok van der Werven.An Jeff Roberson Aq jeff@FreeBSD.org 3169a795583SJeroen Ruigrok van der Wervento function as a slab allocator. 3170aa028ffSDag-Erling Smørgrav.Pp 3180aa028ffSDag-Erling SmørgravThis manual page was written by 31909e06539SDag-Erling Smørgrav.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org . 3209a795583SJeroen Ruigrok van der WervenChanges for UMA by 3219a795583SJeroen Ruigrok van der Werven.An Jeroen Ruigrok van der Werven Aq asmodai@FreeBSD.org . 322