Message ID | 8d5b28ca0350dfb6a0313f06c6ceb0f15201c8d7.1548771590.git.yi.z.zhang@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | support MAP_SYNC for memory-backend-file | expand |
> > From: Zhang Yi <yi.z.zhang@linux.intel.com> > > besides the existing 'shared' flags, we are going to add > 'is_pmem' to qemu_ram_mmap(), which indicated the memory backend > file is a persist memory. > > Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com> > Signed-off-by: Zhang Yi <yi.z.zhang@linux.intel.com> > --- > exec.c | 2 +- > include/qemu/mmap-alloc.h | 21 ++++++++++++++++++++- > util/mmap-alloc.c | 6 +++++- > util/oslib-posix.c | 2 +- > 4 files changed, 27 insertions(+), 4 deletions(-) > > diff --git a/exec.c b/exec.c > index bb6170d..27cea52 100644 > --- a/exec.c > +++ b/exec.c > @@ -1860,7 +1860,7 @@ static void *file_ram_alloc(RAMBlock *block, > } > > area = qemu_ram_mmap(fd, memory, block->mr->align, > - block->flags & RAM_SHARED); > + block->flags & RAM_SHARED, block->flags & > RAM_PMEM); > if (area == MAP_FAILED) { > error_setg_errno(errp, errno, > "unable to map backing store for guest RAM"); > diff --git a/include/qemu/mmap-alloc.h b/include/qemu/mmap-alloc.h > index 50385e3..190688a 100644 > --- a/include/qemu/mmap-alloc.h > +++ b/include/qemu/mmap-alloc.h > @@ -7,7 +7,26 @@ 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. > + * @shared: map has RAM_SHARED flag. > + * @is_pmem: map has RAM_PMEM flag. > + * > + * 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, > + bool shared, > + bool is_pmem); > > void qemu_ram_munmap(void *ptr, size_t size); > > diff --git a/util/mmap-alloc.c b/util/mmap-alloc.c > index fd329ec..97bbeed 100644 > --- a/util/mmap-alloc.c > +++ b/util/mmap-alloc.c > @@ -75,7 +75,11 @@ 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, > + bool shared, > + bool is_pmem) > { > /* > * Note: this always allocates at least one extra page of virtual > address > diff --git a/util/oslib-posix.c b/util/oslib-posix.c > index fbd0dc8..040937f 100644 > --- a/util/oslib-posix.c > +++ b/util/oslib-posix.c > @@ -203,7 +203,7 @@ 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); > + void *ptr = qemu_ram_mmap(-1, size, align, shared, false); > > if (ptr == MAP_FAILED) { > return NULL; > -- > 2.7.4 Looks good to me. Reviewed-by: pagupta@redhat.com > > >
diff --git a/exec.c b/exec.c index bb6170d..27cea52 100644 --- a/exec.c +++ b/exec.c @@ -1860,7 +1860,7 @@ static void *file_ram_alloc(RAMBlock *block, } area = qemu_ram_mmap(fd, memory, block->mr->align, - block->flags & RAM_SHARED); + block->flags & RAM_SHARED, block->flags & RAM_PMEM); if (area == MAP_FAILED) { error_setg_errno(errp, errno, "unable to map backing store for guest RAM"); diff --git a/include/qemu/mmap-alloc.h b/include/qemu/mmap-alloc.h index 50385e3..190688a 100644 --- a/include/qemu/mmap-alloc.h +++ b/include/qemu/mmap-alloc.h @@ -7,7 +7,26 @@ 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. + * @shared: map has RAM_SHARED flag. + * @is_pmem: map has RAM_PMEM flag. + * + * 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, + bool shared, + bool is_pmem); void qemu_ram_munmap(void *ptr, size_t size); diff --git a/util/mmap-alloc.c b/util/mmap-alloc.c index fd329ec..97bbeed 100644 --- a/util/mmap-alloc.c +++ b/util/mmap-alloc.c @@ -75,7 +75,11 @@ 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, + bool shared, + bool is_pmem) { /* * Note: this always allocates at least one extra page of virtual address diff --git a/util/oslib-posix.c b/util/oslib-posix.c index fbd0dc8..040937f 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -203,7 +203,7 @@ 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); + void *ptr = qemu_ram_mmap(-1, size, align, shared, false); if (ptr == MAP_FAILED) { return NULL;