]> git.proxmox.com Git - ceph.git/blob - ceph/src/pmdk/src/common/mmap.h
import ceph 16.2.7
[ceph.git] / ceph / src / pmdk / src / common / mmap.h
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright 2014-2020, Intel Corporation */
3
4 /*
5 * mmap.h -- internal definitions for mmap module
6 */
7
8 #ifndef PMDK_MMAP_H
9 #define PMDK_MMAP_H 1
10
11 #include <stddef.h>
12 #include <stdint.h>
13 #include <sys/stat.h>
14 #include <sys/types.h>
15 #include <unistd.h>
16 #include <errno.h>
17
18 #include "out.h"
19 #include "queue.h"
20 #include "os.h"
21
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25
26 extern int Mmap_no_random;
27 extern void *Mmap_hint;
28 extern char *Mmap_mapfile;
29
30 void *util_map_sync(void *addr, size_t len, int proto, int flags, int fd,
31 os_off_t offset, int *map_sync);
32 void *util_map(int fd, os_off_t off, size_t len, int flags, int rdonly,
33 size_t req_align, int *map_sync);
34 int util_unmap(void *addr, size_t len);
35
36 #ifdef __FreeBSD__
37 #define MAP_NORESERVE 0
38 #define OS_MAPFILE "/proc/curproc/map"
39 #else
40 #define OS_MAPFILE "/proc/self/maps"
41 #endif
42
43 #ifndef MAP_SYNC
44 #define MAP_SYNC 0x80000
45 #endif
46
47 #ifndef MAP_SHARED_VALIDATE
48 #define MAP_SHARED_VALIDATE 0x03
49 #endif
50
51 /*
52 * macros for micromanaging range protections for the debug version
53 */
54 #ifdef DEBUG
55
56 #define RANGE(addr, len, is_dev_dax, type) do {\
57 if (!is_dev_dax) ASSERT(util_range_##type(addr, len) >= 0);\
58 } while (0)
59
60 #else
61
62 #define RANGE(addr, len, is_dev_dax, type) do {} while (0)
63
64 #endif
65
66 #define RANGE_RO(addr, len, is_dev_dax) RANGE(addr, len, is_dev_dax, ro)
67 #define RANGE_RW(addr, len, is_dev_dax) RANGE(addr, len, is_dev_dax, rw)
68 #define RANGE_NONE(addr, len, is_dev_dax) RANGE(addr, len, is_dev_dax, none)
69
70 /* pmem mapping type */
71 enum pmem_map_type {
72 PMEM_DEV_DAX, /* device dax */
73 PMEM_MAP_SYNC, /* mapping with MAP_SYNC flag on dax fs */
74
75 MAX_PMEM_TYPE
76 };
77
78 /*
79 * this structure tracks the file mappings outstanding per file handle
80 */
81 struct map_tracker {
82 PMDK_SORTEDQ_ENTRY(map_tracker) entry;
83 uintptr_t base_addr;
84 uintptr_t end_addr;
85 unsigned region_id;
86 enum pmem_map_type type;
87 #ifdef _WIN32
88 /* Windows-specific data */
89 HANDLE FileHandle;
90 HANDLE FileMappingHandle;
91 DWORD Access;
92 os_off_t Offset;
93 size_t FileLen;
94 #endif
95 };
96
97 void util_mmap_init(void);
98 void util_mmap_fini(void);
99
100 int util_range_ro(void *addr, size_t len);
101 int util_range_rw(void *addr, size_t len);
102 int util_range_none(void *addr, size_t len);
103
104 char *util_map_hint_unused(void *minaddr, size_t len, size_t align);
105 char *util_map_hint(size_t len, size_t req_align);
106
107 #define KILOBYTE ((uintptr_t)1 << 10)
108 #define MEGABYTE ((uintptr_t)1 << 20)
109 #define GIGABYTE ((uintptr_t)1 << 30)
110
111 /*
112 * util_map_hint_align -- choose the desired mapping alignment
113 *
114 * The smallest supported alignment is 2 megabytes because of the object
115 * alignment requirements. Changing this value to 4 kilobytes constitues a
116 * layout change.
117 *
118 * Use 1GB page alignment only if the mapping length is at least
119 * twice as big as the page size.
120 */
121 static inline size_t
122 util_map_hint_align(size_t len, size_t req_align)
123 {
124 size_t align = 2 * MEGABYTE;
125 if (req_align)
126 align = req_align;
127 else if (len >= 2 * GIGABYTE)
128 align = GIGABYTE;
129
130 return align;
131 }
132
133 int util_range_register(const void *addr, size_t len, const char *path,
134 enum pmem_map_type type);
135 int util_range_unregister(const void *addr, size_t len);
136 struct map_tracker *util_range_find(uintptr_t addr, size_t len);
137 int util_range_is_pmem(const void *addr, size_t len);
138
139 #ifdef __cplusplus
140 }
141 #endif
142 #endif