Initial page cache structures
[akaros.git] / kern / include / page_alloc.h
1 /* Copyright (c) 2009, 2010 The Regents of the University  of California. 
2  * See the COPYRIGHT files at the top of this source tree for full 
3  * license information.
4  * 
5  * Kevin Klues <klueska@cs.berkeley.edu>    
6  * Barret Rhoden <brho@cs.berkeley.edu> */
7  
8 #ifndef PAGE_ALLOC_H
9 #define PAGE_ALLOC_H
10
11 #include <atomic.h>
12 #include <sys/queue.h>
13 #include <error.h>
14 #include <arch/mmu.h>
15 #include <colored_page_alloc.h>
16 #include <process.h>
17
18 struct page_map;                /* preprocessor games */
19
20 /****************** Page Structures *********************/
21 struct page;
22 typedef size_t ppn_t;
23 typedef struct page page_t;
24 typedef LIST_HEAD(PageList, page) page_list_t;
25 typedef LIST_ENTRY(page) page_list_entry_t;
26
27 /* Per-page flag bits related to their state in the page cache */
28 #define PG_LOCKED               0x01
29 #define PG_VALID                0x02
30 #define PG_DIRTY                0x04
31
32 /* TODO: this struct is not protected from concurrent operations in any
33  * function.  We may want a lock, but a better thing would be a good use of
34  * reference counting and atomic operations. */
35 struct page {
36         LIST_ENTRY(page)                        pg_link;        /* membership in various lists */
37         atomic_t                                        pg_refcnt;
38         unsigned int                            pg_flags;
39         struct page_map                         *pg_mapping;
40         unsigned long                           pg_index;
41 };
42
43 /******** Externally visible global variables ************/
44 extern uint8_t* global_cache_colors_map;
45 extern spinlock_t colored_page_free_list_lock;
46 extern page_list_t LCKD(&colored_page_free_list_lock) * RO CT(llc_num_colors)
47     colored_page_free_list;
48
49 /*************** Functional Interface *******************/
50 void page_alloc_init(void);
51 void colored_page_alloc_init(void);
52
53 error_t upage_alloc(struct proc* p, page_t *SAFE *page, int zero);
54 error_t kpage_alloc(page_t *SAFE *page);
55 error_t upage_alloc_specific(struct proc* p, page_t *SAFE *page, size_t ppn);
56 error_t kpage_alloc_specific(page_t *SAFE *page, size_t ppn);
57 error_t colored_upage_alloc(uint8_t* map, page_t *SAFE *page, size_t color);
58 error_t page_free(page_t *SAFE page);
59
60 void *CT(1 << order) get_cont_pages(size_t order, int flags);
61 void free_cont_pages(void *buf, size_t order);
62
63 void page_incref(page_t *SAFE page);
64 void page_decref(page_t *SAFE page);
65 size_t page_getref(page_t *SAFE page);
66 void page_setref(page_t *SAFE page, size_t val);
67
68 int page_is_free(size_t ppn);
69
70 #endif //PAGE_ALLOC_H
71