Skip to content

Commit

Permalink
multi-process: setup memory manager for remote device
Browse files Browse the repository at this point in the history
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 <[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: 7d2d1831d812e85f681e7a8ab99e032cf4704689.1611938319.git.jag.raman@oracle.com
Signed-off-by: Stefan Hajnoczi <[email protected]>
  • Loading branch information
jraman567 authored and stefanhaRH committed Feb 10, 2021
1 parent c7d80c7 commit ed5d001
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 0 deletions.
2 changes: 2 additions & 0 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -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
-------------------------
Expand Down
65 changes: 65 additions & 0 deletions hw/remote/memory.c
Original file line number Diff line number Diff line change
@@ -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);

}
}
2 changes: 2 additions & 0 deletions hw/remote/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -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)
11 changes: 11 additions & 0 deletions hw/remote/mpqemu-link.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 19 additions & 0 deletions include/hw/remote/memory.h
Original file line number Diff line number Diff line change
@@ -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
10 changes: 10 additions & 0 deletions include/hw/remote/mpqemu-link.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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
Expand All @@ -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];
Expand Down

0 comments on commit ed5d001

Please sign in to comment.