xref: /haiku/src/system/kernel/vm/VMAnonymousCache.h (revision 71452e98334eaac603bf542d159e24788a46bebb)
1 /*
2  * Copyright 2008-2011, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Copyright 2004-2008, Axel Dörfler, axeld@pinc-software.de.
4  * Distributed under the terms of the MIT License.
5  *
6  * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
7  * Distributed under the terms of the NewOS License.
8  */
9 #ifndef _KERNEL_VM_STORE_ANONYMOUS_H
10 #define _KERNEL_VM_STORE_ANONYMOUS_H
11 
12 
13 #include <vm/VMCache.h>
14 
15 
16 #if ENABLE_SWAP_SUPPORT
17 
18 typedef uint32 swap_addr_t;
19 	// TODO: Should be wider, but RadixBitmap supports only a 32 bit type ATM!
20 struct swap_block;
21 struct system_memory_info;
22 
23 
24 extern "C" {
25 	void swap_init(void);
26 	void swap_init_post_modules(void);
27 	bool swap_free_page_swap_space(vm_page* page);
28 	uint32 swap_available_pages(void);
29 	uint32 swap_total_swap_pages(void);
30 }
31 
32 
33 class VMAnonymousCache : public VMCache {
34 public:
35 	virtual						~VMAnonymousCache();
36 
37 			status_t			Init(bool canOvercommit,
38 									int32 numPrecommittedPages,
39 									int32 numGuardPages,
40 									uint32 allocationFlags);
41 
42 	virtual	status_t			Resize(off_t newSize, int priority);
43 
44 	virtual	status_t			Commit(off_t size, int priority);
45 	virtual	bool				HasPage(off_t offset);
46 	virtual	bool				DebugHasPage(off_t offset);
47 
48 	virtual	int32				GuardSize()	{ return fGuardedSize; }
49 
50 	virtual	status_t			Read(off_t offset, const generic_io_vec* vecs,
51 									size_t count, uint32 flags,
52 									generic_size_t* _numBytes);
53 	virtual	status_t			Write(off_t offset, const generic_io_vec* vecs,
54 									size_t count, uint32 flags,
55 									generic_size_t* _numBytes);
56 	virtual	status_t			WriteAsync(off_t offset,
57 									const generic_io_vec* vecs, size_t count,
58 									generic_size_t numBytes, uint32 flags,
59 									AsyncIOCallback* callback);
60 	virtual	bool				CanWritePage(off_t offset);
61 
62 	virtual	int32				MaxPagesPerAsyncWrite() const;
63 
64 	virtual	status_t			Fault(struct VMAddressSpace* aspace,
65 									off_t offset);
66 
67 	virtual	void				Merge(VMCache* source);
68 
69 protected:
70 	virtual	void				DeleteObject();
71 
72 private:
73 			class WriteCallback;
74 			friend class WriteCallback;
75 
76 			void				_SwapBlockBuild(off_t pageIndex,
77 									swap_addr_t slotIndex, uint32 count);
78 			void        		_SwapBlockFree(off_t pageIndex, uint32 count);
79 			swap_addr_t			_SwapBlockGetAddress(off_t pageIndex);
80 			status_t			_Commit(off_t size, int priority);
81 
82 			void				_MergePagesSmallerSource(
83 									VMAnonymousCache* source);
84 			void				_MergePagesSmallerConsumer(
85 									VMAnonymousCache* source);
86 			void				_MergeSwapPages(VMAnonymousCache* source);
87 
88 private:
89 	friend bool swap_free_page_swap_space(vm_page* page);
90 
91 			bool				fCanOvercommit;
92 			bool				fHasPrecommitted;
93 			uint8				fPrecommittedPages;
94 			int32				fGuardedSize;
95 			off_t   			fCommittedSwapSize;
96 			off_t   			fAllocatedSwapSize;
97 };
98 
99 #endif	// ENABLE_SWAP_SUPPORT
100 
101 
102 extern "C" void swap_get_info(system_info* info);
103 
104 
105 #endif	/* _KERNEL_VM_STORE_ANONYMOUS_H */
106