Message ID | 62a8796330b86f9f6571e48755d718db11855a6b.1545120100.git.yi.z.zhang@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | nvdimm: support MAP_SYNC for memory-backend-file | expand |
On Tue, Dec 18, 2018 at 04:17:04PM +0800, Zhang Yi wrote: > As more flag parameters besides the existing 'shared' are going to be > added to qemu_ram_mmap(), let's switch 'shared' to a 'flags' parameter > in advance, so as to ease the further additions. > > Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com> > Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com> And that's the trouble with patch 1: no type safety. See below > --- > exec.c | 7 ++++--- > include/qemu/mmap-alloc.h | 19 ++++++++++++++++++- > util/mmap-alloc.c | 8 +++++--- > util/oslib-posix.c | 8 +++++++- > 4 files changed, 34 insertions(+), 8 deletions(-) > > diff --git a/exec.c b/exec.c > index bb6170d..e92a7da 100644 > --- a/exec.c > +++ b/exec.c > @@ -1810,6 +1810,7 @@ static void *file_ram_alloc(RAMBlock *block, > ram_addr_t memory, > int fd, > bool truncate, > + uint32_t flags, > Error **errp) > { > void *area; > @@ -1859,8 +1860,7 @@ static void *file_ram_alloc(RAMBlock *block, > perror("ftruncate"); > } > > - area = qemu_ram_mmap(fd, memory, block->mr->align, > - block->flags & RAM_SHARED); > + area = qemu_ram_mmap(fd, memory, block->mr->align, flags); > if (area == MAP_FAILED) { > error_setg_errno(errp, errno, > "unable to map backing store for guest RAM"); > @@ -2279,7 +2279,8 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr, > new_block->used_length = size; > new_block->max_length = size; > new_block->flags = ram_flags; > - new_block->host = file_ram_alloc(new_block, size, fd, !file_size, errp); > + new_block->host = file_ram_alloc(new_block, size, fd, !file_size, > + ram_flags, errp); > if (!new_block->host) { > g_free(new_block); > return NULL; > diff --git a/include/qemu/mmap-alloc.h b/include/qemu/mmap-alloc.h > index 50385e3..6fe6ed4 100644 > --- a/include/qemu/mmap-alloc.h > +++ b/include/qemu/mmap-alloc.h > @@ -7,7 +7,24 @@ size_t qemu_fd_getpagesize(int fd); > > size_t qemu_mempath_getpagesize(const char *mem_path); > > -void *qemu_ram_mmap(int fd, size_t size, size_t align, bool shared); > +/** > + * qemu_ram_mmap: mmap the specified file or device. > + * > + * Parameters: > + * @fd: the file or the device to mmap > + * @size: the number of bytes to be mmaped > + * @align: if not zero, specify the alignment of the starting mapping address; > + * otherwise, the alignment in use will be determined by QEMU. > + * @flags: specifies additional properties of the mapping, which can be one or > + * bit-or of following values > + * - RAM_SHARED: mmap with MAP_SHARED flag > + * Other bits are ignored. > + * So set it to RAM_SHARED to require a shared mapping ... > + * Return: > + * On success, return a pointer to the mapped area. > + * On failure, return MAP_FAILED. > + */ > +void *qemu_ram_mmap(int fd, size_t size, size_t align, uint32_t flags); > > void qemu_ram_munmap(void *ptr, size_t size); > > diff --git a/util/mmap-alloc.c b/util/mmap-alloc.c > index fd329ec..8f0a740 100644 > --- a/util/mmap-alloc.c > +++ b/util/mmap-alloc.c > @@ -13,6 +13,7 @@ > #include "qemu/osdep.h" > #include "qemu/mmap-alloc.h" > #include "qemu/host-utils.h" > +#include "exec/memory.h" > > #define HUGETLBFS_MAGIC 0x958458f6 > > @@ -75,7 +76,7 @@ size_t qemu_mempath_getpagesize(const char *mem_path) > return getpagesize(); > } > > -void *qemu_ram_mmap(int fd, size_t size, size_t align, bool shared) > +void *qemu_ram_mmap(int fd, size_t size, size_t align, uint32_t flags) > { > /* > * Note: this always allocates at least one extra page of virtual address > @@ -92,11 +93,12 @@ void *qemu_ram_mmap(int fd, size_t size, size_t align, bool shared) > * anonymous memory is OK. > */ > int anonfd = fd == -1 || qemu_fd_getpagesize(fd) == getpagesize() ? -1 : fd; > - int flags = anonfd == -1 ? MAP_ANONYMOUS : MAP_NORESERVE; > - void *ptr = mmap(0, total, PROT_NONE, flags | MAP_PRIVATE, anonfd, 0); > + int mmap_flags = anonfd == -1 ? MAP_ANONYMOUS : MAP_NORESERVE; > + void *ptr = mmap(0, total, PROT_NONE, mmap_flags | MAP_PRIVATE, anonfd, 0); > #else > void *ptr = mmap(0, total, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); > #endif > + bool shared = flags & RAM_SHARED; > size_t offset; > void *ptr1; > > diff --git a/util/oslib-posix.c b/util/oslib-posix.c > index fbd0dc8..121c31f 100644 > --- a/util/oslib-posix.c > +++ b/util/oslib-posix.c > @@ -203,7 +203,13 @@ void *qemu_memalign(size_t alignment, size_t size) > void *qemu_anon_ram_alloc(size_t size, uint64_t *alignment, bool shared) > { > size_t align = QEMU_VMALLOC_ALIGN; > - void *ptr = qemu_ram_mmap(-1, size, align, shared); > + uint32_t flags = 0; > + void *ptr; > + > + if (shared) { > + flags = MAP_SHARED; > + } And here we set it to MAP_SHARED instead. Not good - was this even tested? > + ptr = qemu_ram_mmap(-1, size, align, flags); > > if (ptr == MAP_FAILED) { > return NULL; > -- > 2.7.4 Suggestion: #ifdef __CHECKER__ #define QEMU_BITWISE __attribute__((bitwise)) #define QEMU_FORCE __attribute__((force)) #else #define QEMU_BITWISE #define QEMU_FORCE #endif typedef unsigned QEMU_BITWISE QemuMmapFlags; #define RAM_SHARED ((QEMU_FORCE QemuMmapFlags) (1 << 1)) And then run checker to detect misuse.
diff --git a/exec.c b/exec.c index bb6170d..e92a7da 100644 --- a/exec.c +++ b/exec.c @@ -1810,6 +1810,7 @@ static void *file_ram_alloc(RAMBlock *block, ram_addr_t memory, int fd, bool truncate, + uint32_t flags, Error **errp) { void *area; @@ -1859,8 +1860,7 @@ static void *file_ram_alloc(RAMBlock *block, perror("ftruncate"); } - area = qemu_ram_mmap(fd, memory, block->mr->align, - block->flags & RAM_SHARED); + area = qemu_ram_mmap(fd, memory, block->mr->align, flags); if (area == MAP_FAILED) { error_setg_errno(errp, errno, "unable to map backing store for guest RAM"); @@ -2279,7 +2279,8 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr, new_block->used_length = size; new_block->max_length = size; new_block->flags = ram_flags; - new_block->host = file_ram_alloc(new_block, size, fd, !file_size, errp); + new_block->host = file_ram_alloc(new_block, size, fd, !file_size, + ram_flags, errp); if (!new_block->host) { g_free(new_block); return NULL; diff --git a/include/qemu/mmap-alloc.h b/include/qemu/mmap-alloc.h index 50385e3..6fe6ed4 100644 --- a/include/qemu/mmap-alloc.h +++ b/include/qemu/mmap-alloc.h @@ -7,7 +7,24 @@ size_t qemu_fd_getpagesize(int fd); size_t qemu_mempath_getpagesize(const char *mem_path); -void *qemu_ram_mmap(int fd, size_t size, size_t align, bool shared); +/** + * qemu_ram_mmap: mmap the specified file or device. + * + * Parameters: + * @fd: the file or the device to mmap + * @size: the number of bytes to be mmaped + * @align: if not zero, specify the alignment of the starting mapping address; + * otherwise, the alignment in use will be determined by QEMU. + * @flags: specifies additional properties of the mapping, which can be one or + * bit-or of following values + * - RAM_SHARED: mmap with MAP_SHARED flag + * Other bits are ignored. + * + * Return: + * On success, return a pointer to the mapped area. + * On failure, return MAP_FAILED. + */ +void *qemu_ram_mmap(int fd, size_t size, size_t align, uint32_t flags); void qemu_ram_munmap(void *ptr, size_t size); diff --git a/util/mmap-alloc.c b/util/mmap-alloc.c index fd329ec..8f0a740 100644 --- a/util/mmap-alloc.c +++ b/util/mmap-alloc.c @@ -13,6 +13,7 @@ #include "qemu/osdep.h" #include "qemu/mmap-alloc.h" #include "qemu/host-utils.h" +#include "exec/memory.h" #define HUGETLBFS_MAGIC 0x958458f6 @@ -75,7 +76,7 @@ size_t qemu_mempath_getpagesize(const char *mem_path) return getpagesize(); } -void *qemu_ram_mmap(int fd, size_t size, size_t align, bool shared) +void *qemu_ram_mmap(int fd, size_t size, size_t align, uint32_t flags) { /* * Note: this always allocates at least one extra page of virtual address @@ -92,11 +93,12 @@ void *qemu_ram_mmap(int fd, size_t size, size_t align, bool shared) * anonymous memory is OK. */ int anonfd = fd == -1 || qemu_fd_getpagesize(fd) == getpagesize() ? -1 : fd; - int flags = anonfd == -1 ? MAP_ANONYMOUS : MAP_NORESERVE; - void *ptr = mmap(0, total, PROT_NONE, flags | MAP_PRIVATE, anonfd, 0); + int mmap_flags = anonfd == -1 ? MAP_ANONYMOUS : MAP_NORESERVE; + void *ptr = mmap(0, total, PROT_NONE, mmap_flags | MAP_PRIVATE, anonfd, 0); #else void *ptr = mmap(0, total, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); #endif + bool shared = flags & RAM_SHARED; size_t offset; void *ptr1; diff --git a/util/oslib-posix.c b/util/oslib-posix.c index fbd0dc8..121c31f 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -203,7 +203,13 @@ void *qemu_memalign(size_t alignment, size_t size) void *qemu_anon_ram_alloc(size_t size, uint64_t *alignment, bool shared) { size_t align = QEMU_VMALLOC_ALIGN; - void *ptr = qemu_ram_mmap(-1, size, align, shared); + uint32_t flags = 0; + void *ptr; + + if (shared) { + flags = MAP_SHARED; + } + ptr = qemu_ram_mmap(-1, size, align, flags); if (ptr == MAP_FAILED) { return NULL;