From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
To: elena.ufimtseva@oracle.com
Cc: fam@euphon.net, john.g.johnson@oracle.com,
swapnil.ingle@nutanix.com, mst@redhat.com, qemu-devel@nongnu.org,
kraxel@redhat.com, jag.raman@oracle.com, quintela@redhat.com,
armbru@redhat.com, kanth.ghatraju@oracle.com, felipe@nutanix.com,
thuth@redhat.com, ehabkost@redhat.com, konrad.wilk@oracle.com,
liran.alon@oracle.com, stefanha@redhat.com,
thanos.makatos@nutanix.com, rth@twiddle.net, kwolf@redhat.com,
berrange@redhat.com, mreitz@redhat.com,
ross.lagerwall@citrix.com, marcandre.lureau@gmail.com,
pbonzini@redhat.com
Subject: Re: [PATCH v6 21/36] multi-process: PCI BAR read/write handling for proxy & remote endpoints
Date: Thu, 9 Apr 2020 19:55:52 +0100 [thread overview]
Message-ID: <20200409185552.GH3065@work-vm> (raw)
In-Reply-To: <848b7213d9c1de43f5f5c8518a4f5bcd46faec7e.1586165556.git.elena.ufimtseva@oracle.com>
* elena.ufimtseva@oracle.com (elena.ufimtseva@oracle.com) wrote:
> From: Jagannathan Raman <jag.raman@oracle.com>
>
> Proxy device object implements handler for PCI BAR writes and reads.
> The handler uses BAR_WRITE/BAR_READ message to communicate to the
> remote process with the BAR address and value to be written/read.
> The remote process implements handler for BAR_WRITE/BAR_READ
> message.
>
> Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
> Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com>
> Signed-off-by: John G Johnson <john.g.johnson@oracle.com>
Again please see my comments on v5
> ---
> hw/proxy/qemu-proxy.c | 64 ++++++++++++++++++++++++++++++
> include/hw/proxy/qemu-proxy.h | 20 +++++++++-
> include/io/mpqemu-link.h | 12 ++++++
> io/mpqemu-link.c | 6 +++
> remote/remote-main.c | 73 +++++++++++++++++++++++++++++++++++
> 5 files changed, 173 insertions(+), 2 deletions(-)
>
> diff --git a/hw/proxy/qemu-proxy.c b/hw/proxy/qemu-proxy.c
> index 87cf39c672..7fd0a312a5 100644
> --- a/hw/proxy/qemu-proxy.c
> +++ b/hw/proxy/qemu-proxy.c
> @@ -169,3 +169,67 @@ static void pci_proxy_dev_register_types(void)
>
> type_init(pci_proxy_dev_register_types)
>
> +static void send_bar_access_msg(PCIProxyDev *dev, MemoryRegion *mr,
> + bool write, hwaddr addr, uint64_t *val,
> + unsigned size, bool memory)
> +{
> + MPQemuLinkState *mpqemu_link = dev->mpqemu_link;
> + MPQemuMsg msg;
> + int wait;
> +
> + memset(&msg, 0, sizeof(MPQemuMsg));
> +
> + msg.bytestream = 0;
> + msg.size = sizeof(msg.data1);
> + msg.data1.bar_access.addr = mr->addr + addr;
> + msg.data1.bar_access.size = size;
> + msg.data1.bar_access.memory = memory;
> +
> + if (write) {
> + msg.cmd = BAR_WRITE;
> + msg.data1.bar_access.val = *val;
> + } else {
> + wait = GET_REMOTE_WAIT;
> +
> + msg.cmd = BAR_READ;
> + msg.num_fds = 1;
> + msg.fds[0] = wait;
> + }
> +
> + mpqemu_msg_send(&msg, mpqemu_link->dev);
> +
> + if (!write) {
> + *val = wait_for_remote(wait);
> + PUT_REMOTE_WAIT(wait);
> + }
> +}
> +
> +void proxy_default_bar_write(void *opaque, hwaddr addr, uint64_t val,
> + unsigned size)
> +{
> + ProxyMemoryRegion *pmr = opaque;
> +
> + send_bar_access_msg(pmr->dev, &pmr->mr, true, addr, &val, size,
> + pmr->memory);
> +}
> +
> +uint64_t proxy_default_bar_read(void *opaque, hwaddr addr, unsigned size)
> +{
> + ProxyMemoryRegion *pmr = opaque;
> + uint64_t val;
> +
> + send_bar_access_msg(pmr->dev, &pmr->mr, false, addr, &val, size,
> + pmr->memory);
> +
> + return val;
> +}
> +
> +const MemoryRegionOps proxy_default_ops = {
> + .read = proxy_default_bar_read,
> + .write = proxy_default_bar_write,
> + .endianness = DEVICE_NATIVE_ENDIAN,
> + .impl = {
> + .min_access_size = 1,
> + .max_access_size = 1,
> + },
> +};
> diff --git a/include/hw/proxy/qemu-proxy.h b/include/hw/proxy/qemu-proxy.h
> index d7eaf26f29..9e4127eccb 100644
> --- a/include/hw/proxy/qemu-proxy.h
> +++ b/include/hw/proxy/qemu-proxy.h
> @@ -26,14 +26,25 @@
> #define PCI_PROXY_DEV_GET_CLASS(obj) \
> OBJECT_GET_CLASS(PCIProxyDevClass, (obj), TYPE_PCI_PROXY_DEV)
>
> -typedef struct PCIProxyDev {
> +typedef struct PCIProxyDev PCIProxyDev;
> +
> +typedef struct ProxyMemoryRegion {
> + PCIProxyDev *dev;
> + MemoryRegion mr;
> + bool memory;
> + bool present;
> + uint8_t type;
> +} ProxyMemoryRegion;
> +
> +struct PCIProxyDev {
> PCIDevice parent_dev;
>
> MPQemuLinkState *mpqemu_link;
>
> int socket;
>
> -} PCIProxyDev;
> + ProxyMemoryRegion region[PCI_NUM_REGIONS];
> +};
>
> typedef struct PCIProxyDevClass {
> PCIDeviceClass parent_class;
> @@ -43,4 +54,9 @@ typedef struct PCIProxyDevClass {
> char *command;
> } PCIProxyDevClass;
>
> +void proxy_default_bar_write(void *opaque, hwaddr addr, uint64_t val,
> + unsigned size);
> +
> +uint64_t proxy_default_bar_read(void *opaque, hwaddr addr, unsigned size);
> +
> #endif /* QEMU_PROXY_H */
> diff --git a/include/io/mpqemu-link.h b/include/io/mpqemu-link.h
> index 7228a1915e..41cf092f9e 100644
> --- a/include/io/mpqemu-link.h
> +++ b/include/io/mpqemu-link.h
> @@ -31,6 +31,8 @@
> /**
> * mpqemu_cmd_t:
> * SYNC_SYSMEM Shares QEMU's RAM with remote device's RAM
> + * BAR_WRITE Writes to PCI BAR region
> + * BAR_READ Reads from PCI BAR region
> *
> * proc_cmd_t enum type to specify the command to be executed on the remote
> * device.
> @@ -41,6 +43,8 @@ typedef enum {
> CONNECT_DEV,
> PCI_CONFIG_WRITE,
> PCI_CONFIG_READ,
> + BAR_WRITE,
> + BAR_READ,
> MAX,
> } mpqemu_cmd_t;
>
> @@ -56,6 +60,13 @@ typedef struct {
> ram_addr_t offsets[REMOTE_MAX_FDS];
> } sync_sysmem_msg_t;
>
> +typedef struct {
> + hwaddr addr;
> + uint64_t val;
> + unsigned size;
> + bool memory;
> +} bar_access_msg_t;
> +
> /**
> * MPQemuMsg:
> * @cmd: The remote command
> @@ -78,6 +89,7 @@ typedef struct {
> union {
> uint64_t u64;
> sync_sysmem_msg_t sync_sysmem;
> + bar_access_msg_t bar_access;
> } data1;
>
> int fds[REMOTE_MAX_FDS];
> diff --git a/io/mpqemu-link.c b/io/mpqemu-link.c
> index 643c0588ce..2b67ef6410 100644
> --- a/io/mpqemu-link.c
> +++ b/io/mpqemu-link.c
> @@ -367,6 +367,12 @@ bool mpqemu_msg_valid(MPQemuMsg *msg)
> return false;
> }
> break;
> + case BAR_WRITE:
> + case BAR_READ:
> + if (msg->size != sizeof(msg->data1)) {
> + return false;
> + }
> + break;
> default:
> break;
> }
> diff --git a/remote/remote-main.c b/remote/remote-main.c
> index b5ed31f63b..4f512aa5a8 100644
> --- a/remote/remote-main.c
> +++ b/remote/remote-main.c
> @@ -33,6 +33,7 @@
> #include "sysemu/sysemu.h"
> #include "block/block.h"
> #include "exec/ramlist.h"
> +#include "exec/memattrs.h"
>
> static void process_msg(GIOCondition cond, MPQemuLinkState *link,
> MPQemuChannel *chan);
> @@ -102,6 +103,66 @@ exit:
> notify_proxy(wait, ret);
> }
>
> +/* TODO: confirm memtx attrs. */
> +static void process_bar_write(MPQemuMsg *msg, Error **errp)
> +{
> + bar_access_msg_t *bar_access = &msg->data1.bar_access;
> + AddressSpace *as =
> + bar_access->memory ? &address_space_memory : &address_space_io;
> + MemTxResult res;
> +
> + res = address_space_rw(as, bar_access->addr, MEMTXATTRS_UNSPECIFIED,
> + (uint8_t *)&bar_access->val, bar_access->size, true);
> +
> + if (res != MEMTX_OK) {
> + error_setg(errp, "Could not perform address space write operation,"
> + " inaccessible address: %lx.", bar_access->addr);
> + }
> +}
> +
> +static void process_bar_read(MPQemuMsg *msg, Error **errp)
> +{
> + bar_access_msg_t *bar_access = &msg->data1.bar_access;
> + AddressSpace *as;
> + int wait = msg->fds[0];
> + MemTxResult res;
> + uint64_t val = 0;
> +
> + as = bar_access->memory ? &address_space_memory : &address_space_io;
> +
> + assert(bar_access->size <= sizeof(uint64_t));
> +
> + res = address_space_rw(as, bar_access->addr, MEMTXATTRS_UNSPECIFIED,
> + (uint8_t *)&val, bar_access->size, false);
> +
> + if (res != MEMTX_OK) {
> + error_setg(errp, "Could not perform address space read operation,"
> + " inaccessible address: %lx.", bar_access->addr);
> + val = (uint64_t)-1;
> + goto fail;
> + }
> +
> + switch (bar_access->size) {
> + case 4:
> + val = *((uint32_t *)&val);
> + break;
> + case 2:
> + val = *((uint16_t *)&val);
> + break;
> + case 1:
> + val = *((uint8_t *)&val);
> + break;
> + default:
> + error_setg(errp, "Invalid PCI BAR read size");
> + return;
> + }
> +
> +fail:
> + notify_proxy(wait, val);
> +
> + PUT_REMOTE_WAIT(wait);
> +}
> +
> static void process_msg(GIOCondition cond, MPQemuLinkState *link,
> MPQemuChannel *chan)
> {
> @@ -131,6 +192,18 @@ static void process_msg(GIOCondition cond, MPQemuLinkState *link,
> case PCI_CONFIG_READ:
> process_config_read(LINK_TO_DEV(link), msg);
> break;
> + case BAR_WRITE:
> + process_bar_write(msg, &err);
> + if (err) {
> + goto finalize_loop;
> + }
> + break;
> + case BAR_READ:
> + process_bar_read(msg, &err);
> + if (err) {
> + goto finalize_loop;
> + }
> + break;
> default:
> error_setg(&err, "Unknown command");
> goto finalize_loop;
> --
> 2.25.GIT
>
--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
next prev parent reply other threads:[~2020-04-09 18:59 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-04-06 9:40 [PATCH v6 00/36] Initial support for multi-process qemu elena.ufimtseva
2020-04-06 9:40 ` [PATCH v6 01/36] memory: alloc RAM from file at offset elena.ufimtseva
2020-04-06 9:40 ` [PATCH v6 02/36] multi-process: Refactor machine_init and exit notifiers elena.ufimtseva
2020-04-06 9:40 ` [PATCH v6 03/36] command-line: refractor parser code elena.ufimtseva
2020-04-06 9:40 ` [PATCH v6 04/36] multi-process: Refactor chardev functions out of vl.c elena.ufimtseva
2020-04-06 9:40 ` [PATCH v6 05/36] multi-process: Refactor monitor " elena.ufimtseva
2020-04-06 9:40 ` [PATCH v6 06/36] monitor: destaticize HMP commands elena.ufimtseva
2020-04-09 17:51 ` Dr. David Alan Gilbert
2020-04-06 9:40 ` [PATCH v6 07/36] multi-process: add a command line option for debug file elena.ufimtseva
2020-04-06 9:40 ` [PATCH v6 08/36] multi-process: Add stub functions to facilate build of multi-process elena.ufimtseva
2020-04-06 13:36 ` Eric Blake
2020-04-06 9:40 ` [PATCH v6 09/36] multi-process: Add config option for multi-process QEMU elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 10/36] multi-process: build system for remote device process elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 11/36] multi-process: define mpqemu-link object elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 12/36] multi-process: add functions to synchronize proxy and remote endpoints elena.ufimtseva
2020-04-09 17:56 ` Dr. David Alan Gilbert
2020-04-06 9:41 ` [PATCH v6 13/36] multi-process: setup PCI host bridge for remote device elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 14/36] multi-process: setup a machine object for remote device process elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 15/36] multi-process: setup memory manager for remote device elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 16/36] multi-process: remote process initialization elena.ufimtseva
2020-04-09 18:00 ` Dr. David Alan Gilbert
2020-04-10 8:22 ` Elena Ufimtseva
2020-04-06 9:41 ` [PATCH v6 17/36] multi-process: introduce proxy object elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 18/36] multi-process: Initialize Proxy Object's communication channel elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 19/36] multi-process: Connect Proxy Object with device in the remote process elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 20/36] multi-process: Forward PCI config space acceses to " elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 21/36] multi-process: PCI BAR read/write handling for proxy & remote endpoints elena.ufimtseva
2020-04-09 18:55 ` Dr. David Alan Gilbert [this message]
2020-04-06 9:41 ` [PATCH v6 22/36] multi-process: Synchronize remote memory elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 23/36] multi-process: create IOHUB object to handle irq elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 24/36] multi-process: Retrieve PCI info from remote process elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 25/36] multi-process: Introduce build flags to separate remote process code elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 26/36] multi-process: add parse_cmdline in remote process elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 27/36] multi-process: add support to parse device option elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 28/36] multi-process: send heartbeat messages to remote elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 29/36] multi-process: handle heartbeat messages in remote process elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 30/36] multi-process: perform device reset in the " elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 31/36] multi-process/mon: choose HMP commands based on target elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 32/36] multi-process/mon: stub functions to enable QMP module for remote process elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 33/36] multi-process/mon: enable QMP module support in the " elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 34/36] multi-process/mon: Initialize QMP module for remote processes elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 35/36] multi-process: add the concept description to docs/devel/qemu-multiprocess elena.ufimtseva
2020-04-06 9:41 ` [PATCH v6 36/36] multi-process: add configure and usage information elena.ufimtseva
2020-04-06 10:14 ` [PATCH v6 00/36] Initial support for multi-process qemu no-reply
2020-04-06 16:28 ` Elena Ufimtseva
2020-04-06 10:36 ` no-reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200409185552.GH3065@work-vm \
--to=dgilbert@redhat.com \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=ehabkost@redhat.com \
--cc=elena.ufimtseva@oracle.com \
--cc=fam@euphon.net \
--cc=felipe@nutanix.com \
--cc=jag.raman@oracle.com \
--cc=john.g.johnson@oracle.com \
--cc=kanth.ghatraju@oracle.com \
--cc=konrad.wilk@oracle.com \
--cc=kraxel@redhat.com \
--cc=kwolf@redhat.com \
--cc=liran.alon@oracle.com \
--cc=marcandre.lureau@gmail.com \
--cc=mreitz@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=ross.lagerwall@citrix.com \
--cc=rth@twiddle.net \
--cc=stefanha@redhat.com \
--cc=swapnil.ingle@nutanix.com \
--cc=thanos.makatos@nutanix.com \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.