bd2e5e4a1ed54a72b2286ae3fcf98837159bbfa5
[akaros.git] / kern / include / pagemap.h
1 /* Copyright (c) 2010 The Regents of the University of California
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details.
4  *
5  * Page mapping: maps an object (inode or block dev) in page size chunks.
6  * Analagous to Linux's "struct address space".  While this is closely coupled
7  * with the VFS, block devices also use it (hence the separate header and c
8  * file). */
9
10 #pragma once
11
12 #include <radix.h>
13 #include <atomic.h>
14 #include <mm.h>
15
16 /* Need to be careful, due to some ghetto circular references */
17 struct page;
18 struct chan;
19 struct page_map_operations;
20
21 /* Every object that has pages has a page_map, tracking which of its pages are
22  * currently in memory.  It is a map, per object, from index to physical page
23  * frame. */
24 struct page_map {
25         qlock_t                                         pm_qlock;               /* for the radix tree nr_pgs */
26         struct fs_file                          *pm_file;
27         struct radix_tree                       pm_tree;                /* tracks present pages */
28         unsigned long                           pm_num_pages;   /* how many pages are present */
29         struct page_map_operations      *pm_op;
30         spinlock_t                                      pm_lock;                /* for the VMR list */
31         struct vmr_tailq                        pm_vmrs;
32 };
33
34 /* Operations performed on a page_map.  These are usually FS specific, which
35  * get assigned when the inode is created.
36  * Will fill these in as they are created/needed/used. */
37 struct page_map_operations {
38         int (*readpage) (struct page_map *, struct page *);
39         int (*writepage) (struct page_map *, struct page *);
40 /*      readpages: read a list of pages
41         writepage: write from a page to its backing store
42         writepages: write a list of pages
43         sync_page: start the IO of already scheduled ops
44         set_page_dirty: mark the given page dirty
45         prepare_write: prepare to write (disk backed pages)
46         commit_write: complete a write (disk backed pages)
47         bmap: get a logical block number from a file block index
48         invalidate page: invalidate, part of truncating
49         release page: prepare to release
50         direct_io: bypass the page cache */
51 };
52
53 /* Page cache functions */
54 void pm_init(struct page_map *pm, struct page_map_operations *op, void *host);
55 int pm_load_page(struct page_map *pm, unsigned long index, struct page **pp);
56 int pm_load_page_nowait(struct page_map *pm, unsigned long index,
57                         struct page **pp);
58 void pm_put_page(struct page *page);
59 void pm_add_vmr(struct page_map *pm, struct vm_region *vmr);
60 void pm_remove_vmr(struct page_map *pm, struct vm_region *vmr);
61 int pm_remove_contig(struct page_map *pm, unsigned long index,
62                      unsigned long nr_pgs);
63 void pm_remove_or_zero_pages(struct page_map *pm, unsigned long start_idx,
64                              unsigned long nr_pgs);
65 void pm_destroy(struct page_map *pm);
66 void pm_page_asserter(struct page *page, char *str);
67 void print_page_map_info(struct page_map *pm);