vm: implement a sparse memory model
This commit is contained in:
@@ -14,6 +14,8 @@
|
||||
#define VM_MAX_ZONES (VM_ZONE_MAX + 1)
|
||||
/* maximum number of supported page orders */
|
||||
#define VM_MAX_PAGE_ORDERS (VM_PAGE_MAX_ORDER + 1)
|
||||
/* maximum number of sparse memory sectors */
|
||||
#define VM_MAX_SECTORS 1024
|
||||
|
||||
#define VM_CHECK_ALIGN(p, mask) ((((p) & (mask)) == (p)) ? 1 : 0)
|
||||
|
||||
@@ -189,15 +191,16 @@ typedef struct vm_slab {
|
||||
|
||||
typedef struct vm_page {
|
||||
/* order of the page block that this page belongs too */
|
||||
uint16_t p_order : 4;
|
||||
uint32_t p_order : 4;
|
||||
/* the id of the NUMA node that this page belongs to */
|
||||
uint16_t p_node : 6;
|
||||
uint32_t p_node : 6;
|
||||
/* the id of the memory zone that this page belongs to */
|
||||
uint16_t p_zone : 3;
|
||||
/* some unused bits */
|
||||
uint16_t p_reserved : 3;
|
||||
|
||||
uint32_t p_zone : 3;
|
||||
/* vm_page_flags_t bitfields. */
|
||||
uint32_t p_sector : 11;
|
||||
/* some unused bits */
|
||||
uint32_t p_reserved : 8;
|
||||
|
||||
uint32_t p_flags;
|
||||
|
||||
/* multi-purpose list.
|
||||
@@ -216,6 +219,21 @@ typedef struct vm_page {
|
||||
|
||||
} __attribute__((aligned(2 * sizeof(unsigned long)))) vm_page_t;
|
||||
|
||||
/* represents a sector of memory, containing its own array of vm_pages.
|
||||
this struct is used under the sparse memory model, instead of the
|
||||
global vm_page array */
|
||||
typedef struct vm_sector {
|
||||
/* sector size. this must be a power of 2.
|
||||
all sectors in the system have the same size. */
|
||||
vm_page_order_t s_size;
|
||||
/* PFN of the first page contained in s_pages.
|
||||
to find the PFN of any page contained within s_pages,
|
||||
simply add its offset within the array to s_first_pfn */
|
||||
size_t s_first_pfn;
|
||||
/* array of pages contained in this sector */
|
||||
vm_page_t *s_pages;
|
||||
} vm_sector_t;
|
||||
|
||||
extern kern_status_t vm_bootstrap(const vm_zone_descriptor_t *zones, size_t nr_zones);
|
||||
extern vm_model_t vm_memory_model(void);
|
||||
extern void vm_set_memory_model(vm_model_t model);
|
||||
@@ -264,4 +282,9 @@ extern void vm_flat_init(void);
|
||||
extern vm_page_t *vm_page_get_flat(phys_addr_t addr);
|
||||
extern size_t vm_page_get_pfn_flat(vm_page_t *pg);
|
||||
|
||||
/* Sparse memory model functions */
|
||||
extern void vm_sparse_init(void);
|
||||
extern vm_page_t *vm_page_get_sparse(phys_addr_t addr);
|
||||
extern size_t vm_page_get_pfn_sparse(vm_page_t *pg);
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user