aboutsummaryrefslogtreecommitdiff
path: root/vm/vm_page.h
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2021-08-27 22:40:50 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2021-08-27 22:40:50 +0200
commit2125e974fe7d9773f3d598a064646dc757da3622 (patch)
tree833cc0dc7040d587db54cc52c530e3c83f5b8d21 /vm/vm_page.h
parent4dbaa718038fadc51d9b95d2383868a229d91457 (diff)
downloadgnumach-2125e974fe7d9773f3d598a064646dc757da3622.tar.gz
gnumach-2125e974fe7d9773f3d598a064646dc757da3622.tar.bz2
gnumach-2125e974fe7d9773f3d598a064646dc757da3622.zip
vm_page_grab: allow allocating in high memory
vm_page_grab was systematically using the VM_PAGE_SEL_DIRECTMAP selector to play safe with existing code. This adds a flags parameter to let callers of vm_page_grab specify their constraints. Linux drivers need 32bit dmas, Xen drivers use kvtophys to clear some data. Callers of kmem_pagealloc_physmem and vm_page_grab_phys_addr also use kvtophys. Otherwise allocations can go to highmem. This fixes the allocation jam in the directmap segment. * vm/vm_page.h (VM_PAGE_DMA, VM_PAGE_DMA32, VM_PAGE_DIRECTMAP, VM_PAGE_HIGHMEM): New macros. (vm_page_grab): Add flags parameter. * vm/vm_resident.c (vm_page_grab): Choose allocation selector according to flags parameter. (vm_page_convert, vm_page_alloc): Pass VM_PAGE_HIGHMEM to vm_page_grab. (vm_page_grab_phys_addr): Pass VM_PAGE_DIRECTMAP to vm_page_grab. * vm/vm_fault.c (vm_fault_page): Pass VM_PAGE_HIGHMEM to vm_page_grab. * vm/vm_map.c (vm_map_copy_steal_pages): Pass VM_PAGE_HIGHMEM to vm_page_grab. * kern/slab.c (kmem_pagealloc_physmem): Pass VM_PAGE_DIRECTMAP to vm_page_grab. * i386/intel/pmap.c (pmap_page_table_page_alloc): Pass VM_PAGE_DIRECTMAP to vm_page_grab. * xen/block.c (device_read): Pass VM_PAGE_DIRECTMAP to vm_page_grab. * linux/dev/glue/block.c (alloc_buffer): Pass VM_PAGE_DMA32 to vm_page_grab.
Diffstat (limited to 'vm/vm_page.h')
-rw-r--r--vm/vm_page.h7
1 files changed, 6 insertions, 1 deletions
diff --git a/vm/vm_page.h b/vm/vm_page.h
index d9af188c..d457f9a2 100644
--- a/vm/vm_page.h
+++ b/vm/vm_page.h
@@ -155,6 +155,11 @@ void vm_page_check(const struct vm_page *page);
* ordered, in LRU-like fashion.
*/
+#define VM_PAGE_DMA 0x01
+#define VM_PAGE_DMA32 0x02
+#define VM_PAGE_DIRECTMAP 0x04
+#define VM_PAGE_HIGHMEM 0x08
+
extern
int vm_page_fictitious_count;/* How many fictitious pages are free? */
extern
@@ -187,7 +192,7 @@ extern vm_page_t vm_page_lookup(
extern vm_page_t vm_page_grab_fictitious(void);
extern boolean_t vm_page_convert(vm_page_t *);
extern void vm_page_more_fictitious(void);
-extern vm_page_t vm_page_grab(void);
+extern vm_page_t vm_page_grab(unsigned flags);
extern void vm_page_release(vm_page_t, boolean_t, boolean_t);
extern phys_addr_t vm_page_grab_phys_addr(void);
extern vm_page_t vm_page_grab_contig(vm_size_t, unsigned int);