Skip to content

Commit 44a4ff3

Browse files
jraman567stefanhaRH
authored andcommitted
memory: alloc RAM from file at offset
Allow RAM MemoryRegion to be created from an offset in a file, instead of allocating at offset of 0 by default. This is needed to synchronize RAM between QEMU & remote process. Signed-off-by: Jagannathan Raman <[email protected]> Signed-off-by: John G Johnson <[email protected]> Signed-off-by: Elena Ufimtseva <[email protected]> Reviewed-by: Stefan Hajnoczi <[email protected]> Message-id: 609996697ad8617e3b01df38accc5c208c24d74e.1611938319.git.jag.raman@oracle.com Signed-off-by: Stefan Hajnoczi <[email protected]>
1 parent 639090d commit 44a4ff3

File tree

9 files changed

+25
-15
lines changed

9 files changed

+25
-15
lines changed

backends/hostmem-memfd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ memfd_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
5555
name = host_memory_backend_get_name(backend);
5656
memory_region_init_ram_from_fd(&backend->mr, OBJECT(backend),
5757
name, backend->size,
58-
backend->share, fd, errp);
58+
backend->share, fd, 0, errp);
5959
g_free(name);
6060
}
6161

hw/misc/ivshmem.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,8 @@ static void process_msg_shmem(IVShmemState *s, int fd, Error **errp)
495495

496496
/* mmap the region and map into the BAR2 */
497497
memory_region_init_ram_from_fd(&s->server_bar2, OBJECT(s),
498-
"ivshmem.bar2", size, true, fd, &local_err);
498+
"ivshmem.bar2", size, true, fd, 0,
499+
&local_err);
499500
if (local_err) {
500501
error_propagate(errp, local_err);
501502
return;

include/exec/memory.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -998,6 +998,7 @@ void memory_region_init_ram_from_file(MemoryRegion *mr,
998998
* @size: size of the region.
999999
* @share: %true if memory must be mmaped with the MAP_SHARED flag
10001000
* @fd: the fd to mmap.
1001+
* @offset: offset within the file referenced by fd
10011002
* @errp: pointer to Error*, to store an error if it happens.
10021003
*
10031004
* Note that this function does not do anything to cause the data in the
@@ -1009,6 +1010,7 @@ void memory_region_init_ram_from_fd(MemoryRegion *mr,
10091010
uint64_t size,
10101011
bool share,
10111012
int fd,
1013+
ram_addr_t offset,
10121014
Error **errp);
10131015
#endif
10141016

include/exec/ram_addr.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ RAMBlock *qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
121121
uint32_t ram_flags, const char *mem_path,
122122
bool readonly, Error **errp);
123123
RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
124-
uint32_t ram_flags, int fd, bool readonly,
125-
Error **errp);
124+
uint32_t ram_flags, int fd, off_t offset,
125+
bool readonly, Error **errp);
126126

127127
RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
128128
MemoryRegion *mr, Error **errp);

include/qemu/mmap-alloc.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ size_t qemu_mempath_getpagesize(const char *mem_path);
1717
* @readonly: true for a read-only mapping, false for read/write.
1818
* @shared: map has RAM_SHARED flag.
1919
* @is_pmem: map has RAM_PMEM flag.
20+
* @map_offset: map starts at offset of map_offset from the start of fd
2021
*
2122
* Return:
2223
* On success, return a pointer to the mapped area.
@@ -27,7 +28,8 @@ void *qemu_ram_mmap(int fd,
2728
size_t align,
2829
bool readonly,
2930
bool shared,
30-
bool is_pmem);
31+
bool is_pmem,
32+
off_t map_offset);
3133

3234
void qemu_ram_munmap(int fd, void *ptr, size_t size);
3335

softmmu/memory.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1612,6 +1612,7 @@ void memory_region_init_ram_from_fd(MemoryRegion *mr,
16121612
uint64_t size,
16131613
bool share,
16141614
int fd,
1615+
ram_addr_t offset,
16151616
Error **errp)
16161617
{
16171618
Error *err = NULL;
@@ -1621,7 +1622,7 @@ void memory_region_init_ram_from_fd(MemoryRegion *mr,
16211622
mr->destructor = memory_region_destructor_ram;
16221623
mr->ram_block = qemu_ram_alloc_from_fd(size, mr,
16231624
share ? RAM_SHARED : 0,
1624-
fd, false, &err);
1625+
fd, offset, false, &err);
16251626
if (err) {
16261627
mr->size = int128_zero();
16271628
object_unparent(OBJECT(mr));

softmmu/physmem.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1543,6 +1543,7 @@ static void *file_ram_alloc(RAMBlock *block,
15431543
int fd,
15441544
bool readonly,
15451545
bool truncate,
1546+
off_t offset,
15461547
Error **errp)
15471548
{
15481549
void *area;
@@ -1593,7 +1594,8 @@ static void *file_ram_alloc(RAMBlock *block,
15931594
}
15941595

15951596
area = qemu_ram_mmap(fd, memory, block->mr->align, readonly,
1596-
block->flags & RAM_SHARED, block->flags & RAM_PMEM);
1597+
block->flags & RAM_SHARED, block->flags & RAM_PMEM,
1598+
offset);
15971599
if (area == MAP_FAILED) {
15981600
error_setg_errno(errp, errno,
15991601
"unable to map backing store for guest RAM");
@@ -2024,8 +2026,8 @@ static void ram_block_add(RAMBlock *new_block, Error **errp, bool shared)
20242026

20252027
#ifdef CONFIG_POSIX
20262028
RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
2027-
uint32_t ram_flags, int fd, bool readonly,
2028-
Error **errp)
2029+
uint32_t ram_flags, int fd, off_t offset,
2030+
bool readonly, Error **errp)
20292031
{
20302032
RAMBlock *new_block;
20312033
Error *local_err = NULL;
@@ -2079,7 +2081,7 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
20792081
new_block->max_length = size;
20802082
new_block->flags = ram_flags;
20812083
new_block->host = file_ram_alloc(new_block, size, fd, readonly,
2082-
!file_size, errp);
2084+
!file_size, offset, errp);
20832085
if (!new_block->host) {
20842086
g_free(new_block);
20852087
return NULL;
@@ -2110,7 +2112,7 @@ RAMBlock *qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
21102112
return NULL;
21112113
}
21122114

2113-
block = qemu_ram_alloc_from_fd(size, mr, ram_flags, fd, readonly, errp);
2115+
block = qemu_ram_alloc_from_fd(size, mr, ram_flags, fd, 0, readonly, errp);
21142116
if (!block) {
21152117
if (created) {
21162118
unlink(mem_path);

util/mmap-alloc.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ void *qemu_ram_mmap(int fd,
8787
size_t align,
8888
bool readonly,
8989
bool shared,
90-
bool is_pmem)
90+
bool is_pmem,
91+
off_t map_offset)
9192
{
9293
int prot;
9394
int flags;
@@ -150,7 +151,8 @@ void *qemu_ram_mmap(int fd,
150151

151152
prot = PROT_READ | (readonly ? 0 : PROT_WRITE);
152153

153-
ptr = mmap(guardptr + offset, size, prot, flags | map_sync_flags, fd, 0);
154+
ptr = mmap(guardptr + offset, size, prot,
155+
flags | map_sync_flags, fd, map_offset);
154156

155157
if (ptr == MAP_FAILED && map_sync_flags) {
156158
if (errno == ENOTSUP) {
@@ -174,7 +176,7 @@ void *qemu_ram_mmap(int fd,
174176
* if map failed with MAP_SHARED_VALIDATE | MAP_SYNC,
175177
* we will remove these flags to handle compatibility.
176178
*/
177-
ptr = mmap(guardptr + offset, size, prot, flags, fd, 0);
179+
ptr = mmap(guardptr + offset, size, prot, flags, fd, map_offset);
178180
}
179181

180182
if (ptr == MAP_FAILED) {

util/oslib-posix.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ void *qemu_memalign(size_t alignment, size_t size)
230230
void *qemu_anon_ram_alloc(size_t size, uint64_t *alignment, bool shared)
231231
{
232232
size_t align = QEMU_VMALLOC_ALIGN;
233-
void *ptr = qemu_ram_mmap(-1, size, align, false, shared, false);
233+
void *ptr = qemu_ram_mmap(-1, size, align, false, shared, false, 0);
234234

235235
if (ptr == MAP_FAILED) {
236236
return NULL;

0 commit comments

Comments
 (0)