| /* Copyright (c) 2010 The Regents of the University of California |
| * Barret Rhoden <brho@cs.berkeley.edu> |
| * See LICENSE for details. |
| * |
| * Page mapping: maps an object (inode or block dev) in page size chunks. |
| * Analagous to Linux's "struct address space". While this is closely coupled |
| * with the VFS, block devices also use it (hence the separate header and c |
| * file). */ |
| |
| #pragma once |
| |
| #include <radix.h> |
| #include <atomic.h> |
| #include <mm.h> |
| |
| /* Need to be careful, due to some ghetto circular references */ |
| struct page; |
| struct chan; |
| struct page_map_operations; |
| |
| /* Every object that has pages has a page_map, tracking which of its pages are |
| * currently in memory. It is a map, per object, from index to physical page |
| * frame. */ |
| struct page_map { |
| qlock_t pm_qlock;/* for the radix tree nr_pgs */ |
| struct fs_file *pm_file; |
| struct radix_tree pm_tree; /* tracks present pgs */ |
| unsigned long pm_num_pages; /* num present */ |
| struct page_map_operations *pm_op; |
| spinlock_t pm_lock; /* for the VMR list */ |
| struct vmr_tailq pm_vmrs; |
| }; |
| |
| /* Operations performed on a page_map. These are usually FS specific, which |
| * get assigned when the inode is created. |
| * Will fill these in as they are created/needed/used. */ |
| struct page_map_operations { |
| int (*readpage) (struct page_map *, struct page *); |
| int (*writepage) (struct page_map *, struct page *); |
| /* readpages: read a list of pages |
| writepage: write from a page to its backing store |
| writepages: write a list of pages |
| sync_page: start the IO of already scheduled ops |
| set_page_dirty: mark the given page dirty |
| prepare_write: prepare to write (disk backed pages) |
| commit_write: complete a write (disk backed pages) |
| bmap: get a logical block number from a file block index |
| invalidate page: invalidate, part of truncating |
| release page: prepare to release |
| direct_io: bypass the page cache */ |
| }; |
| |
| /* Page cache functions */ |
| void pm_init(struct page_map *pm, struct page_map_operations *op, void *host); |
| int pm_load_page(struct page_map *pm, unsigned long index, struct page **pp); |
| int pm_load_page_nowait(struct page_map *pm, unsigned long index, |
| struct page **pp); |
| void pm_put_page(struct page *page); |
| void pm_add_vmr(struct page_map *pm, struct vm_region *vmr); |
| void pm_remove_vmr(struct page_map *pm, struct vm_region *vmr); |
| void pm_remove_or_zero_pages(struct page_map *pm, unsigned long start_idx, |
| unsigned long nr_pgs); |
| void pm_writeback_pages(struct page_map *pm); |
| void pm_free_unused_pages(struct page_map *pm); |
| void pm_destroy(struct page_map *pm); |
| void pm_page_asserter(struct page *page, char *str); |
| void print_page_map_info(struct page_map *pm); |