1 /*
2  * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 #ifndef OS_LINUX_GC_Z_ZPHYSICALMEMORYBACKING_LINUX_HPP
25 #define OS_LINUX_GC_Z_ZPHYSICALMEMORYBACKING_LINUX_HPP
26 
27 class ZErrno;
28 
29 class ZPhysicalMemoryBacking {
30 private:
31   int      _fd;
32   size_t   _size;
33   uint64_t _filesystem;
34   size_t   _block_size;
35   size_t   _available;
36   bool     _initialized;
37 
38   void warn_available_space(size_t max_capacity) const;
39   void warn_max_map_count(size_t max_capacity) const;
40 
41   int create_mem_fd(const char* name) const;
42   int create_file_fd(const char* name) const;
43   int create_fd(const char* name) const;
44 
45   bool is_tmpfs() const;
46   bool is_hugetlbfs() const;
47   bool tmpfs_supports_transparent_huge_pages() const;
48 
49   ZErrno fallocate_compat_mmap_hugetlbfs(size_t offset, size_t length, bool touch) const;
50   ZErrno fallocate_compat_mmap_tmpfs(size_t offset, size_t length) const;
51   ZErrno fallocate_compat_pwrite(size_t offset, size_t length) const;
52   ZErrno fallocate_fill_hole_compat(size_t offset, size_t length) const;
53   ZErrno fallocate_fill_hole_syscall(size_t offset, size_t length) const;
54   ZErrno fallocate_fill_hole(size_t offset, size_t length) const;
55   ZErrno fallocate_punch_hole(size_t offset, size_t length) const;
56   ZErrno split_and_fallocate(bool punch_hole, size_t offset, size_t length) const;
57   ZErrno fallocate(bool punch_hole, size_t offset, size_t length) const;
58 
59   bool commit_inner(size_t offset, size_t length) const;
60   size_t commit_numa_interleaved(size_t offset, size_t length) const;
61   size_t commit_default(size_t offset, size_t length) const;
62 
63 public:
64   ZPhysicalMemoryBacking(size_t max_capacity);
65 
66   bool is_initialized() const;
67 
68   void warn_commit_limits(size_t max_capacity) const;
69 
70   size_t commit(size_t offset, size_t length) const;
71   size_t uncommit(size_t offset, size_t length) const;
72 
73   void map(uintptr_t addr, size_t size, uintptr_t offset) const;
74   void unmap(uintptr_t addr, size_t size) const;
75 };
76 
77 #endif // OS_LINUX_GC_Z_ZPHYSICALMEMORYBACKING_LINUX_HPP
78