Annotation of OSKit-Mach/vm/vm_external.c, revision 1.1.1.1

1.1       root        1: /* 
                      2:  * Mach Operating System
                      3:  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
                      4:  * All Rights Reserved.
                      5:  * 
                      6:  * Permission to use, copy, modify and distribute this software and its
                      7:  * documentation is hereby granted, provided that both the copyright
                      8:  * notice and this permission notice appear in all copies of the
                      9:  * software, derivative works or modified versions, and any portions
                     10:  * thereof, and that both notices appear in supporting documentation.
                     11:  * 
                     12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
                     13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
                     14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
                     15:  * 
                     16:  * Carnegie Mellon requests users of this software to return to
                     17:  * 
                     18:  *  Software Distribution Coordinator  or  [email protected]
                     19:  *  School of Computer Science
                     20:  *  Carnegie Mellon University
                     21:  *  Pittsburgh PA 15213-3890
                     22:  * 
                     23:  * any improvements or extensions that they make and grant Carnegie Mellon
                     24:  * the rights to redistribute these changes.
                     25:  */
                     26: /*
                     27:  *     This module maintains information about the presence of
                     28:  *     pages not in memory.  Since an external memory object
                     29:  *     must maintain a complete knowledge of its contents, this
                     30:  *     information takes the form of hints.
                     31:  */
                     32: 
                     33: #include <mach/boolean.h>
                     34: #include <kern/zalloc.h>
                     35: #include <vm/vm_external.h>
                     36: #include <mach/vm_param.h>
                     37: #include <kern/assert.h>
                     38: 
                     39: 
                     40: 
                     41: boolean_t      vm_external_unsafe = FALSE;
                     42: 
                     43: zone_t         vm_external_zone = ZONE_NULL;
                     44: 
                     45: /*
                     46:  *     The implementation uses bit arrays to record whether
                     47:  *     a page has been written to external storage.  For
                     48:  *     convenience, these bit arrays come in two sizes
                     49:  *     (measured in bytes).
                     50:  */
                     51: 
                     52: #define                SMALL_SIZE      (VM_EXTERNAL_SMALL_SIZE/8)
                     53: #define                LARGE_SIZE      (VM_EXTERNAL_LARGE_SIZE/8)
                     54: 
                     55: zone_t         vm_object_small_existence_map_zone;
                     56: zone_t         vm_object_large_existence_map_zone;
                     57: 
                     58: 
                     59: vm_external_t  vm_external_create(size)
                     60:        vm_offset_t     size;
                     61: {
                     62:        vm_external_t   result;
                     63:        vm_size_t       bytes;
                     64:        
                     65:        if (vm_external_zone == ZONE_NULL)
                     66:                return(VM_EXTERNAL_NULL);
                     67: 
                     68:        result = (vm_external_t) zalloc(vm_external_zone);
                     69:        result->existence_map = (char *) 0;
                     70: 
                     71:        bytes = (atop(size) + 07) >> 3;
                     72:        if (bytes <= SMALL_SIZE) {
                     73:                result->existence_map =
                     74:                 (char *) zalloc(vm_object_small_existence_map_zone);
                     75:                result->existence_size = SMALL_SIZE;
                     76:        } else if (bytes <= LARGE_SIZE) {
                     77:                result->existence_map =
                     78:                 (char *) zalloc(vm_object_large_existence_map_zone);
                     79:                result->existence_size = LARGE_SIZE;
                     80:        }
                     81:        return(result);
                     82: }
                     83: 
                     84: void           vm_external_destroy(e)
                     85:        vm_external_t   e;
                     86: {
                     87:        if (e == VM_EXTERNAL_NULL)
                     88:                return;
                     89: 
                     90:        if (e->existence_map != (char *) 0) {
                     91:                if (e->existence_size <= SMALL_SIZE) {
                     92:                        zfree(vm_object_small_existence_map_zone,
                     93:                                (vm_offset_t) e->existence_map);
                     94:                } else {
                     95:                        zfree(vm_object_large_existence_map_zone,
                     96:                                (vm_offset_t) e->existence_map);
                     97:                }
                     98:        }
                     99:        zfree(vm_external_zone, (vm_offset_t) e);
                    100: }
                    101: 
                    102: vm_external_state_t _vm_external_state_get(e, offset)
                    103:        vm_external_t   e;
                    104:        vm_offset_t     offset;
                    105: {
                    106:        unsigned
                    107:        int             bit, byte;
                    108: 
                    109:        if (vm_external_unsafe ||
                    110:            (e == VM_EXTERNAL_NULL) ||
                    111:            (e->existence_map == (char *) 0))
                    112:                return(VM_EXTERNAL_STATE_UNKNOWN);
                    113: 
                    114:        bit = atop(offset);
                    115:        byte = bit >> 3;
                    116:        if (byte >= e->existence_size) return (VM_EXTERNAL_STATE_UNKNOWN);
                    117:        return( (e->existence_map[byte] & (1 << (bit & 07))) ?
                    118:                VM_EXTERNAL_STATE_EXISTS : VM_EXTERNAL_STATE_ABSENT );
                    119: }
                    120: 
                    121: void           vm_external_state_set(e, offset, state)
                    122:        vm_external_t   e;
                    123:        vm_offset_t     offset;
                    124:        vm_external_state_t state;
                    125: {
                    126:        unsigned
                    127:        int             bit, byte;
                    128: 
                    129:        if ((e == VM_EXTERNAL_NULL) || (e->existence_map == (char *) 0))
                    130:                return;
                    131: 
                    132:        if (state != VM_EXTERNAL_STATE_EXISTS)
                    133:                return;
                    134: 
                    135:        bit = atop(offset);
                    136:        byte = bit >> 3;
                    137:        if (byte >= e->existence_size) return;
                    138:        e->existence_map[byte] |= (1 << (bit & 07));
                    139: }
                    140: 
                    141: void           vm_external_module_initialize()
                    142: {
                    143:        vm_size_t       size = (vm_size_t) sizeof(struct vm_external);
                    144: 
                    145:        vm_external_zone = zinit(size, 16*1024*size, size,
                    146:                                 0, "external page bitmaps");
                    147: 
                    148:        vm_object_small_existence_map_zone = zinit(SMALL_SIZE,
                    149:                                        round_page(LARGE_SIZE * SMALL_SIZE),
                    150:                                        round_page(SMALL_SIZE),
                    151:                                        ZONE_EXHAUSTIBLE,
                    152:                                        "object small existence maps");
                    153: 
                    154:        vm_object_large_existence_map_zone = zinit(LARGE_SIZE,
                    155:                                        round_page(8 * LARGE_SIZE),
                    156:                                        round_page(LARGE_SIZE),
                    157:                                        ZONE_EXHAUSTIBLE,
                    158:                                        "object large existence maps");
                    159: }

unix.superglobalmegacorp.com

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