Reader-writer queue locks
[akaros.git] / kern / include / page_alloc.h
index 3f94282..5a98312 100644 (file)
@@ -15,6 +15,8 @@
 #include <colored_page_alloc.h>
 #include <process.h>
 #include <kref.h>
+#include <kthread.h>
+#include <multiboot.h>
 
 struct page_map;               /* preprocessor games */
 
@@ -31,9 +33,11 @@ typedef LIST_ENTRY(page) page_list_entry_t;
 #define PG_DIRTY               0x004   /* page map, data is dirty */
 #define PG_BUFFER              0x008   /* is a buffer page, has BHs */
 
-/* TODO: this struct is not protected from concurrent operations in any
- * function.  We may want a lock, but a better thing would be a good use of
- * reference counting and atomic operations. */
+/* TODO: this struct is not protected from concurrent operations in some
+ * functions.  If you want to lock on it, use the spinlock in the semaphore.
+ * This structure is getting pretty big (and we're wasting RAM).  If it becomes
+ * an issue, we can dynamically allocate some of these things when we're a
+ * buffer page (in a page mapping) */
 struct page {
        LIST_ENTRY(page)                        pg_link;        /* membership in various lists */
        struct kref                                     pg_kref;
@@ -41,6 +45,7 @@ struct page {
        struct page_map                         *pg_mapping;
        unsigned long                           pg_index;
        void                                            *pg_private;    /* type depends on page usage */
+       struct semaphore                        pg_sem;         /* for blocking on IO */
 };
 
 /******** Externally visible global variables ************/
@@ -50,11 +55,13 @@ extern page_list_t LCKD(&colored_page_free_list_lock) * RO CT(llc_num_colors)
     colored_page_free_list;
 
 /*************** Functional Interface *******************/
-void page_alloc_init(void);
+void page_alloc_init(struct multiboot_info *mbi);
 void colored_page_alloc_init(void);
 
 error_t upage_alloc(struct proc* p, page_t *SAFE *page, int zero);
 error_t kpage_alloc(page_t *SAFE *page);
+void *kpage_alloc_addr(void);
+void *kpage_zalloc_addr(void);
 error_t upage_alloc_specific(struct proc* p, page_t *SAFE *page, size_t ppn);
 error_t kpage_alloc_specific(page_t *SAFE *page, size_t ppn);
 
@@ -68,6 +75,7 @@ void page_setref(page_t *SAFE page, size_t val);
 int page_is_free(size_t ppn);
 void lock_page(struct page *page);
 void unlock_page(struct page *page);
+void print_pageinfo(struct page *page);
 
 #endif //PAGE_ALLOC_H