ia64/xen-unstable

annotate xen/include/xen/mm.h @ 14098:c64aa7fb7712

xen memory allocator: hide generic allocator routines

This patch doesn't introduce functional changes, but simply moves code
around to make the unused (outside of the page allocator) heap alloc
functions taking an explicit zone parameter static without having to
forward-prototype them in their source file.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
author kfraser@localhost.localdomain
date Fri Feb 23 16:55:56 2007 +0000 (2007-02-23)
parents 3746b3d4f301
children ee4850bc895b
rev   line source
kaf24@8726 1 /******************************************************************************
kaf24@8726 2 * include/xen/mm.h
kaf24@8726 3 *
kaf24@8726 4 * Definitions for memory pages, frame numbers, addresses, allocations, etc.
kaf24@8726 5 *
kaf24@8726 6 * Note that Xen must handle several different physical 'address spaces' and
kaf24@8726 7 * there is a consistent terminology for these:
kaf24@8726 8 *
kaf24@8726 9 * 1. gpfn/gpaddr: A guest-specific pseudo-physical frame number or address.
kaf24@8726 10 * 2. gmfn/gmaddr: A machine address from the p.o.v. of a particular guest.
kaf24@8726 11 * 3. mfn/maddr: A real machine frame number or address.
kaf24@8726 12 * 4. pfn/paddr: Used in 'polymorphic' functions that work across all
kaf24@8726 13 * address spaces, depending on context. See the pagetable
kaf24@8726 14 * conversion macros in asm-x86/page.h for examples.
kaf24@8726 15 * Also 'paddr_t' is big enough to store any physical address.
kaf24@8726 16 *
kaf24@8726 17 * This scheme provides consistent function and variable names even when
kaf24@8726 18 * different guests are running in different memory-management modes.
kaf24@8726 19 * 1. A guest running in auto-translated mode (e.g., shadow_mode_translate())
kaf24@8726 20 * will have gpfn == gmfn and gmfn != mfn.
kaf24@8726 21 * 2. A paravirtualised x86 guest will have gpfn != gmfn and gmfn == mfn.
kaf24@8726 22 * 3. A paravirtualised guest with no pseudophysical overlay will have
kaf24@8726 23 * gpfn == gpmfn == mfn.
kaf24@8726 24 *
kaf24@8726 25 * Copyright (c) 2002-2006, K A Fraser <keir@xensource.com>
kaf24@8726 26 */
kaf24@1210 27
kaf24@1211 28 #ifndef __XEN_MM_H__
kaf24@1211 29 #define __XEN_MM_H__
kaf24@1210 30
kaf24@4267 31 #include <xen/config.h>
kaf24@5398 32 #include <xen/types.h>
kaf24@4267 33 #include <xen/list.h>
kaf24@4267 34 #include <xen/spinlock.h>
kaf24@4267 35
kaf24@1941 36 struct domain;
kaf24@8726 37 struct page_info;
kaf24@1936 38
kaf24@3354 39 /* Boot-time allocator. Turns into generic allocator after bootstrap. */
kaf24@8726 40 paddr_t init_boot_allocator(paddr_t bitmap_start);
kaf24@8726 41 void init_boot_pages(paddr_t ps, paddr_t pe);
kfraser@14083 42 unsigned long alloc_boot_pages(
kfraser@14083 43 unsigned long nr_pfns, unsigned long pfn_align);
kfraser@14083 44 unsigned long alloc_boot_low_pages(
kfraser@14083 45 unsigned long nr_pfns, unsigned long pfn_align);
kfraser@14083 46 int reserve_boot_pages(unsigned long first_pfn, unsigned long nr_pfns);
kaf24@3354 47 void end_boot_allocator(void);
kaf24@3354 48
kaf24@2806 49 /* Xen suballocator. These functions are interrupt-safe. */
kaf24@8726 50 void init_xenheap_pages(paddr_t ps, paddr_t pe);
kaf24@5398 51 void *alloc_xenheap_pages(unsigned int order);
kaf24@5398 52 void free_xenheap_pages(void *v, unsigned int order);
kaf24@1920 53 #define alloc_xenheap_page() (alloc_xenheap_pages(0))
kaf24@5398 54 #define free_xenheap_page(v) (free_xenheap_pages(v,0))
kaf24@1749 55
kaf24@2806 56 /* Domain suballocator. These functions are *not* interrupt-safe.*/
kaf24@8726 57 void init_domheap_pages(paddr_t ps, paddr_t pe);
kaf24@8726 58 struct page_info *alloc_domheap_pages(
kfraser@10418 59 struct domain *d, unsigned int order, unsigned int memflags);
kfraser@11972 60 struct page_info *__alloc_domheap_pages(
kfraser@11972 61 struct domain *d, unsigned int cpu, unsigned int order,
kfraser@11972 62 unsigned int memflags);
kaf24@8726 63 void free_domheap_pages(struct page_info *pg, unsigned int order);
kaf24@1936 64 unsigned long avail_domheap_pages(void);
kaf24@5929 65 #define alloc_domheap_page(d) (alloc_domheap_pages(d,0,0))
kaf24@5398 66 #define free_domheap_page(p) (free_domheap_pages(p,0))
kaf24@1210 67
kfraser@14098 68 void scrub_heap_pages(void);
kfraser@14098 69
kfraser@10418 70 int assign_pages(
kfraser@10418 71 struct domain *d,
kfraser@10418 72 struct page_info *pg,
kfraser@10418 73 unsigned int order,
kfraser@10418 74 unsigned int memflags);
kfraser@10418 75
kfraser@10418 76 /* memflags: */
kfraser@10418 77 #define _MEMF_dma 0
kfraser@10418 78 #define MEMF_dma (1U<<_MEMF_dma)
kfraser@10418 79 #define _MEMF_no_refcount 1
kfraser@10418 80 #define MEMF_no_refcount (1U<<_MEMF_no_refcount)
kaf24@5929 81
kaf24@10340 82 #ifdef CONFIG_PAGEALLOC_MAX_ORDER
kaf24@10340 83 #define MAX_ORDER CONFIG_PAGEALLOC_MAX_ORDER
kaf24@10340 84 #else
kaf24@10341 85 #define MAX_ORDER 20 /* 2^20 contiguous pages */
kaf24@10340 86 #endif
kaf24@9456 87
kfraser@12641 88 /* DMA heap parameters. */
kfraser@12641 89 extern unsigned int dma_bitsize;
kfraser@12641 90 extern unsigned long max_dma_mfn;
kfraser@12641 91
kaf24@4267 92 /* Automatic page scrubbing for dead domains. */
kaf24@4267 93 extern struct list_head page_scrub_list;
kaf24@4267 94 #define page_scrub_schedule_work() \
kaf24@4267 95 do { \
kaf24@4267 96 if ( !list_empty(&page_scrub_list) ) \
kaf24@4267 97 raise_softirq(PAGE_SCRUB_SOFTIRQ); \
kaf24@4267 98 } while ( 0 )
kaf24@10541 99 unsigned long avail_scrub_pages(void);
kaf24@4267 100
kaf24@1941 101 #include <asm/mm.h>
kaf24@1941 102
cl349@9211 103 int guest_remove_page(struct domain *d, unsigned long gmfn);
cl349@9211 104
kfraser@11177 105 /* Returns TRUE if the memory at address @p is ordinary RAM. */
kfraser@11177 106 int memory_is_conventional_ram(paddr_t p);
kfraser@11177 107
kaf24@1211 108 #endif /* __XEN_MM_H__ */