Annotation of XNU/osfmk/default_pager/default_pager.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
        !             3:  *
        !             4:  * @APPLE_LICENSE_HEADER_START@
        !             5:  * 
        !             6:  * The contents of this file constitute Original Code as defined in and
        !             7:  * are subject to the Apple Public Source License Version 1.1 (the
        !             8:  * "License").  You may not use this file except in compliance with the
        !             9:  * License.  Please obtain a copy of the License at
        !            10:  * http://www.apple.com/publicsource and read it before using this file.
        !            11:  * 
        !            12:  * This Original Code and all software distributed under the License are
        !            13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
        !            14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
        !            15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
        !            16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
        !            17:  * License for the specific language governing rights and limitations
        !            18:  * under the License.
        !            19:  * 
        !            20:  * @APPLE_LICENSE_HEADER_END@
        !            21:  */
        !            22: /*
        !            23:  * @OSF_COPYRIGHT@
        !            24:  */
        !            25: /*
        !            26:  * HISTORY
        !            27:  * $Log: default_pager.c,v $
        !            28:  * Revision 1.1.1.1  2000/03/25 21:02:54  wsanchez
        !            29:  * Import of xnu-68.4
        !            30:  *
        !            31:  * Revision 1.5  2000/01/26 05:56:22  wsanchez
        !            32:  * Add APSL
        !            33:  *
        !            34:  * Revision 1.4  1999/07/20 02:55:34  lindak
        !            35:  * Merged PR-2291281-1 into Beaker (magee Kernel Components kobject groupings)
        !            36:  *
        !            37:  * Revision 1.3.674.1  1999/07/20 00:33:02  jmagee
        !            38:  * Workaround for partial EMMI components work
        !            39:  *
        !            40:  * Revision 1.3  1999/02/24 16:55:12  wsanchez
        !            41:  * PR-2308031
        !            42:  *
        !            43:  * Revision 1.2.168.1  1999/02/23 20:43:52  semeria
        !            44:  * Component Header files phase 1
        !            45:  *
        !            46:  * Revision 1.2  1998/12/01 00:24:41  wsanchez
        !            47:  * Merged in CDY_DP1 (chris: default pager)
        !            48:  *
        !            49:  * Revision 1.1.2.2  1998/11/25 21:32:17  youngwor
        !            50:  * fix errant comment format
        !            51:  *
        !            52:  * Revision 1.1.2.1  1998/11/24 22:39:57  youngwor
        !            53:  * Check-in of support for the in-kernel default pager
        !            54:  *
        !            55:  * Revision 1.1.1.1  1998/03/07 02:26:31  wsanchez
        !            56:  * Import of OSF Mach kernel (~mburg)
        !            57:  *
        !            58:  * Revision 1.2.84.2  1997/03/27  18:45:15  barbou
        !            59:  *     submit adidtional picco changes
        !            60:  *     [1996/09/12  22:09:29  robert]
        !            61:  *     AXP pool merge.
        !            62:  *     [97/02/25            barbou]
        !            63:  *
        !            64:  * Revision 1.2.84.1  1996/11/29  16:54:38  stephen
        !            65:  *     nmklinux_1.0b3_shared into pmk1.1
        !            66:  *     Added -v option (verbose flag) and tests before warning printfs
        !            67:  *     [1996/07/29  12:25:54  stephen]
        !            68:  * 
        !            69:  * Revision 1.2.34.16  1996/07/31  06:41:45  paire
        !            70:  *     Merged with nmk20b7_shared (1.2.77.1)
        !            71:  *     [96/05/30            paire]
        !            72:  * 
        !            73:  * Revision 1.2.77.1  1996/04/12  06:30:58  paire
        !            74:  *     Changed signature of default_pager_thread to (void ()(void *)).
        !            75:  *     Replaced bzero() by memset().
        !            76:  *     [96/01/30            paire]
        !            77:  * 
        !            78:  * Revision 1.2.34.15  1995/08/21  20:52:09  devrcs
        !            79:  *     Initialize dpt_initialized_p element of
        !            80:  *     default_pager_thread_tb and set it to true after thread starts
        !            81:  *     up.  Wait until all threads have signalled ready before
        !            82:  *     telling the bootstrap process that it's ok to go ahead.
        !            83:  *     [95/07/10            randys]
        !            84:  * 
        !            85:  * Revision 1.2.34.14  1995/06/12  18:44:00  dwm
        !            86:  *     ri-osc CR1394 - allow argument from bootstrap to set cluster size,
        !            87:  *     Usage: default_pager clsize=4 sd0b, for example
        !            88:  *     [1995/06/12  18:40:21  dwm]
        !            89:  * 
        !            90:  * Revision 1.2.34.13  1995/05/31  07:55:10  emcmanus
        !            91:  *     Use mach_msg instead of mach_msg_overwrite_trap so that message
        !            92:  *     operations can be interrupted without provoking a default-pager
        !            93:  *     panic.  Remote gdb does this.
        !            94:  *     [1995/05/31  07:54:21  emcmanus]
        !            95:  * 
        !            96:  * Revision 1.2.34.12  1995/05/25  20:36:39  mmp
        !            97:  *     Removed TEMPORARILY_USE_OLD_INIT and the !TEMPORARILY_USE_OLD_INIT
        !            98:  *     code.  The change to use m_o_init was not temporary.
        !            99:  *     [1995/05/25  19:59:17  mmp]
        !           100:  * 
        !           101:  * Revision 1.2.34.11  1995/04/07  18:50:57  barbou
        !           102:  *     Merged into mainline:
        !           103:  *     Revision 1.2.34.10  1995/02/27  18:24:08  mmp
        !           104:  *        Replaced m_o_notify with m_o_init; used m_o_change_attributes
        !           105:  *        instead of m_o_establish; removed m_o_rejected.
        !           106:  *        [1995/02/27  18:22:40  mmp]
        !           107:  *     Revision 1.2.34.9  1995/02/23  21:15:48  alanl
        !           108:  *        Use system_priority instead of server_priority.  Fix locking
        !           109:  *        with regards to pager_extend!
        !           110:  *        Merged with DIPC2_SHARED.
        !           111:  *        [1995/02/23  21:14:55  alanl]
        !           112:  *     [95/03/08            barbou]
        !           113:  * 
        !           114:  *     VM-MK6 Merge.
        !           115:  *     Started from the modified b26 file.
        !           116:  *     Integrated the following MK6 changes:
        !           117:  * 
        !           118:  *     Fix ri-osc CR846:  Avoid use of fixed BASEPRI_SYSTEM; use new
        !           119:  *     host_info() interface to determine priority dynamically.
        !           120:  *     [1994/12/23  15:39:32  bolinger]
        !           121:  *     mk6 CR668 - 1.3b26 merge
        !           122:  *     Correct local btodb() def; change port_to_ds() et al. to work
        !           123:  *     with port names returned by current merged kernel.
        !           124:  *     [1994/12/03  02:10:30  bolinger]
        !           125:  *     mk6 CR668 - 1.3b26 merge
        !           126:  *     Did not bring forward PAGING_MEMORY support.  Did bring forward
        !           127:  *     NORMA support -- can be deleted when proven no longer needed.
        !           128:  *     [1994/11/10  15:32:12  bolinger]
        !           129:  *     [95/01/10            barbou]
        !           130:  *     [95/03/08            barbou]
        !           131:  * 
        !           132:  * Revision 1.2.56.2  1995/02/13  14:40:41  barbou
        !           133:  *     VM-MK6 Merge.
        !           134:  *     Started from the modified b26 file.
        !           135:  *     Integrated the following MK6 changes:
        !           136:  * 
        !           137:  *     Fix ri-osc CR846:  Avoid use of fixed BASEPRI_SYSTEM; use new
        !           138:  *     host_info() interface to determine priority dynamically.
        !           139:  *     [1994/12/23  15:39:32  bolinger]
        !           140:  *     mk6 CR668 - 1.3b26 merge
        !           141:  *     Correct local btodb() def; change port_to_ds() et al. to work
        !           142:  *     with port names returned by current merged kernel.
        !           143:  *     [1994/12/03  02:10:30  bolinger]
        !           144:  *     mk6 CR668 - 1.3b26 merge
        !           145:  *     Did not bring forward PAGING_MEMORY support.  Did bring forward
        !           146:  *     NORMA support -- can be deleted when proven no longer needed.
        !           147:  *     [1994/11/10  15:32:12  bolinger]
        !           148:  *     [95/01/10            barbou]
        !           149:  * 
        !           150:  * Revision 1.2.46.3  1994/11/02  14:57:23  barbou
        !           151:  *     Use new task_swappable() interface to make our task unswappable.
        !           152:  *     [94/11/02            barbou]
        !           153:  * 
        !           154:  * Revision 1.2.46.2  1994/10/10  15:28:48  barbou
        !           155:  *     VM Merge - Default Pager Clustering.
        !           156:  * 
        !           157:  *     Also split this file in three:
        !           158:  *             default_pager.c contains code that deals with threads and
        !           159:  *                     incoming messages.
        !           160:  *             dp_memory_object.c contains memory object management code.
        !           161:  *             dp_backing_store.c contains backing store management code.
        !           162:  *     [94/10/10            barbou]
        !           163:  * 
        !           164:  * Revision 1.2.6.23  1994/05/16  16:43:50  jph
        !           165:  *     CR8809 -- Fix messages when paging space is exhausted.
        !           166:  *     CR10905 -- Disallow overlapped paging areas.
        !           167:  *     [1994/05/16  16:43:04  jph]
        !           168:  * 
        !           169:  * Revision 1.2.6.22  1994/04/01  18:42:34  jph
        !           170:  *     CR10550 -- Add backing store info interfaces.
        !           171:  *     CR10718 -- Fix pagein error path.
        !           172:  *     [1994/04/01  18:40:13  jph]
        !           173:  * 
        !           174:  * Revision 1.2.6.21  1994/03/04  18:34:49  jeffc
        !           175:  *     CR10636 -- delete all NMK15_COMPAT support.
        !           176:  *     [1994/03/04  14:50:44  jeffc]
        !           177:  * 
        !           178:  * Revision 1.2.6.20  1994/02/16  14:22:24  jph
        !           179:  *     CR10554 -- Multi-page requests now handled, albeit crudely.
        !           180:  *     Fixed leak in data_request for partial page reads.
        !           181:  *     Tidied up code to be at least consistent.
        !           182:  *     Fixed ASSERTIONS option and bad assert (name_refs in terminate).
        !           183:  *     [1994/02/16  14:20:47  jph]
        !           184:  * 
        !           185:  * Revision 1.2.6.19  1994/02/07  22:41:25  jph
        !           186:  *     Merged with changes from 1.2.6.18
        !           187:  *     [1994/02/07  22:40:25  jph]
        !           188:  * 
        !           189:  *     CR10433 -- Upgrade default pager.
        !           190:  *     Add device argument capability.
        !           191:  *     Removed defunct file_io.h reference.
        !           192:  *     Replaced pager_{lock_init,lock,unlock,lock_try} macros.
        !           193:  *     Moved cthreads globals to top of file from middle.
        !           194:  *     Removed "id" field of "partition_t" - not needed.
        !           195:  *     Added "device", "offset", "count" and "record_shift" fields
        !           196:  *      to "partition_t" to record backing store device info.
        !           197:  *     Removed "p_read", "p_write" and "p_private" fields from
        !           198:  *      "partition_t" - Unneeded filesystem abstraction.
        !           199:  *     Merge "struct dstruct" fields into the "struct dpager",
        !           200:  *      delete "struct dstruct" and "default_pager_t".
        !           201:  *     Added "struct bstruct" and "all_backing_store" to hold list
        !           202:  *      of all backing store ports.
        !           203:  *     Simplify arguments to create_paging_partition().
        !           204:  *     Delete part_id(), add_paging_file() and default_pager_setup() routines.
        !           205:  *     Added backing_store_port_alloc(), log2() routine.
        !           206:  *     Added vm_page_mask and vm_page_shift to augment vm_page_size.
        !           207:  *     [1994/02/07  22:28:15  jph]
        !           208:  * 
        !           209:  * Revision 1.2.6.18  1994/02/01  19:44:38  collins
        !           210:  *     CR9926: Set the default pager scheduling policy to round-robin with
        !           211:  *     a priority of BASEPRI_SYSTEM.
        !           212:  *     [1994/02/01  14:56:05  collins]
        !           213:  * 
        !           214:  * Revision 1.2.6.17  1994/01/27  17:04:21  chasb
        !           215:  *     Expand Copyright markers
        !           216:  *     [1994/01/27  16:32:40  chasb]
        !           217:  * 
        !           218:  * Revision 1.2.6.16  1994/01/26  18:42:03  collins
        !           219:  *     CR10474: Change any_t to void *.
        !           220:  *     [1994/01/26  18:39:47  collins]
        !           221:  * 
        !           222:  * Revision 1.2.6.15  1994/01/25  17:02:40  jeffc
        !           223:  *     CR10107 -- Mach spec compliance - eliminate copy_call
        !           224:  *     [1994/01/24  21:23:43  jeffc]
        !           225:  * 
        !           226:  * Revision 1.2.6.14  1994/01/20  16:58:18  meissner
        !           227:  *     CR 10468 - Make initialization have proper number of {}'s.
        !           228:  *     [1994/01/19  19:02:57  meissner]
        !           229:  * 
        !           230:  * Revision 1.2.6.13  1993/12/03  20:53:51  jvs
        !           231:  *     Trusted pager throttling changes.  CR 10108
        !           232:  *     [1993/12/03  20:53:09  jvs]
        !           233:  * 
        !           234:  * Revision 1.2.6.12  1993/12/02  17:22:34  jph
        !           235:  *     CR10254 -- Fix warning about unused ledger/ security ports.
        !           236:  *     [1993/12/02  15:59:30  jph]
        !           237:  * 
        !           238:  * Revision 1.2.6.11  1993/11/24  20:30:31  jph
        !           239:  *     CR9801 brezak merge, ledgers, security and NMK15_COMPAT
        !           240:  *     [1993/11/23  22:52:33  jph]
        !           241:  * 
        !           242:  *     New bootstrap_ports() signature.
        !           243:  *     [1993/11/23  20:58:25  jph]
        !           244:  * 
        !           245:  * Revision 1.2.6.10  1993/11/23  18:05:47  watkins
        !           246:  *     Increment send right for object in mo_notify.
        !           247:  *     [1993/11/23  18:04:35  watkins]
        !           248:  * 
        !           249:  * Revision 1.2.6.9  1993/11/16  21:49:42  watkins
        !           250:  *     Remove pager_name argument from memory_object_terminate
        !           251:  *     and memory_object_create, as per spec.  Remove mo_init
        !           252:  *     and flesh out mo_notify. Extend maps for reads beyond the
        !           253:  *     end. Add xpr traces.
        !           254:  *     [1993/11/16  21:29:43  watkins]
        !           255:  * 
        !           256:  * Revision 1.2.6.8  1993/10/20  18:50:13  gm
        !           257:  *     CR9928: Remove bootstrap_port lookup.
        !           258:  *     CR9990: Remove code that deletes initial stack.
        !           259:  *     [1993/10/20  12:34:40  gm]
        !           260:  * 
        !           261:  * Revision 1.2.6.7  1993/10/08  17:32:08  jeffc
        !           262:  *     CR9508 - Delete typed IPC code
        !           263:  *     [1993/09/28  17:27:02  jeffc]
        !           264:  * 
        !           265:  * Revision 1.2.6.6  1993/10/08  16:08:14  jeffc
        !           266:  *     CR9792 - delete obsolete memory_object_data_write message.
        !           267:  *     [1993/10/08  15:59:49  jeffc]
        !           268:  * 
        !           269:  * Revision 1.2.6.5  1993/10/05  21:57:08  watkins
        !           270:  *     New memory object attribute interfaces comply with spec.
        !           271:  *     [1993/10/05  21:53:27  watkins]
        !           272:  * 
        !           273:  * Revision 1.2.6.4  1993/09/16  18:38:39  jeffc
        !           274:  *     CR9792 - delete defunct EMMI interfaces
        !           275:  *     [1993/09/15  20:02:07  jeffc]
        !           276:  * 
        !           277:  * Revision 1.2.6.3  1993/08/05  17:57:08  gm
        !           278:  *     CR9627: Moved def_pager_setup and bootstrap code here.  Removed
        !           279:  *     EXT_PAGER code.  Fixed up code problems with more agressive warning
        !           280:  *     in gcc.  Added full prototype support.  Changed internal interfaces
        !           281:  *     that had unions as return values to take pointer arguments instead.
        !           282:  *     Delete bootstrap code since their is now a separate bootstrap task.
        !           283:  *     Removed set_ras_address() since it should be provided by a machine
        !           284:  *     dependent file on machines that need it.  Changed to get priv
        !           285:  *     ports using mach interfaces instead of argv.
        !           286:  *     [1993/07/09  19:11:36  gm]
        !           287:  * 
        !           288:  * Revision 1.2.6.2  1993/06/09  02:08:56  gm
        !           289:  *     Conditionalize no_senders_check for untyped IPC.  CR #9058.
        !           290:  *     [1993/05/11  18:19:30  rod]
        !           291:  * 
        !           292:  *     Add header files to pick up definitions of Mach traps and
        !           293:  *     wiring interfaces.
        !           294:  *     [1993/05/14  15:37:15  jeffc]
        !           295:  * 
        !           296:  *     Fix ANSI C violations and warnings.
        !           297:  *     [1993/05/13  21:05:22  jeffc]
        !           298:  * 
        !           299:  *     Remove dependency on own pathname.
        !           300:  *     [1993/05/12  17:53:18  jeffc]
        !           301:  * 
        !           302:  * Revision 1.2  1993/04/19  15:07:02  devrcs
        !           303:  *     Added trailer support to untyped ipc.   [[email protected], [email protected]]
        !           304:  *     [1993/04/06  18:14:54  travos]
        !           305:  * 
        !           306:  *     Merge untyped ipc:
        !           307:  *     Added untyped support to bootstrap_compat().
        !           308:  *     [1993/04/02  17:37:59  rod]
        !           309:  * 
        !           310:  *     Share more code when building the in kernel version
        !           311:  *     of the pager.
        !           312:  *     [93/03/19            bernadat]
        !           313:  * 
        !           314:  *     Fix memory_object_synchronize hang.
        !           315:  *     [1993/03/15  13:21:59  david]
        !           316:  * 
        !           317:  *     memory_object_synchronize define twice
        !           318:  *     [1993/03/03  15:09:30  david]
        !           319:  * 
        !           320:  *     remerge with 1.1.2.3
        !           321:  *     [1993/03/03  14:26:14  david]
        !           322:  * 
        !           323:  *     Add memory_object_synchronize stub
        !           324:  *     [1993/03/03  11:04:05  david]
        !           325:  * 
        !           326:  *     Fixed a deadlock bug in internal pager configuration.
        !           327:  *     [93/02/25            bernadat]
        !           328:  * 
        !           329:  *     moved out of mach_kernel directory
        !           330:  *     [1993/02/27  13:56:35  david]
        !           331:  * 
        !           332:  *     Modified to use the same new interface (default_pager_object.defs) for both
        !           333:  *     configurations.
        !           334:  *     [1993/02/17  13:40:18  bruel]
        !           335:  * 
        !           336:  *     Added stubs for new exception interface.
        !           337:  *     [93/02/11            bruel]
        !           338:  * 
        !           339:  *     Modified from mk78.
        !           340:  *     Added the ufs_pager_option.
        !           341:  *     [93/01/29            bruel]
        !           342:  * 
        !           343:  *     Yup, it works. Undefine CHECKSUM, debug and
        !           344:  *     DEBUG_READER_CONFLICTS again.
        !           345:  *     [92/12/03            ian]
        !           346:  * 
        !           347:  *     Update CHECKSUM to work with current dp_map union.
        !           348:  *     [92/12/03            ian]
        !           349:  * 
        !           350:  *     Define debug CHECKSUM and DEBUG_READER_CONFLICTS.
        !           351:  *     [92/11/28            ian]
        !           352:  * 
        !           353:  *     Eliminated use of old memory object calls (set_attributes, data_write, data_provided).
        !           354:  *     [92/09/25            jsb]
        !           355:  * 
        !           356:  * $EndLog$
        !           357:  */
        !           358: /* CMU_HIST */
        !           359: /*
        !           360:  * Revision 2.12  92/07/20  13:32:18  cmaeda
        !           361:  *     Added private version of set_ras_address for fast_tas support.
        !           362:  *     [92/05/11  14:31:52  cmaeda]
        !           363:  * 
        !           364:  * Revision 2.11  92/05/05  10:03:46  danner
        !           365:  *     For merge purposes, backed-out the unstable stuff.
        !           366:  *     [92/05/04  11:12:01  af]
        !           367:  * 
        !           368:  *     Now we can page an object across partitions.
        !           369:  *     Initial rough ideas about automatically extending
        !           370:  *     paging space.
        !           371:  *     [92/03/11  02:23:58  af]
        !           372:  * 
        !           373:  * Revision 2.10  92/03/06  13:58:48  rpd
        !           374:  *     Fixed pager_dealloc_page calls in pager_dealloc (from af).
        !           375:  *     Removed chatty printfs.
        !           376:  *     [92/03/06            rpd]
        !           377:  * 
        !           378:  * Revision 2.9  92/03/05  15:58:35  rpd
        !           379:  *     Changed PAGEMAP_ENTRIES from 128 to 64.  From af.
        !           380:  *     [92/03/05            rpd]
        !           381:  * 
        !           382:  * Revision 2.8  92/03/03  12:12:04  rpd
        !           383:  *     Changed to catch exception messages and handle bootstrap requests.
        !           384:  *     Added partition_init.
        !           385:  *     [92/03/03            rpd]
        !           386:  * 
        !           387:  * Revision 2.7  92/02/25  11:22:38  elf
        !           388:  *     Accept creation of objects bigger than any one partition, in
        !           389:  *     anticipation of the code that will page across partitions.
        !           390:  *     Since we are at it, also proceed with no paging partitions:
        !           391:  *     rely on killing unlucky objects on pageouts.
        !           392:  *     [92/02/25            af]
        !           393:  * 
        !           394:  * Revision 2.6  92/02/23  23:00:31  elf
        !           395:  *     Copyright updated, corrected history.
        !           396:  *     [92/02/23            elf]
        !           397:  * 
        !           398:  * Revision 2.5  92/02/23  22:25:35  elf
        !           399:  *     Improved handling of big objects, fixed a deadlock in
        !           400:  *     object relocation, improved printouts.
        !           401:  *     Now only crash if out of memory, otherwise use the old
        !           402:  *     code that just marked the object as in-error.
        !           403:  *     [92/02/23  13:25:49  af]
        !           404:  * 
        !           405:  *     As per jsb instructions, removed all NORMA conditionals.
        !           406:  *     Rename port names to odd values, a trivial heuristic that
        !           407:  *     makes name conflicts even more unlikely.
        !           408:  *     [92/02/22            af]
        !           409:  * 
        !           410:  *     Refined the port name conflict problem.  Instead of renaming
        !           411:  *     ports that we send to, just set aside the memory that we cannot
        !           412:  *     use.  When objects get deleted put back the memory in the system.
        !           413:  *     [92/02/21            af]
        !           414:  * 
        !           415:  *     Added renaming of request and name ports (from af).
        !           416:  *     [92/02/21            danner]
        !           417:  * 
        !           418:  *     Many changes. Now supports adding/removing paging files, it does
        !           419:  *     not immediately panic if a paging file fills up but relocates the
        !           420:  *     object elsewhere, it uses the precious attribute in data_supply
        !           421:  *     to reduce paging space usage (under USE_PRECIOUS conditional,
        !           422:  *     enabled).
        !           423:  *     [92/02/19  17:29:54  af]
        !           424:  * 
        !           425:  *     Two mods: changed bitmap ops to work one int at a time rather
        !           426:  *     than one byte at a time.  This helps under load, e.g. when the
        !           427:  *     paging file is large and busy. Second mod to use port-to-pointer
        !           428:  *     casting in lookups, rather than hash+list searching.  This not
        !           429:  *     only helps under load (I see >600 objects on my pmax) but also
        !           430:  *     increases parallelism a little.
        !           431:  *     Shrunk the code size by one page in the process.
        !           432:  *     [92/02/14  01:44:23  af]
        !           433:  * 
        !           434:  * Revision 2.4  92/01/23  15:19:41  rpd
        !           435:  *     Changed to not include mig server interfaces.
        !           436:  *     [92/01/23            rpd]
        !           437:  * 
        !           438:  * Revision 2.3  92/01/14  16:43:14  rpd
        !           439:  *     Moved mach/default_pager_object.defs to mach/default_pager.defs.
        !           440:  *     Revised default_pager_info etc. for their new definitions.
        !           441:  *     Removed (now) unnecessary #define's to rename kernel functions.
        !           442:  *     [92/01/13            rpd]
        !           443:  *     Added page_size to default_pager_info.
        !           444:  *     Added default_pager_object_pages.
        !           445:  *     [92/01/03            rpd]
        !           446:  * 
        !           447:  *     Updated to handle name ports from memory_object_create.
        !           448:  *     Changed to remember the name ports associated with objects.
        !           449:  *     Changed default_pager_objects to return the name ports.
        !           450:  *     [91/12/28            rpd]
        !           451:  * 
        !           452:  *     Added default_pager_objects.
        !           453:  *     [91/12/15            rpd]
        !           454:  * 
        !           455:  * Revision 2.2  92/01/03  19:56:21  dbg
        !           456:  *     Simplify locking.
        !           457:  *     [91/10/02            dbg]
        !           458:  * 
        !           459:  *     Convert to run outside of kernel.
        !           460:  *     [91/09/04            dbg]
        !           461:  * 
        !           462:  * Revision 2.17  91/08/29  13:44:27  jsb
        !           463:  *     A couple quick changes for NORMA_VM. Will be fixed later.
        !           464:  * 
        !           465:  * Revision 2.16  91/08/28  16:59:29  jsb
        !           466:  *     Fixed the default values of default_pager_internal_count and
        !           467:  *     default_pager_external_count.
        !           468:  *     [91/08/28            rpd]
        !           469:  * 
        !           470:  * Revision 2.15  91/08/28  11:09:32  jsb
        !           471:  *     Added seqnos_memory_object_change_completed.
        !           472:  *     From dlb: use memory_object_data_supply for pagein when buffer is
        !           473:  *     going to be deallocated.
        !           474:  *     From me: don't use data_supply under NORMA_VM (will be fixed).
        !           475:  *     [91/08/26  14:30:07  jsb]
        !           476:  * 
        !           477:  *     Changed to process requests in parallel when possible.
        !           478:  * 
        !           479:  *     Don't bother keeping track of mscount.
        !           480:  *     [91/08/16            rpd]
        !           481:  *     Added default_pager_info.
        !           482:  *     [91/08/15            rpd]
        !           483:  * 
        !           484:  *     Added sequence numbers to the memory object interface.
        !           485:  *     Changed to use no-senders notifications.
        !           486:  *     Changed to keep track of port rights and not use mach_port_destroy.
        !           487:  *     Added dummy supply-completed and data-return stubs.
        !           488:  *     [91/08/13            rpd]
        !           489:  * 
        !           490:  * Revision 2.14  91/05/18  14:28:32  rpd
        !           491:  *     Don't give privileges to threads handling external objects.
        !           492:  *     [91/04/06            rpd]
        !           493:  *     Enhanced to use multiple threads, for performance and to avoid
        !           494:  *     a deadlock caused by default_pager_object_create.
        !           495:  *     Added locking to partitions.
        !           496:  *     Added locking to pager_port_hashtable.
        !           497:  *     Changed pager_port_hash to something reasonable.
        !           498:  *     [91/04/03            rpd]
        !           499:  * 
        !           500:  * Revision 2.13  91/05/14  15:21:41  mrt
        !           501:  *     Correcting copyright
        !           502:  * 
        !           503:  * Revision 2.12  91/03/16  14:41:26  rpd
        !           504:  *     Updated for new kmem_alloc interface.
        !           505:  *     Fixed memory_object_create to zero the new pager structure.
        !           506:  *     [91/03/03            rpd]
        !           507:  *     Removed thread_swappable.
        !           508:  *     [91/01/18            rpd]
        !           509:  * 
        !           510:  * Revision 2.11  91/02/05  17:00:49  mrt
        !           511:  *     Changed to new copyright
        !           512:  *     [91/01/28  14:54:31  mrt]
        !           513:  * 
        !           514:  * Revision 2.10  90/09/09  14:31:01  rpd
        !           515:  *     Use decl_simple_lock_data.
        !           516:  *     [90/08/30            rpd]
        !           517:  * 
        !           518:  * Revision 2.9  90/08/27  21:44:51  dbg
        !           519:  *     Add definitions of NBBY, howmany.
        !           520:  *     [90/07/16            dbg]
        !           521:  * 
        !           522:  * Revision 2.8  90/06/02  14:45:22  rpd
        !           523:  *     Changed default_pager_object_create so the out argument
        !           524:  *     is a poly send right.
        !           525:  *     [90/05/03            rpd]
        !           526:  *     Removed references to keep_wired_memory.
        !           527:  *     [90/04/29            rpd]
        !           528:  *     Converted to new IPC.
        !           529:  *     Removed data-request queue.
        !           530:  *     [90/03/26  21:30:57  rpd]
        !           531:  * 
        !           532:  * Revision 2.7  90/03/14  21:09:58  rwd
        !           533:  *     Call default_pager_object_server and add
        !           534:  *     default_pager_object_create
        !           535:  *     [90/01/22            rwd]
        !           536:  * 
        !           537:  * Revision 2.6  90/01/11  11:41:08  dbg
        !           538:  *     Use bootstrap-task print routines.
        !           539:  *     [89/12/20            dbg]
        !           540:  * 
        !           541:  *     De-lint.
        !           542:  *     [89/12/06            dbg]
        !           543:  * 
        !           544:  * Revision 2.5  89/12/08  19:52:03  rwd
        !           545:  *     Turn off CHECKSUM
        !           546:  *     [89/12/06            rwd]
        !           547:  * 
        !           548:  * Revision 2.4  89/10/23  12:01:54  dbg
        !           549:  *     Change pager_read_offset and pager_write_offset to return block
        !           550:  *     number as function result.  default_read()'s caller must now
        !           551:  *     deallocate data if not the same as the data buffer passed in.
        !           552:  *     Add register declarations and clean up loops a bit.
        !           553:  *     [89/10/19            dbg]
        !           554:  * 
        !           555:  *     Oops - nothing like having your debugging code introduce bugs...
        !           556:  *     [89/10/17            dbg]
        !           557:  * 
        !           558:  * Revision 2.3  89/10/16  15:21:59  rwd
        !           559:  *     debugging: checksum pages in each object.
        !           560:  *     [89/10/04            dbg]
        !           561:  * 
        !           562:  * Revision 2.2  89/09/08  11:22:06  dbg
        !           563:  *     Wait for default_partition to be set.
        !           564:  *     [89/09/01            dbg]
        !           565:  * 
        !           566:  *     Modified to call outside routines for read and write.
        !           567:  *     Removed disk structure.  Added part_create.
        !           568:  *     Reorganized code.
        !           569:  *     [89/07/11            dbg]
        !           570:  * 
        !           571:  */
        !           572: /* CMU_ENDHIST */
        !           573: /* 
        !           574:  * Mach Operating System
        !           575:  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
        !           576:  * All Rights Reserved.
        !           577:  * 
        !           578:  * Permission to use, copy, modify and distribute this software and its
        !           579:  * documentation is hereby granted, provided that both the copyright
        !           580:  * notice and this permission notice appear in all copies of the
        !           581:  * software, derivative works or modified versions, and any portions
        !           582:  * thereof, and that both notices appear in supporting documentation.
        !           583:  * 
        !           584:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !           585:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !           586:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !           587:  * 
        !           588:  * Carnegie Mellon requests users of this software to return to
        !           589:  * 
        !           590:  *  Software Distribution Coordinator  or  [email protected]
        !           591:  *  School of Computer Science
        !           592:  *  Carnegie Mellon University
        !           593:  *  Pittsburgh PA 15213-3890
        !           594:  * 
        !           595:  * any improvements or extensions that they make and grant Carnegie Mellon
        !           596:  * the rights to redistribute these changes.
        !           597:  */
        !           598: 
        !           599: /*
        !           600:  *     Default pager.
        !           601:  *             Threads management.
        !           602:  *             Requests handling.
        !           603:  */
        !           604: 
        !           605: #include "default_pager_internal.h"
        !           606: #include <kern/host.h>
        !           607: #include <kern/ledger.h>
        !           608: #include <mach/host_info.h>
        !           609: #include <ipc/ipc_space.h>
        !           610: #include <vm/vm_kern.h>
        !           611: 
        !           612: char   my_name[] = "(default pager): ";
        !           613: 
        !           614: #if    DEFAULT_PAGER_DEBUG
        !           615: int    debug_mask = 0;
        !           616: #endif /* DEFAULT_PAGER_DEBUG */
        !           617: 
        !           618: /*
        !           619:  * Use 16 Kbyte stacks instead of the default 64K.
        !           620:  * Use 4 Kbyte waiting stacks instead of the default 8K.
        !           621:  */
        !           622: 
        !           623: vm_size_t      cthread_stack_size = 16 *1024;
        !           624: extern vm_size_t cthread_wait_stack_size;
        !           625: 
        !           626: int            vm_page_mask;
        !           627: int            vm_page_shift;
        !           628: 
        !           629: int            norma_mk;
        !           630: 
        !           631: boolean_t      verbose;
        !           632: 
        !           633: /* task_t default_pager_self; */       /* Our task port. */
        !           634: mutex_t                        dpt_lock;       /* lock for the dpt array struct */
        !           635: default_pager_thread_t **dpt_array;
        !           636: 
        !           637: MACH_PORT_FACE default_pager_default_set; /* Port set for "default" thread. */
        !           638: MACH_PORT_FACE default_pager_default_port;/* Port for memory_object_create. */
        !           639: MACH_PORT_FACE default_pager_internal_set; /* Port set for internal objects. */
        !           640: MACH_PORT_FACE default_pager_external_set; /* Port set for external objects. */
        !           641: 
        !           642: #define DEFAULT_PAGER_INTERNAL_COUNT   (4)
        !           643: 
        !           644: 
        !           645: /* Memory created by default_pager_object_create should mostly be resident. */
        !           646: #define DEFAULT_PAGER_EXTERNAL_COUNT   (2)
        !           647: 
        !           648: unsigned int   default_pager_internal_count = DEFAULT_PAGER_INTERNAL_COUNT;
        !           649: /* Number of "internal" threads. */
        !           650: unsigned int   default_pager_external_count = DEFAULT_PAGER_EXTERNAL_COUNT;
        !           651: /* Number of "external" threads. */
        !           652: 
        !           653: /*
        !           654:  * Forward declarations.
        !           655:  */
        !           656: boolean_t default_pager_notify_server(mach_msg_header_t *,
        !           657:                                      mach_msg_header_t *);
        !           658: boolean_t default_pager_demux_object(mach_msg_header_t *,
        !           659:                                     mach_msg_header_t *);
        !           660: boolean_t default_pager_demux_default(mach_msg_header_t *,
        !           661:                                      mach_msg_header_t *);
        !           662: default_pager_thread_t *start_default_pager_thread(int, boolean_t);
        !           663: void   default_pager(void);
        !           664: void   default_pager_thread(void *);
        !           665: void   default_pager_initialize(MACH_PORT_FACE);
        !           666: void   default_pager_set_policy(MACH_PORT_FACE);
        !           667: boolean_t      dp_parse_argument(char *);      /* forward; */
        !           668: unsigned int   d_to_i(char *);                 /* forward; */
        !           669: 
        !           670: 
        !           671: extern int vstruct_def_clshift;
        !           672: 
        !           673: 
        !           674: /*
        !           675:  * Initialize and Run the default pager
        !           676:  */
        !           677: void
        !           678: default_pager(void)
        !           679: {
        !           680:        int                     i, id;
        !           681:        static char             here[] = "default_pager";
        !           682:        mach_msg_options_t      server_options;
        !           683:        default_pager_thread_t  dpt;
        !           684:        kern_return_t kr;
        !           685: 
        !           686: 
        !           687: 
        !           688:        /*
        !           689:         * Give me space for the thread array and zero it.
        !           690:         */
        !           691:        i = default_pager_internal_count + default_pager_external_count + 1;
        !           692:        dpt_array = (default_pager_thread_t **)
        !           693:            kalloc(i * sizeof(default_pager_thread_t *));
        !           694:        memset(dpt_array, 0, i * sizeof(default_pager_thread_t *));
        !           695: 
        !           696:        /* Setup my thread structure.  */
        !           697:        id = 0;
        !           698:        dpt.dpt_buffer = 0;
        !           699:        dpt.dpt_internal = FALSE;
        !           700:        dpt.dpt_initialized_p = TRUE;
        !           701:        dpt_array[0] = &dpt;
        !           702: 
        !           703:        /*
        !           704:         * Now we create the threads that will actually
        !           705:         * manage objects.
        !           706:         */
        !           707: 
        !           708:        for (i = 0; i < default_pager_internal_count; i++) {
        !           709:                dpt_array[id] = (default_pager_thread_t *)
        !           710:                                kalloc(sizeof (default_pager_thread_t));
        !           711:                if (dpt_array[id] == NULL)
        !           712:                        Panic("alloc pager thread");
        !           713:                kr = vm_allocate(kernel_map, &((dpt_array[id])->dpt_buffer),
        !           714:                                 vm_page_size << vstruct_def_clshift, TRUE);
        !           715:                if (kr != KERN_SUCCESS)
        !           716:                        Panic("alloc thread buffer");
        !           717:                kr = vm_map_wire(kernel_map, (dpt_array[id])->dpt_buffer, 
        !           718:                        ((dpt_array[id])->dpt_buffer)
        !           719:                                        +(vm_page_size << vstruct_def_clshift), 
        !           720:                        VM_PROT_DEFAULT,
        !           721:                        FALSE);
        !           722:                if (kr != KERN_SUCCESS)
        !           723:                        Panic("wire thread buffer");
        !           724:                (dpt_array[id])->dpt_internal = TRUE;
        !           725:                (dpt_array[id])->dpt_initialized_p = TRUE;
        !           726:                (dpt_array[id])->checked_out = FALSE;
        !           727:                id++;
        !           728:        }
        !           729:        DPT_LOCK_INIT(dpt_lock);
        !           730: }
        !           731: 
        !           732: 
        !           733: 
        !           734: 
        !           735: 
        !           736: 
        !           737: /* simple utility: only works for 2^n */
        !           738: int
        !           739: local_log2(
        !           740:        unsigned int n)
        !           741: {
        !           742:        register int    i = 0;
        !           743: 
        !           744:        if(n == 0) return 0;
        !           745: 
        !           746:        while ((n & 1) == 0) {
        !           747:                i++;
        !           748:                n >>= 1;
        !           749:        }
        !           750:        return i;
        !           751: }
        !           752: 
        !           753: 
        !           754: 
        !           755: 
        !           756: /* another simple utility, d_to_i(char*) supporting only decimal
        !           757:  * and devoid of range checking; obscure name chosen deliberately
        !           758:  * to avoid confusion with semantic-rich POSIX routines */
        !           759: unsigned int
        !           760: d_to_i(char * arg)
        !           761: {
        !           762:     unsigned int rval = 0;
        !           763:     char ch;
        !           764: 
        !           765:     while ((ch = *arg++) && ch >= '0' && ch <= '9') {
        !           766:        rval *= 10;
        !           767:        rval += ch - '0';
        !           768:     }
        !           769:     return(rval);
        !           770: }
        !           771: 
        !           772: 
        !           773: 
        !           774: 
        !           775: /*
        !           776:  * Check for non-disk-partition arguments of the form
        !           777:  *     attribute=argument
        !           778:  * returning TRUE if one if found
        !           779:  */
        !           780: boolean_t dp_parse_argument(char *av)
        !           781: {
        !           782:        char *rhs = av;
        !           783:        static char     here[] = "dp_parse_argument";
        !           784: 
        !           785:        /* Check for '-v' flag */
        !           786: 
        !           787:        if (av[0] == '-' && av[1] == 'v' && av[2] == 0) {
        !           788:                verbose = TRUE ;
        !           789:                return TRUE;
        !           790:        }
        !           791: 
        !           792:        /*
        !           793:         * If we find a '=' followed by an argument in the string,
        !           794:         * check for known arguments
        !           795:         */
        !           796:        while (*rhs && *rhs != '=')
        !           797:                rhs++;
        !           798:        if (*rhs && *++rhs) {
        !           799:                /* clsize=N pages */
        !           800:                if (strprefix(av,"cl")) {
        !           801:                        if (!bs_set_default_clsize(d_to_i(rhs)))
        !           802:                                dprintf(("Bad argument (%s) - ignored\n", av));
        !           803:                        return(TRUE);
        !           804:                }
        !           805:                /* else if strprefix(av,"another_argument")) {
        !           806:                        handle_another_argument(av);
        !           807:                        return(TRUE);
        !           808:                } */
        !           809:        }
        !           810:        return(FALSE);
        !           811: }
        !           812: 
        !           813: MACH_PORT_FACE default_pager_host_port = MACH_PORT_NULL;
        !           814: 
        !           815: 
        !           816: int
        !           817: start_def_pager(char *bs_device)
        !           818: {
        !           819:        int                     my_node;
        !           820: /*
        !           821:        MACH_PORT_FACE          master_device_port;
        !           822: */
        !           823:        MACH_PORT_FACE          security_port;
        !           824: /*
        !           825:        MACH_PORT_FACE          root_ledger_wired;
        !           826:        MACH_PORT_FACE          root_ledger_paged;
        !           827: */
        !           828:        static char             here[] = "main";
        !           829:        int                     need_dp_init = 1;
        !           830: 
        !           831: 
        !           832: 
        !           833:        default_pager_host_port = ipc_port_make_send(realhost.host_priv_self);
        !           834: /*
        !           835:        master_device_port = ipc_port_make_send(master_device_port);
        !           836:        root_ledger_wired = ipc_port_make_send(root_wired_ledger_port);
        !           837:        root_ledger_paged = ipc_port_make_send(root_paged_ledger_port);
        !           838: */
        !           839:        security_port = ipc_port_make_send(realhost.host_security_self);
        !           840: 
        !           841: 
        !           842: #if NORMA_VM
        !           843:        norma_mk = 1;
        !           844: #else
        !           845:        norma_mk = 0;
        !           846: #endif
        !           847: 
        !           848: 
        !           849:        /* setup read buffers, etc */
        !           850:        default_pager_initialize(default_pager_host_port);
        !           851:        default_pager();
        !           852: }
        !           853: 
        !           854: /*
        !           855:  * Return TRUE if string 2 is a prefix of string 1.
        !           856:  */     
        !           857: boolean_t       
        !           858: strprefix(register const char *s1, register const char *s2)
        !           859: {               
        !           860:         register int    c;
        !           861:                 
        !           862:         while ((c = *s2++) != '\0') {
        !           863:             if (c != *s1++) 
        !           864:                 return (FALSE);
        !           865:         }       
        !           866:         return (TRUE);
        !           867: }
        !           868: 
        !           869: 
        !           870: kern_return_t
        !           871: default_pager_info(
        !           872:        MACH_PORT_FACE          pager,
        !           873:        default_pager_info_t    *infop)
        !           874: {
        !           875:        vm_size_t       pages_total, pages_free;
        !           876: 
        !           877:        if (pager != default_pager_default_port)
        !           878:                return KERN_INVALID_ARGUMENT; 
        !           879: 
        !           880:        bs_global_info(&pages_total, &pages_free);
        !           881: 
        !           882:        infop->dpi_total_space = ptoa(pages_total);
        !           883:        infop->dpi_free_space = ptoa(pages_free);
        !           884:        infop->dpi_page_size = vm_page_size;
        !           885: 
        !           886:        return KERN_SUCCESS;
        !           887: }
        !           888: 
        !           889: 
        !           890: void
        !           891: default_pager_initialize(
        !           892:        MACH_PORT_FACE host_port)
        !           893: {
        !           894:        kern_return_t           kr;
        !           895:        static char             here[] = "default_pager_initialize";
        !           896: 
        !           897: 
        !           898:        /*
        !           899:         * Exported DMM port.
        !           900:         */
        !           901:        default_pager_default_port = ipc_port_alloc_kernel();
        !           902: 
        !           903: 
        !           904:        /*
        !           905:         * Export pager interfaces.
        !           906:         */
        !           907: #ifdef USER_PAGER
        !           908:        if ((kr = netname_check_in(name_server_port, "UserPager",
        !           909:                                   default_pager_self,
        !           910:                                   default_pager_default_port))
        !           911:            != KERN_SUCCESS) {
        !           912:                dprintf(("netname_check_in returned 0x%x\n", kr));
        !           913:                exit(1);
        !           914:        }
        !           915: #else  /* USER_PAGER */
        !           916:        {
        !           917:                int clsize;
        !           918:                ipc_port_t DMM;
        !           919: 
        !           920:                DMM = ipc_port_make_send(default_pager_default_port);
        !           921:                clsize = (vm_page_size << vstruct_def_clshift);
        !           922:                kr = host_default_memory_manager(host_port, &DMM, clsize);
        !           923:                if ((kr != KERN_SUCCESS) || (DMM != MACH_PORT_NULL))
        !           924:                        Panic("default memory manager");
        !           925: 
        !           926:        }
        !           927: #endif /* USER_PAGER */
        !           928: 
        !           929: 
        !           930:        /*
        !           931:         * Vm variables.
        !           932:         */
        !           933:        vm_page_mask = vm_page_size - 1;
        !           934:        vm_page_shift = local_log2(vm_page_size);
        !           935: 
        !           936:        /*
        !           937:         * List of all vstructs.
        !           938:         */
        !           939:        VSL_LOCK_INIT();
        !           940:        queue_init(&vstruct_list.vsl_queue);
        !           941:        queue_init(&vstruct_list.vsl_leak_queue);
        !           942:        vstruct_list.vsl_count = 0;
        !           943: 
        !           944:        VSTATS_LOCK_INIT(&global_stats.gs_lock);
        !           945: 
        !           946:        bs_initialize();
        !           947: }
        !           948: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.