| Commit | Line | Data |
|---|---|---|
| 984263bc | 1 | /* |
| 8e7c4729 MD |
2 | * (MPSAFE) |
| 3 | * | |
| 984263bc MD |
4 | * Copyright (c) 2000 Peter Wemm |
| 5 | * | |
| 6 | * Redistribution and use in source and binary forms, with or without | |
| 7 | * modification, are permitted provided that the following conditions | |
| 8 | * are met: | |
| 9 | * 1. Redistributions of source code must retain the above copyright | |
| 10 | * notice, this list of conditions and the following disclaimer. | |
| 11 | * 2. Redistributions in binary form must reproduce the above copyright | |
| 12 | * notice, this list of conditions and the following disclaimer in the | |
| 13 | * documentation and/or other materials provided with the distribution. | |
| 14 | * | |
| 15 | * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND | |
| 16 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 17 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
| 18 | * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE | |
| 19 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
| 20 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
| 21 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
| 22 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
| 23 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
| 24 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
| 25 | * SUCH DAMAGE. | |
| 26 | * | |
| 27 | * $FreeBSD: src/sys/vm/phys_pager.c,v 1.3.2.3 2000/12/17 02:05:41 alfred Exp $ | |
| 28 | */ | |
| 984263bc MD |
29 | #include <sys/param.h> |
| 30 | #include <sys/systm.h> | |
| 31 | #include <sys/linker_set.h> | |
| 32 | #include <sys/conf.h> | |
| 33 | #include <sys/mman.h> | |
| 34 | #include <sys/sysctl.h> | |
| 35 | ||
| 36 | #include <vm/vm.h> | |
| 37 | #include <vm/vm_object.h> | |
| 38 | #include <vm/vm_page.h> | |
| 39 | #include <vm/vm_pager.h> | |
| 40 | #include <vm/vm_zone.h> | |
| 41 | ||
| 654a39f0 MD |
42 | #include <sys/thread2.h> |
| 43 | ||
| 8e7c4729 MD |
44 | /* |
| 45 | * No requirements. | |
| 46 | */ | |
| 5a648714 | 47 | vm_object_t |
| 57f7b636 | 48 | phys_pager_alloc(void *handle, off_t size, vm_prot_t prot, off_t foff) |
| 984263bc MD |
49 | { |
| 50 | vm_object_t object; | |
| 51 | ||
| 52 | /* | |
| 53 | * Offset should be page aligned. | |
| 54 | */ | |
| 55 | if (foff & PAGE_MASK) | |
| 56 | return (NULL); | |
| 57 | ||
| aecf2182 | 58 | size = round_page64(size); |
| 984263bc | 59 | |
| d28e1355 | 60 | KKASSERT(handle == NULL); |
| d28e1355 | 61 | object = vm_object_allocate(OBJT_PHYS, OFF_TO_IDX(foff + size)); |
| 984263bc MD |
62 | |
| 63 | return (object); | |
| 64 | } | |
| 65 | ||
| 8e7c4729 MD |
66 | /* |
| 67 | * No requirements. | |
| 68 | */ | |
| 984263bc MD |
69 | static void |
| 70 | phys_pager_dealloc(vm_object_t object) | |
| 71 | { | |
| d28e1355 | 72 | KKASSERT(object->handle == NULL); |
| 8d292090 | 73 | KKASSERT(object->swblock_count == 0); |
| 984263bc MD |
74 | } |
| 75 | ||
| 8e7c4729 MD |
76 | /* |
| 77 | * No requirements. | |
| 78 | */ | |
| 984263bc | 79 | static int |
| 1b9d3514 | 80 | phys_pager_getpage(vm_object_t object, vm_page_t *mpp, int seqaccess) |
| 984263bc | 81 | { |
| 1b9d3514 | 82 | vm_page_t m = *mpp; |
| 984263bc | 83 | |
| 573fb415 | 84 | lwkt_gettoken(&vm_token); |
| 654a39f0 | 85 | crit_enter(); |
| 1b9d3514 MD |
86 | if ((m->flags & PG_ZERO) == 0) |
| 87 | vm_page_zero_fill(m); | |
| 88 | vm_page_flag_set(m, PG_ZERO); | |
| 89 | /* Switch off pv_entries */ | |
| 90 | vm_page_unmanage(m); | |
| 91 | m->valid = VM_PAGE_BITS_ALL; | |
| 92 | m->dirty = 0; | |
| 654a39f0 | 93 | crit_exit(); |
| 573fb415 | 94 | lwkt_reltoken(&vm_token); |
| 984263bc MD |
95 | |
| 96 | return (VM_PAGER_OK); | |
| 97 | } | |
| 98 | ||
| 8e7c4729 MD |
99 | /* |
| 100 | * No requirements. | |
| 101 | */ | |
| 984263bc | 102 | static void |
| 1b9d3514 MD |
103 | phys_pager_putpages(vm_object_t object, vm_page_t *m, int count, |
| 104 | boolean_t sync, int *rtvals) | |
| 984263bc MD |
105 | { |
| 106 | ||
| 107 | panic("phys_pager_putpage called"); | |
| 108 | } | |
| 109 | ||
| 110 | /* | |
| 111 | * Implement a pretty aggressive clustered getpages strategy. Hint that | |
| 112 | * everything in an entire 4MB window should be prefaulted at once. | |
| 113 | * | |
| 114 | * XXX 4MB (1024 slots per page table page) is convenient for x86, | |
| 115 | * but may not be for other arches. | |
| 116 | */ | |
| 117 | #ifndef PHYSCLUSTER | |
| 118 | #define PHYSCLUSTER 1024 | |
| 119 | #endif | |
| 1b9d3514 | 120 | |
| 8e7c4729 MD |
121 | /* |
| 122 | * No requirements. | |
| 123 | */ | |
| 984263bc | 124 | static boolean_t |
| 1b9d3514 | 125 | phys_pager_haspage(vm_object_t object, vm_pindex_t pindex) |
| 984263bc | 126 | { |
| 984263bc MD |
127 | return (TRUE); |
| 128 | } | |
| 129 | ||
| 130 | struct pagerops physpagerops = { | |
| 984263bc | 131 | phys_pager_dealloc, |
| 1b9d3514 | 132 | phys_pager_getpage, |
| 984263bc | 133 | phys_pager_putpages, |
| 107e9bcc | 134 | phys_pager_haspage |
| 984263bc | 135 | }; |