Message ID | 77bf485a3bbaeac83f3db50753fe45156ae7e882.1593273671.git.elena.ufimtseva@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Initial support for multi-process qemu | expand |
On Sat, Jun 27, 2020 at 10:09:25AM -0700, elena.ufimtseva@oracle.com wrote: > diff --git a/hw/pci-host/remote.c b/hw/pci-host/remote.c > new file mode 100644 > index 0000000000..5ea9af4154 > --- /dev/null > +++ b/hw/pci-host/remote.c > @@ -0,0 +1,63 @@ > +/* > + * Remote PCI host device > + * > + * Copyright © 2018, 2020 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. > + * A little more detail would be nice: Unlike PCI host devices that model physical hardware, the purpose of this PCI host is to host multi-process QEMU remote PCI devices. Multi-process QEMU talks to a remote PCI device that runs in a separate process. In order to reuse QEMU device models in the remote process we need a PCI bus that holds the devices. This PCI host is purely a container for PCI devices. It's fake in the sense that the guest never sees this PCI host and has no way of accessing it. It's job is just to provide the environment that QEMU PCI device models need when running in a remote process. I think this could be restated more clearly but hopefully it communicates the purpose of hw/pci-host/remote.c. :P > +typedef struct RemotePCIHost { > + /*< private >*/ > + PCIExpressHost parent_obj; > + /*< public >*/ > + > + MemoryRegion *mr_pci_mem; > + MemoryRegion *mr_sys_mem; Unused? Please add mr_sys_mem if and when it is used.
> On Jun 30, 2020, at 11:17 AM, Stefan Hajnoczi <stefanha@redhat.com> wrote: > > On Sat, Jun 27, 2020 at 10:09:25AM -0700, elena.ufimtseva@oracle.com wrote: >> diff --git a/hw/pci-host/remote.c b/hw/pci-host/remote.c >> new file mode 100644 >> index 0000000000..5ea9af4154 >> --- /dev/null >> +++ b/hw/pci-host/remote.c >> @@ -0,0 +1,63 @@ >> +/* >> + * Remote PCI host device >> + * >> + * Copyright © 2018, 2020 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. >> + * > > A little more detail would be nice: > > Unlike PCI host devices that model physical hardware, the purpose of > this PCI host is to host multi-process QEMU remote PCI devices. > > Multi-process QEMU talks to a remote PCI device that runs in a > separate process. In order to reuse QEMU device models in the remote > process we need a PCI bus that holds the devices. > > This PCI host is purely a container for PCI devices. It's fake in the > sense that the guest never sees this PCI host and has no way of > accessing it. It's job is just to provide the environment that QEMU > PCI device models need when running in a remote process. > > I think this could be restated more clearly but hopefully it > communicates the purpose of hw/pci-host/remote.c. :P OK, we get the theme of the message. :) > >> +typedef struct RemotePCIHost { >> + /*< private >*/ >> + PCIExpressHost parent_obj; >> + /*< public >*/ >> + >> + MemoryRegion *mr_pci_mem; >> + MemoryRegion *mr_sys_mem; > > Unused? Please add mr_sys_mem if and when it is used. Got it. We will add it in the later patches that use these. -- Jag
diff --git a/MAINTAINERS b/MAINTAINERS index 1b40446c73..e46f1960bf 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2938,6 +2938,14 @@ S: Maintained F: hw/semihosting/ F: include/hw/semihosting/ +Multi-process QEMU +M: Jagannathan Raman <jag.raman@oracle.com> +M: Elena Ufimtseva <elena.ufimtseva@oracle.com> +M: John G Johnson <john.g.johnson@oracle.com> +S: Maintained +F: hw/pci-host/remote.c +F: include/hw/pci-host/remote.h + Build and test automation ------------------------- Build and test automation diff --git a/hw/pci-host/Makefile.objs b/hw/pci-host/Makefile.objs index e422e0aca0..daf900710d 100644 --- a/hw/pci-host/Makefile.objs +++ b/hw/pci-host/Makefile.objs @@ -18,6 +18,7 @@ common-obj-$(CONFIG_XEN_IGD_PASSTHROUGH) += xen_igd_pt.o common-obj-$(CONFIG_PCI_EXPRESS_Q35) += q35.o common-obj-$(CONFIG_PCI_EXPRESS_GENERIC_BRIDGE) += gpex.o common-obj-$(CONFIG_PCI_EXPRESS_XILINX) += xilinx-pcie.o +common-obj-$(CONFIG_MPQEMU) += remote.o common-obj-$(CONFIG_PCI_EXPRESS_DESIGNWARE) += designware.o obj-$(CONFIG_POWERNV) += pnv_phb4.o pnv_phb4_pec.o diff --git a/hw/pci-host/remote.c b/hw/pci-host/remote.c new file mode 100644 index 0000000000..5ea9af4154 --- /dev/null +++ b/hw/pci-host/remote.c @@ -0,0 +1,63 @@ +/* + * Remote PCI host device + * + * Copyright © 2018, 2020 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/pci/pci.h" +#include "hw/pci/pci_host.h" +#include "hw/pci/pcie_host.h" +#include "hw/qdev-properties.h" +#include "hw/pci-host/remote.h" +#include "exec/memory.h" + +static const char *remote_pcihost_root_bus_path(PCIHostState *host_bridge, + PCIBus *rootbus) +{ + return "0000:00"; +} + +static void remote_pcihost_realize(DeviceState *dev, Error **errp) +{ + char *busname = g_strdup_printf("remote-pci-%ld", (unsigned long)getpid()); + PCIHostState *pci = PCI_HOST_BRIDGE(dev); + RemotePCIHost *s = REMOTE_HOST_DEVICE(dev); + + pci->bus = pci_root_bus_new(DEVICE(s), busname, + s->mr_pci_mem, s->mr_sys_io, + 0, TYPE_PCIE_BUS); +} + +static void remote_pcihost_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_CLASS(klass); + + hc->root_bus_path = remote_pcihost_root_bus_path; + dc->realize = remote_pcihost_realize; + + dc->user_creatable = false; + set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories); + dc->fw_name = "pci"; +} + +static const TypeInfo remote_pcihost_info = { + .name = TYPE_REMOTE_HOST_DEVICE, + .parent = TYPE_PCIE_HOST_BRIDGE, + .instance_size = sizeof(RemotePCIHost), + .class_init = remote_pcihost_class_init, +}; + +static void remote_pcihost_register(void) +{ + type_register_static(&remote_pcihost_info); +} + +type_init(remote_pcihost_register) diff --git a/include/hw/pci-host/remote.h b/include/hw/pci-host/remote.h new file mode 100644 index 0000000000..3df1b53c17 --- /dev/null +++ b/include/hw/pci-host/remote.h @@ -0,0 +1,34 @@ +/* + * PCI Host for remote device + * + * Copyright © 2018, 2020 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_PCIHOST_H +#define REMOTE_PCIHOST_H + +#include "qemu/osdep.h" +#include "qemu-common.h" + +#include "exec/memory.h" +#include "hw/pci/pcie_host.h" + +#define TYPE_REMOTE_HOST_DEVICE "remote-pcihost" +#define REMOTE_HOST_DEVICE(obj) \ + OBJECT_CHECK(RemotePCIHost, (obj), TYPE_REMOTE_HOST_DEVICE) + +typedef struct RemotePCIHost { + /*< private >*/ + PCIExpressHost parent_obj; + /*< public >*/ + + MemoryRegion *mr_pci_mem; + MemoryRegion *mr_sys_mem; + MemoryRegion *mr_sys_io; +} RemotePCIHost; + +#endif