[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v12 13/19] multi-process: add proxy communication functions
From: |
Jagannathan Raman |
Subject: |
[PATCH v12 13/19] multi-process: add proxy communication functions |
Date: |
Tue, 1 Dec 2020 15:22:48 -0500 |
From: Elena Ufimtseva <elena.ufimtseva@oracle.com>
Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com>
Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
Signed-off-by: John G Johnson <john.g.johnson@oracle.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
---
include/hw/remote/mpqemu-link.h | 4 ++++
hw/remote/mpqemu-link.c | 38 ++++++++++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+)
diff --git a/include/hw/remote/mpqemu-link.h b/include/hw/remote/mpqemu-link.h
index 070ac77..cee9468 100644
--- a/include/hw/remote/mpqemu-link.h
+++ b/include/hw/remote/mpqemu-link.h
@@ -15,6 +15,8 @@
#include "qemu/thread.h"
#include "io/channel.h"
#include "exec/hwaddr.h"
+#include "io/channel-socket.h"
+#include "hw/remote/proxy.h"
#define REMOTE_MAX_FDS 8
@@ -65,6 +67,8 @@ typedef struct {
int num_fds;
} MPQemuMsg;
+uint64_t mpqemu_msg_send_and_await_reply(MPQemuMsg *msg, PCIProxyDev *pdev,
+ Error **errp);
void mpqemu_msg_send(MPQemuMsg *msg, QIOChannel *ioc, Error **errp);
void mpqemu_msg_recv(MPQemuMsg *msg, QIOChannel *ioc, Error **errp);
diff --git a/hw/remote/mpqemu-link.c b/hw/remote/mpqemu-link.c
index bbd9df3..18c8a54 100644
--- a/hw/remote/mpqemu-link.c
+++ b/hw/remote/mpqemu-link.c
@@ -17,6 +17,7 @@
#include "qemu/iov.h"
#include "qemu/error-report.h"
#include "qemu/main-loop.h"
+#include "io/channel.h"
/*
* Send message over the ioc QIOChannel.
@@ -219,6 +220,43 @@ fail:
}
}
+/*
+ * Called from VCPU thread in non-coroutine context.
+ */
+uint64_t mpqemu_msg_send_and_await_reply(MPQemuMsg *msg, PCIProxyDev *pdev,
+ Error **errp)
+{
+ MPQemuMsg msg_reply = {0};
+ uint64_t ret = UINT64_MAX;
+ Error *local_err = NULL;
+
+ qemu_mutex_lock(&pdev->io_mutex);
+ mpqemu_msg_send(msg, pdev->ioc, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ goto exit_send;
+ }
+
+ mpqemu_msg_recv(&msg_reply, pdev->ioc, &local_err);
+ if (local_err) {
+ error_propagate(errp, local_err);
+ goto exit_send;
+ }
+
+ if (!mpqemu_msg_valid(&msg_reply) || msg_reply.cmd != RET_MSG) {
+ error_setg(errp, "ERROR: Invalid reply received for command %d",
+ msg->cmd);
+ goto exit_send;
+ } else {
+ ret = msg_reply.data.u64;
+ }
+
+ exit_send:
+ qemu_mutex_unlock(&pdev->io_mutex);
+
+ return ret;
+}
+
bool mpqemu_msg_valid(MPQemuMsg *msg)
{
if (msg->cmd >= MPQEMU_CMD_MAX && msg->cmd < 0) {
--
1.8.3.1
- Re: [PATCH v12 11/19] multi-process: setup memory manager for remote device, (continued)
[PATCH v12 15/19] multi-process: PCI BAR read/write handling for proxy & remote endpoints, Jagannathan Raman, 2020/12/01
[PATCH v12 17/19] multi-process: create IOHUB object to handle irq, Jagannathan Raman, 2020/12/01
[PATCH v12 19/19] multi-process: perform device reset in the remote process, Jagannathan Raman, 2020/12/01
[PATCH v12 04/19] multi-process: Add config option for multi-process QEMU, Jagannathan Raman, 2020/12/01