]>
git.proxmox.com Git - ceph.git/blob - ceph/src/pmdk/src/common/mmap.h
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright 2014-2020, Intel Corporation */
5 * mmap.h -- internal definitions for mmap module
14 #include <sys/types.h>
26 extern int Mmap_no_random
;
27 extern void *Mmap_hint
;
28 extern char *Mmap_mapfile
;
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
);
37 #define MAP_NORESERVE 0
38 #define OS_MAPFILE "/proc/curproc/map"
40 #define OS_MAPFILE "/proc/self/maps"
44 #define MAP_SYNC 0x80000
47 #ifndef MAP_SHARED_VALIDATE
48 #define MAP_SHARED_VALIDATE 0x03
52 * macros for micromanaging range protections for the debug version
56 #define RANGE(addr, len, is_dev_dax, type) do {\
57 if (!is_dev_dax) ASSERT(util_range_##type(addr, len) >= 0);\
62 #define RANGE(addr, len, is_dev_dax, type) do {} while (0)
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)
70 /* pmem mapping type */
72 PMEM_DEV_DAX
, /* device dax */
73 PMEM_MAP_SYNC
, /* mapping with MAP_SYNC flag on dax fs */
79 * this structure tracks the file mappings outstanding per file handle
82 PMDK_SORTEDQ_ENTRY(map_tracker
) entry
;
86 enum pmem_map_type type
;
88 /* Windows-specific data */
90 HANDLE FileMappingHandle
;
97 void util_mmap_init(void);
98 void util_mmap_fini(void);
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
);
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
);
107 #define KILOBYTE ((uintptr_t)1 << 10)
108 #define MEGABYTE ((uintptr_t)1 << 20)
109 #define GIGABYTE ((uintptr_t)1 << 30)
112 * util_map_hint_align -- choose the desired mapping alignment
114 * The smallest supported alignment is 2 megabytes because of the object
115 * alignment requirements. Changing this value to 4 kilobytes constitues a
118 * Use 1GB page alignment only if the mapping length is at least
119 * twice as big as the page size.
122 util_map_hint_align(size_t len
, size_t req_align
)
124 size_t align
= 2 * MEGABYTE
;
127 else if (len
>= 2 * GIGABYTE
)
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
);