multi-process: setup memory manager for remote device
SyncSysMemMsg message format is defined. It is used to send file descriptors of the RAM regions to remote device. RAM on the remote device is configured with a set of file descriptors. Old RAM regions are deleted and new regions, each with an fd, is added to the RAM. Signed-off-by: Jagannathan Raman <jag.raman@oracle.com> Signed-off-by: John G Johnson <john.g.johnson@oracle.com> Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 7d2d1831d812e85f681e7a8ab99e032cf4704689.1611938319.git.jag.raman@oracle.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
c7d80c7c1d
commit
ed5d001916
@ -3215,6 +3215,8 @@ F: hw/remote/mpqemu-link.c
|
||||
F: include/hw/remote/mpqemu-link.h
|
||||
F: hw/remote/message.c
|
||||
F: hw/remote/remote-obj.c
|
||||
F: include/hw/remote/memory.h
|
||||
F: hw/remote/memory.c
|
||||
|
||||
Build and test automation
|
||||
-------------------------
|
||||
|
65
hw/remote/memory.c
Normal file
65
hw/remote/memory.c
Normal file
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Memory manager for remote device
|
||||
*
|
||||
* Copyright © 2018, 2021 Oracle and/or its affiliates.
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu-common.h"
|
||||
|
||||
#include "hw/remote/memory.h"
|
||||
#include "exec/address-spaces.h"
|
||||
#include "exec/ram_addr.h"
|
||||
#include "qapi/error.h"
|
||||
|
||||
static void remote_sysmem_reset(void)
|
||||
{
|
||||
MemoryRegion *sysmem, *subregion, *next;
|
||||
|
||||
sysmem = get_system_memory();
|
||||
|
||||
QTAILQ_FOREACH_SAFE(subregion, &sysmem->subregions, subregions_link, next) {
|
||||
if (subregion->ram) {
|
||||
memory_region_del_subregion(sysmem, subregion);
|
||||
object_unparent(OBJECT(subregion));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void remote_sysmem_reconfig(MPQemuMsg *msg, Error **errp)
|
||||
{
|
||||
ERRP_GUARD();
|
||||
SyncSysmemMsg *sysmem_info = &msg->data.sync_sysmem;
|
||||
MemoryRegion *sysmem, *subregion;
|
||||
static unsigned int suffix;
|
||||
int region;
|
||||
|
||||
sysmem = get_system_memory();
|
||||
|
||||
remote_sysmem_reset();
|
||||
|
||||
for (region = 0; region < msg->num_fds; region++) {
|
||||
g_autofree char *name;
|
||||
subregion = g_new(MemoryRegion, 1);
|
||||
name = g_strdup_printf("remote-mem-%u", suffix++);
|
||||
memory_region_init_ram_from_fd(subregion, NULL,
|
||||
name, sysmem_info->sizes[region],
|
||||
true, msg->fds[region],
|
||||
sysmem_info->offsets[region],
|
||||
errp);
|
||||
|
||||
if (*errp) {
|
||||
g_free(subregion);
|
||||
remote_sysmem_reset();
|
||||
return;
|
||||
}
|
||||
|
||||
memory_region_add_subregion(sysmem, sysmem_info->gpas[region],
|
||||
subregion);
|
||||
|
||||
}
|
||||
}
|
@ -5,4 +5,6 @@ remote_ss.add(when: 'CONFIG_MULTIPROCESS', if_true: files('mpqemu-link.c'))
|
||||
remote_ss.add(when: 'CONFIG_MULTIPROCESS', if_true: files('message.c'))
|
||||
remote_ss.add(when: 'CONFIG_MULTIPROCESS', if_true: files('remote-obj.c'))
|
||||
|
||||
specific_ss.add(when: 'CONFIG_MULTIPROCESS', if_true: files('memory.c'))
|
||||
|
||||
softmmu_ss.add_all(when: 'CONFIG_MULTIPROCESS', if_true: remote_ss)
|
||||
|
@ -201,5 +201,16 @@ bool mpqemu_msg_valid(MPQemuMsg *msg)
|
||||
}
|
||||
}
|
||||
|
||||
/* Verify message specific fields. */
|
||||
switch (msg->cmd) {
|
||||
case MPQEMU_CMD_SYNC_SYSMEM:
|
||||
if (msg->num_fds == 0 || msg->size != sizeof(SyncSysmemMsg)) {
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
19
include/hw/remote/memory.h
Normal file
19
include/hw/remote/memory.h
Normal file
@ -0,0 +1,19 @@
|
||||
/*
|
||||
* Memory manager for remote device
|
||||
*
|
||||
* Copyright © 2018, 2021 Oracle and/or its affiliates.
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef REMOTE_MEMORY_H
|
||||
#define REMOTE_MEMORY_H
|
||||
|
||||
#include "exec/hwaddr.h"
|
||||
#include "hw/remote/mpqemu-link.h"
|
||||
|
||||
void remote_sysmem_reconfig(MPQemuMsg *msg, Error **errp);
|
||||
|
||||
#endif
|
@ -14,6 +14,7 @@
|
||||
#include "qom/object.h"
|
||||
#include "qemu/thread.h"
|
||||
#include "io/channel.h"
|
||||
#include "exec/hwaddr.h"
|
||||
|
||||
#define REMOTE_MAX_FDS 8
|
||||
|
||||
@ -30,9 +31,16 @@
|
||||
*
|
||||
*/
|
||||
typedef enum {
|
||||
MPQEMU_CMD_SYNC_SYSMEM,
|
||||
MPQEMU_CMD_MAX,
|
||||
} MPQemuCmd;
|
||||
|
||||
typedef struct {
|
||||
hwaddr gpas[REMOTE_MAX_FDS];
|
||||
uint64_t sizes[REMOTE_MAX_FDS];
|
||||
off_t offsets[REMOTE_MAX_FDS];
|
||||
} SyncSysmemMsg;
|
||||
|
||||
/**
|
||||
* MPQemuMsg:
|
||||
* @cmd: The remote command
|
||||
@ -43,12 +51,14 @@ typedef enum {
|
||||
* MPQemuMsg Format of the message sent to the remote device from QEMU.
|
||||
*
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
int cmd;
|
||||
size_t size;
|
||||
|
||||
union {
|
||||
uint64_t u64;
|
||||
SyncSysmemMsg sync_sysmem;
|
||||
} data;
|
||||
|
||||
int fds[REMOTE_MAX_FDS];
|
||||
|
Loading…
Reference in New Issue
Block a user