Skip to content

Commit 06329cc

Browse files
committed
mem: add share parameter to memory-backend-ram
Currently only file backed memory backend can be created with a "share" flag in order to allow sharing guest RAM with other processes in the host. Add the "share" flag also to RAM Memory Backend in order to allow remapping parts of the guest RAM to different host virtual addresses. This is needed by the RDMA devices in order to remap non-contiguous QEMU virtual addresses to a contiguous virtual address range. Moved the "share" flag to the Host Memory base class, modified phys_mem_alloc to include the new parameter and a new interface memory_region_init_ram_shared_nomigrate. There are no functional changes if the new flag is not used. Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Marcel Apfelbaum <marcel@redhat.com>
1 parent e5ecc28 commit 06329cc

File tree

14 files changed

+94
-50
lines changed

14 files changed

+94
-50
lines changed

backends/hostmem-file.c

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ typedef struct HostMemoryBackendFile HostMemoryBackendFile;
3131
struct HostMemoryBackendFile {
3232
HostMemoryBackend parent_obj;
3333

34-
bool share;
3534
bool discard_data;
3635
char *mem_path;
3736
uint64_t align;
@@ -59,7 +58,7 @@ file_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
5958
path = object_get_canonical_path(OBJECT(backend));
6059
memory_region_init_ram_from_file(&backend->mr, OBJECT(backend),
6160
path,
62-
backend->size, fb->align, fb->share,
61+
backend->size, fb->align, backend->share,
6362
fb->mem_path, errp);
6463
g_free(path);
6564
}
@@ -86,25 +85,6 @@ static void set_mem_path(Object *o, const char *str, Error **errp)
8685
fb->mem_path = g_strdup(str);
8786
}
8887

89-
static bool file_memory_backend_get_share(Object *o, Error **errp)
90-
{
91-
HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o);
92-
93-
return fb->share;
94-
}
95-
96-
static void file_memory_backend_set_share(Object *o, bool value, Error **errp)
97-
{
98-
HostMemoryBackend *backend = MEMORY_BACKEND(o);
99-
HostMemoryBackendFile *fb = MEMORY_BACKEND_FILE(o);
100-
101-
if (host_memory_backend_mr_inited(backend)) {
102-
error_setg(errp, "cannot change property value");
103-
return;
104-
}
105-
fb->share = value;
106-
}
107-
10888
static bool file_memory_backend_get_discard_data(Object *o, Error **errp)
10989
{
11090
return MEMORY_BACKEND_FILE(o)->discard_data;
@@ -171,9 +151,6 @@ file_backend_class_init(ObjectClass *oc, void *data)
171151
bc->alloc = file_backend_memory_alloc;
172152
oc->unparent = file_backend_unparent;
173153

174-
object_class_property_add_bool(oc, "share",
175-
file_memory_backend_get_share, file_memory_backend_set_share,
176-
&error_abort);
177154
object_class_property_add_bool(oc, "discard-data",
178155
file_memory_backend_get_discard_data, file_memory_backend_set_discard_data,
179156
&error_abort);

backends/hostmem-ram.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp)
2828
}
2929

3030
path = object_get_canonical_path_component(OBJECT(backend));
31-
memory_region_init_ram_nomigrate(&backend->mr, OBJECT(backend), path,
32-
backend->size, errp);
31+
memory_region_init_ram_shared_nomigrate(&backend->mr, OBJECT(backend), path,
32+
backend->size, backend->share, errp);
3333
g_free(path);
3434
}
3535

backends/hostmem.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,24 @@ static void set_id(Object *o, const char *str, Error **errp)
368368
backend->id = g_strdup(str);
369369
}
370370

371+
static bool host_memory_backend_get_share(Object *o, Error **errp)
372+
{
373+
HostMemoryBackend *backend = MEMORY_BACKEND(o);
374+
375+
return backend->share;
376+
}
377+
378+
static void host_memory_backend_set_share(Object *o, bool value, Error **errp)
379+
{
380+
HostMemoryBackend *backend = MEMORY_BACKEND(o);
381+
382+
if (host_memory_backend_mr_inited(backend)) {
383+
error_setg(errp, "cannot change property value");
384+
return;
385+
}
386+
backend->share = value;
387+
}
388+
371389
static void
372390
host_memory_backend_class_init(ObjectClass *oc, void *data)
373391
{
@@ -398,6 +416,9 @@ host_memory_backend_class_init(ObjectClass *oc, void *data)
398416
host_memory_backend_get_policy,
399417
host_memory_backend_set_policy, &error_abort);
400418
object_class_property_add_str(oc, "id", get_id, set_id, &error_abort);
419+
object_class_property_add_bool(oc, "share",
420+
host_memory_backend_get_share, host_memory_backend_set_share,
421+
&error_abort);
401422
}
402423

403424
static void host_memory_backend_finalize(Object *o)

exec.c

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1285,15 +1285,15 @@ static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end,
12851285
uint16_t section);
12861286
static subpage_t *subpage_init(FlatView *fv, hwaddr base);
12871287

1288-
static void *(*phys_mem_alloc)(size_t size, uint64_t *align) =
1288+
static void *(*phys_mem_alloc)(size_t size, uint64_t *align, bool shared) =
12891289
qemu_anon_ram_alloc;
12901290

12911291
/*
12921292
* Set a custom physical guest memory alloator.
12931293
* Accelerators with unusual needs may need this. Hopefully, we can
12941294
* get rid of it eventually.
12951295
*/
1296-
void phys_mem_set_alloc(void *(*alloc)(size_t, uint64_t *align))
1296+
void phys_mem_set_alloc(void *(*alloc)(size_t, uint64_t *align, bool shared))
12971297
{
12981298
phys_mem_alloc = alloc;
12991299
}
@@ -1921,7 +1921,7 @@ static void dirty_memory_extend(ram_addr_t old_ram_size,
19211921
}
19221922
}
19231923

1924-
static void ram_block_add(RAMBlock *new_block, Error **errp)
1924+
static void ram_block_add(RAMBlock *new_block, Error **errp, bool shared)
19251925
{
19261926
RAMBlock *block;
19271927
RAMBlock *last_block = NULL;
@@ -1944,7 +1944,7 @@ static void ram_block_add(RAMBlock *new_block, Error **errp)
19441944
}
19451945
} else {
19461946
new_block->host = phys_mem_alloc(new_block->max_length,
1947-
&new_block->mr->align);
1947+
&new_block->mr->align, shared);
19481948
if (!new_block->host) {
19491949
error_setg_errno(errp, errno,
19501950
"cannot set up guest memory '%s'",
@@ -2049,7 +2049,7 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
20492049
return NULL;
20502050
}
20512051

2052-
ram_block_add(new_block, &local_err);
2052+
ram_block_add(new_block, &local_err, share);
20532053
if (local_err) {
20542054
g_free(new_block);
20552055
error_propagate(errp, local_err);
@@ -2091,7 +2091,7 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,
20912091
void (*resized)(const char*,
20922092
uint64_t length,
20932093
void *host),
2094-
void *host, bool resizeable,
2094+
void *host, bool resizeable, bool share,
20952095
MemoryRegion *mr, Error **errp)
20962096
{
20972097
RAMBlock *new_block;
@@ -2114,7 +2114,7 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,
21142114
if (resizeable) {
21152115
new_block->flags |= RAM_RESIZEABLE;
21162116
}
2117-
ram_block_add(new_block, &local_err);
2117+
ram_block_add(new_block, &local_err, share);
21182118
if (local_err) {
21192119
g_free(new_block);
21202120
error_propagate(errp, local_err);
@@ -2126,12 +2126,15 @@ RAMBlock *qemu_ram_alloc_internal(ram_addr_t size, ram_addr_t max_size,
21262126
RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
21272127
MemoryRegion *mr, Error **errp)
21282128
{
2129-
return qemu_ram_alloc_internal(size, size, NULL, host, false, mr, errp);
2129+
return qemu_ram_alloc_internal(size, size, NULL, host, false,
2130+
false, mr, errp);
21302131
}
21312132

2132-
RAMBlock *qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp)
2133+
RAMBlock *qemu_ram_alloc(ram_addr_t size, bool share,
2134+
MemoryRegion *mr, Error **errp)
21332135
{
2134-
return qemu_ram_alloc_internal(size, size, NULL, NULL, false, mr, errp);
2136+
return qemu_ram_alloc_internal(size, size, NULL, NULL, false,
2137+
share, mr, errp);
21352138
}
21362139

21372140
RAMBlock *qemu_ram_alloc_resizeable(ram_addr_t size, ram_addr_t maxsz,
@@ -2140,7 +2143,8 @@ RAMBlock *qemu_ram_alloc_resizeable(ram_addr_t size, ram_addr_t maxsz,
21402143
void *host),
21412144
MemoryRegion *mr, Error **errp)
21422145
{
2143-
return qemu_ram_alloc_internal(size, maxsz, resized, NULL, true, mr, errp);
2146+
return qemu_ram_alloc_internal(size, maxsz, resized, NULL, true,
2147+
false, mr, errp);
21442148
}
21452149

21462150
static void reclaim_ramblock(RAMBlock *block)

include/exec/memory.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,29 @@ void memory_region_init_ram_nomigrate(MemoryRegion *mr,
435435
uint64_t size,
436436
Error **errp);
437437

438+
/**
439+
* memory_region_init_ram_shared_nomigrate: Initialize RAM memory region.
440+
* Accesses into the region will
441+
* modify memory directly.
442+
*
443+
* @mr: the #MemoryRegion to be initialized.
444+
* @owner: the object that tracks the region's reference count
445+
* @name: Region name, becomes part of RAMBlock name used in migration stream
446+
* must be unique within any device
447+
* @size: size of the region.
448+
* @share: allow remapping RAM to different addresses
449+
* @errp: pointer to Error*, to store an error if it happens.
450+
*
451+
* Note that this function is similar to memory_region_init_ram_nomigrate.
452+
* The only difference is part of the RAM region can be remapped.
453+
*/
454+
void memory_region_init_ram_shared_nomigrate(MemoryRegion *mr,
455+
struct Object *owner,
456+
const char *name,
457+
uint64_t size,
458+
bool share,
459+
Error **errp);
460+
438461
/**
439462
* memory_region_init_resizeable_ram: Initialize memory region with resizeable
440463
* RAM. Accesses into the region will

include/exec/ram_addr.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ RAMBlock *qemu_ram_alloc_from_fd(ram_addr_t size, MemoryRegion *mr,
8080
Error **errp);
8181
RAMBlock *qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
8282
MemoryRegion *mr, Error **errp);
83-
RAMBlock *qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp);
83+
RAMBlock *qemu_ram_alloc(ram_addr_t size, bool share, MemoryRegion *mr,
84+
Error **errp);
8485
RAMBlock *qemu_ram_alloc_resizeable(ram_addr_t size, ram_addr_t max_size,
8586
void (*resized)(const char*,
8687
uint64_t length,

include/qemu/osdep.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ extern int daemon(int, int);
255255
int qemu_daemon(int nochdir, int noclose);
256256
void *qemu_try_memalign(size_t alignment, size_t size);
257257
void *qemu_memalign(size_t alignment, size_t size);
258-
void *qemu_anon_ram_alloc(size_t size, uint64_t *align);
258+
void *qemu_anon_ram_alloc(size_t size, uint64_t *align, bool shared);
259259
void qemu_vfree(void *ptr);
260260
void qemu_anon_ram_free(void *ptr, size_t size);
261261

include/sysemu/hostmem.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ struct HostMemoryBackend {
5454
char *id;
5555
uint64_t size;
5656
bool merge, dump;
57-
bool prealloc, force_prealloc, is_mapped;
57+
bool prealloc, force_prealloc, is_mapped, share;
5858
DECLARE_BITMAP(host_nodes, MAX_NODES + 1);
5959
HostMemPolicy policy;
6060

include/sysemu/kvm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ int kvm_on_sigbus(int code, void *addr);
248248

249249
/* interface with exec.c */
250250

251-
void phys_mem_set_alloc(void *(*alloc)(size_t, uint64_t *align));
251+
void phys_mem_set_alloc(void *(*alloc)(size_t, uint64_t *align, bool shared));
252252

253253
/* internal API */
254254

memory.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,12 +1538,22 @@ void memory_region_init_ram_nomigrate(MemoryRegion *mr,
15381538
const char *name,
15391539
uint64_t size,
15401540
Error **errp)
1541+
{
1542+
memory_region_init_ram_shared_nomigrate(mr, owner, name, size, false, errp);
1543+
}
1544+
1545+
void memory_region_init_ram_shared_nomigrate(MemoryRegion *mr,
1546+
Object *owner,
1547+
const char *name,
1548+
uint64_t size,
1549+
bool share,
1550+
Error **errp)
15411551
{
15421552
memory_region_init(mr, owner, name, size);
15431553
mr->ram = true;
15441554
mr->terminates = true;
15451555
mr->destructor = memory_region_destructor_ram;
1546-
mr->ram_block = qemu_ram_alloc(size, mr, errp);
1556+
mr->ram_block = qemu_ram_alloc(size, share, mr, errp);
15471557
mr->dirty_log_mask = tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0;
15481558
}
15491559

@@ -1654,7 +1664,7 @@ void memory_region_init_rom_nomigrate(MemoryRegion *mr,
16541664
mr->readonly = true;
16551665
mr->terminates = true;
16561666
mr->destructor = memory_region_destructor_ram;
1657-
mr->ram_block = qemu_ram_alloc(size, mr, errp);
1667+
mr->ram_block = qemu_ram_alloc(size, false, mr, errp);
16581668
mr->dirty_log_mask = tcg_enabled() ? (1 << DIRTY_MEMORY_CODE) : 0;
16591669
}
16601670

@@ -1673,7 +1683,7 @@ void memory_region_init_rom_device_nomigrate(MemoryRegion *mr,
16731683
mr->terminates = true;
16741684
mr->rom_device = true;
16751685
mr->destructor = memory_region_destructor_ram;
1676-
mr->ram_block = qemu_ram_alloc(size, mr, errp);
1686+
mr->ram_block = qemu_ram_alloc(size, false, mr, errp);
16771687
}
16781688

16791689
void memory_region_init_iommu(void *_iommu_mr,

0 commit comments

Comments
 (0)