xref: /haiku/src/system/kernel/vm/VMAnonymousCache.h (revision 21258e2674226d6aa732321b6f8494841895af5f)
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 	virtual	status_t			Rebase(off_t newBase, int priority);
44 	virtual	status_t			Adopt(VMCache* source, off_t offset,
45 									off_t size, off_t newOffset);
46 
47 	virtual	status_t			Discard(off_t offset, off_t size);
48 
49 	virtual	status_t			Commit(off_t size, int priority);
50 	virtual	bool				HasPage(off_t offset);
51 	virtual	bool				DebugHasPage(off_t offset);
52 
53 	virtual	int32				GuardSize()	{ return fGuardedSize; }
54 	virtual	void				SetGuardSize(int32 guardSize)
55 									{ fGuardedSize = guardSize; }
56 
57 	virtual	status_t			Read(off_t offset, const generic_io_vec* vecs,
58 									size_t count, uint32 flags,
59 									generic_size_t* _numBytes);
60 	virtual	status_t			Write(off_t offset, const generic_io_vec* vecs,
61 									size_t count, uint32 flags,
62 									generic_size_t* _numBytes);
63 	virtual	status_t			WriteAsync(off_t offset,
64 									const generic_io_vec* vecs, size_t count,
65 									generic_size_t numBytes, uint32 flags,
66 									AsyncIOCallback* callback);
67 	virtual	bool				CanWritePage(off_t offset);
68 
69 	virtual	int32				MaxPagesPerAsyncWrite() const;
70 
71 	virtual	status_t			Fault(struct VMAddressSpace* aspace,
72 									off_t offset);
73 
74 	virtual	void				Merge(VMCache* source);
75 
76 protected:
77 	virtual	void				DeleteObject();
78 
79 private:
80 			class WriteCallback;
81 			friend class WriteCallback;
82 
83 			void				_SwapBlockBuild(off_t pageIndex,
84 									swap_addr_t slotIndex, uint32 count);
85 			void				_SwapBlockFree(off_t pageIndex, uint32 count);
86 			swap_addr_t			_SwapBlockGetAddress(off_t pageIndex);
87 			status_t			_Commit(off_t size, int priority);
88 
89 			void				_MergePagesSmallerSource(
90 									VMAnonymousCache* source);
91 			void				_MergePagesSmallerConsumer(
92 									VMAnonymousCache* source);
93 			void				_MergeSwapPages(VMAnonymousCache* source);
94 
95 			void				_FreeSwapPageRange(off_t fromOffset,
96 									off_t toOffset, bool skipBusyPages = true);
97 
98 private:
99 	friend bool swap_free_page_swap_space(vm_page* page);
100 
101 			bool				fCanOvercommit;
102 			bool				fHasPrecommitted;
103 			uint8				fPrecommittedPages;
104 			int32				fGuardedSize;
105 			off_t				fCommittedSwapSize;
106 			off_t				fAllocatedSwapSize;
107 };
108 
109 #endif	// ENABLE_SWAP_SUPPORT
110 
111 
112 extern "C" void swap_get_info(system_info* info);
113 
114 
115 #endif	/* _KERNEL_VM_STORE_ANONYMOUS_H */
116