[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v6 19/36] multi-process: Connect Proxy Object with device in the
From: |
elena . ufimtseva |
Subject: |
[PATCH v6 19/36] multi-process: Connect Proxy Object with device in the remote process |
Date: |
Mon, 6 Apr 2020 02:41:09 -0700 |
From: Jagannathan Raman <address@hidden>
Send a message to the remote process to connect PCI device with the
corresponding Proxy object in QEMU
Signed-off-by: Elena Ufimtseva <address@hidden>
Signed-off-by: John G Johnson <address@hidden>
Signed-off-by: Jagannathan Raman <address@hidden>
---
hw/proxy/qemu-proxy.c | 34 +++++++++++++++++++++++++++++++
include/io/mpqemu-link.h | 5 +++++
io/mpqemu-link.c | 3 +++
remote/remote-main.c | 43 ++++++++++++++++++++++++++++++++++++++++
4 files changed, 85 insertions(+)
diff --git a/hw/proxy/qemu-proxy.c b/hw/proxy/qemu-proxy.c
index 40bf56fd37..9b5e429a88 100644
--- a/hw/proxy/qemu-proxy.c
+++ b/hw/proxy/qemu-proxy.c
@@ -17,11 +17,45 @@
static void proxy_set_socket(Object *obj, const char *str, Error **errp)
{
PCIProxyDev *pdev = PCI_PROXY_DEV(obj);
+ DeviceState *dev = DEVICE(obj);
+ MPQemuMsg msg = { 0 };
+ int wait, fd[2];
pdev->socket = atoi(str);
mpqemu_init_channel(pdev->mpqemu_link, &pdev->mpqemu_link->com,
pdev->socket);
+
+ if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd)) {
+ error_setg(errp, "Failed to create socket for device channel");
+ return;
+ }
+
+ wait = GET_REMOTE_WAIT;
+
+ msg.cmd = CONNECT_DEV;
+ msg.bytestream = 1;
+ msg.data2 = (uint8_t *)g_strdup(dev->id);
+ msg.size = sizeof(msg.data2);
+ msg.num_fds = 2;
+ msg.fds[0] = wait;
+ msg.fds[1] = fd[1];
+
+ mpqemu_msg_send(&msg, pdev->mpqemu_link->com);
+
+ if (wait_for_remote(wait)) {
+ error_setg(errp, "Failed to connect device to the remote");
+ close(fd[0]);
+ } else {
+ mpqemu_init_channel(pdev->mpqemu_link, &pdev->mpqemu_link->dev,
+ fd[0]);
+ }
+
+ PUT_REMOTE_WAIT(wait);
+
+ close(fd[1]);
+
+ g_free(msg.data2);
}
static void proxy_init(Object *obj)
diff --git a/include/io/mpqemu-link.h b/include/io/mpqemu-link.h
index 73cc59b874..ebae9afc45 100644
--- a/include/io/mpqemu-link.h
+++ b/include/io/mpqemu-link.h
@@ -38,6 +38,7 @@
typedef enum {
INIT = 0,
SYNC_SYSMEM,
+ CONNECT_DEV,
MAX,
} mpqemu_cmd_t;
@@ -120,8 +121,12 @@ struct MPQemuLinkState {
GMainLoop *loop;
MPQemuChannel *com;
+ MPQemuChannel *dev;
mpqemu_link_callback callback;
+
+ void *opaque;
+ QemuThread thread;
};
MPQemuLinkState *mpqemu_link_create(void);
diff --git a/io/mpqemu-link.c b/io/mpqemu-link.c
index 330a6deffe..b395869a22 100644
--- a/io/mpqemu-link.c
+++ b/io/mpqemu-link.c
@@ -46,6 +46,9 @@ MPQemuLinkState *mpqemu_link_create(void)
MPQemuLinkState *link = MPQEMU_LINK(object_new(TYPE_MPQEMU_LINK));
link->com = NULL;
+ link->dev = NULL;
+
+ link->opaque = NULL;
return link;
}
diff --git a/remote/remote-main.c b/remote/remote-main.c
index 51595f3141..22319cb5ea 100644
--- a/remote/remote-main.c
+++ b/remote/remote-main.c
@@ -34,8 +34,48 @@
#include "block/block.h"
#include "exec/ramlist.h"
+static void process_msg(GIOCondition cond, MPQemuLinkState *link,
+ MPQemuChannel *chan);
+
static MPQemuLinkState *mpqemu_link;
+#define LINK_TO_DEV(link) ((PCIDevice *)link->opaque)
+
+static gpointer dev_thread(gpointer data)
+{
+ MPQemuLinkState *link = data;
+
+ mpqemu_start_coms(link, link->dev);
+
+ return NULL;
+}
+
+static void process_connect_dev_msg(MPQemuMsg *msg)
+{
+ char *devid = (char *)msg->data2;
+ MPQemuLinkState *link = NULL;
+ DeviceState *dev = NULL;
+ int wait = msg->fds[0];
+ int ret = 0;
+
+ dev = qdev_find_recursive(sysbus_get_default(), devid);
+ if (!dev) {
+ ret = 0xff;
+ goto exit;
+ }
+
+ link = mpqemu_link_create();
+ link->opaque = (void *)PCI_DEVICE(dev);
+
+ mpqemu_init_channel(link, &link->dev, msg->fds[1]);
+ mpqemu_link_set_callback(link, process_msg);
+ qemu_thread_create(&link->thread, "dev_thread", dev_thread, link,
+ QEMU_THREAD_JOINABLE);
+
+exit:
+ notify_proxy(wait, ret);
+}
+
static void process_msg(GIOCondition cond, MPQemuLinkState *link,
MPQemuChannel *chan)
{
@@ -56,6 +96,9 @@ static void process_msg(GIOCondition cond, MPQemuLinkState
*link,
switch (msg->cmd) {
case INIT:
break;
+ case CONNECT_DEV:
+ process_connect_dev_msg(msg);
+ break;
default:
error_setg(&err, "Unknown command");
goto finalize_loop;
--
2.25.GIT
- [PATCH v6 15/36] multi-process: setup memory manager for remote device, (continued)
- [PATCH v6 15/36] multi-process: setup memory manager for remote device, elena . ufimtseva, 2020/04/06
- [PATCH v6 17/36] multi-process: introduce proxy object, elena . ufimtseva, 2020/04/06
- [PATCH v6 16/36] multi-process: remote process initialization, elena . ufimtseva, 2020/04/06
- [PATCH v6 14/36] multi-process: setup a machine object for remote device process, elena . ufimtseva, 2020/04/06
- [PATCH v6 21/36] multi-process: PCI BAR read/write handling for proxy & remote endpoints, elena . ufimtseva, 2020/04/06
- [PATCH v6 18/36] multi-process: Initialize Proxy Object's communication channel, elena . ufimtseva, 2020/04/06
- [PATCH v6 13/36] multi-process: setup PCI host bridge for remote device, elena . ufimtseva, 2020/04/06
- [PATCH v6 19/36] multi-process: Connect Proxy Object with device in the remote process,
elena . ufimtseva <=
- [PATCH v6 22/36] multi-process: Synchronize remote memory, elena . ufimtseva, 2020/04/06
- [PATCH v6 26/36] multi-process: add parse_cmdline in remote process, elena . ufimtseva, 2020/04/06
- [PATCH v6 20/36] multi-process: Forward PCI config space acceses to the remote process, elena . ufimtseva, 2020/04/06
- [PATCH v6 25/36] multi-process: Introduce build flags to separate remote process code, elena . ufimtseva, 2020/04/06
- [PATCH v6 28/36] multi-process: send heartbeat messages to remote, elena . ufimtseva, 2020/04/06
- [PATCH v6 29/36] multi-process: handle heartbeat messages in remote process, elena . ufimtseva, 2020/04/06
- [PATCH v6 31/36] multi-process/mon: choose HMP commands based on target, elena . ufimtseva, 2020/04/06
- [PATCH v6 23/36] multi-process: create IOHUB object to handle irq, elena . ufimtseva, 2020/04/06
- [PATCH v6 33/36] multi-process/mon: enable QMP module support in the remote process, elena . ufimtseva, 2020/04/06
- [PATCH v6 36/36] multi-process: add configure and usage information, elena . ufimtseva, 2020/04/06