Message ID | 52599a1edb0edfab0753688e3bf8544e036da441.1606853298.git.jag.raman@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Initial support for multi-process Qemu | expand |
On Wed, Dec 2, 2020 at 12:23 AM Jagannathan Raman <jag.raman@oracle.com> wrote: > PCI host bridge is setup for the remote device process. It is > implemented using remote-pcihost object. It is an extension of the PCI > host bridge setup by QEMU. > Remote-pcihost configures a PCI bus which could be used by the remote > PCI device to latch on to. > > Signed-off-by: Jagannathan Raman <jag.raman@oracle.com> > Signed-off-by: John G Johnson <john.g.johnson@oracle.com> > Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com> > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > include/hw/pci-host/remote.h | 30 ++++++++++++++++++ > hw/pci-host/remote.c | 75 > ++++++++++++++++++++++++++++++++++++++++++++ > MAINTAINERS | 2 ++ > hw/pci-host/Kconfig | 3 ++ > hw/pci-host/meson.build | 1 + > hw/remote/Kconfig | 1 + > 6 files changed, 112 insertions(+) > create mode 100644 include/hw/pci-host/remote.h > create mode 100644 hw/pci-host/remote.c > > diff --git a/include/hw/pci-host/remote.h b/include/hw/pci-host/remote.h > new file mode 100644 > index 0000000..bab6d3c > --- /dev/null > +++ b/include/hw/pci-host/remote.h > @@ -0,0 +1,30 @@ > +/* > + * 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 "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_io; > +} RemotePCIHost; > + > +#endif > diff --git a/hw/pci-host/remote.c b/hw/pci-host/remote.c > new file mode 100644 > index 0000000..11325e2 > --- /dev/null > +++ b/hw/pci-host/remote.c > @@ -0,0 +1,75 @@ > +/* > + * Remote PCI host device > + * > + * Unlike PCI host devices that model physical hardware, the purpose > + * of this PCI host is to host multi-process QEMU devices. > + * > + * Multi-process QEMU extends the PCI host of a QEMU machine into a > + * remote process. Any PCI device attached to the remote process is > + * visible in the QEMU guest. This allows existing QEMU device models > + * to be reused in the remote process. > + * > + * 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. Its job is just to provide the environment that QEMU > + * PCI device models need when running in a remote process. > + * > + * 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) > +{ > + PCIHostState *pci = PCI_HOST_BRIDGE(dev); > + RemotePCIHost *s = REMOTE_HOST_DEVICE(dev); > + > + pci->bus = pci_root_bus_new(DEVICE(s), "remote-pci", > + 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/MAINTAINERS b/MAINTAINERS > index f615ad1..4515476 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -3137,6 +3137,8 @@ M: John G Johnson <john.g.johnson@oracle.com> > S: Maintained > F: docs/devel/multi-process.rst > F: tests/multiprocess/multiprocess-lsi53c895a.py > +F: hw/pci-host/remote.c > +F: include/hw/pci-host/remote.h > > Build and test automation > ------------------------- > diff --git a/hw/pci-host/Kconfig b/hw/pci-host/Kconfig > index 036a618..25cdeb2 100644 > --- a/hw/pci-host/Kconfig > +++ b/hw/pci-host/Kconfig > @@ -60,3 +60,6 @@ config PCI_BONITO > select PCI > select UNIMP > bool > + > +config MULTIPROCESS_HOST > + bool > Why not REMOTE_PCIHOST ? diff --git a/hw/pci-host/meson.build b/hw/pci-host/meson.build > index e6d1b89..4147100 100644 > --- a/hw/pci-host/meson.build > +++ b/hw/pci-host/meson.build > @@ -9,6 +9,7 @@ pci_ss.add(when: 'CONFIG_PCI_EXPRESS_XILINX', if_true: > files('xilinx-pcie.c')) > pci_ss.add(when: 'CONFIG_PCI_I440FX', if_true: files('i440fx.c')) > pci_ss.add(when: 'CONFIG_PCI_SABRE', if_true: files('sabre.c')) > pci_ss.add(when: 'CONFIG_XEN_IGD_PASSTHROUGH', if_true: > files('xen_igd_pt.c')) > +pci_ss.add(when: 'CONFIG_MULTIPROCESS_HOST', if_true: files('remote.c')) > > # PPC devices > pci_ss.add(when: 'CONFIG_PREP_PCI', if_true: files('prep.c')) > diff --git a/hw/remote/Kconfig b/hw/remote/Kconfig > index 5484446..fb6ee4a 100644 > --- a/hw/remote/Kconfig > +++ b/hw/remote/Kconfig > @@ -1,3 +1,4 @@ > config MULTIPROCESS > bool > depends on PCI && KVM > + select MULTIPROCESS_HOST > -- > 1.8.3.1 > >
On Wed, Dec 2, 2020 at 12:23 AM Jagannathan Raman <jag.raman@oracle.com> wrote: > PCI host bridge is setup for the remote device process. It is > implemented using remote-pcihost object. It is an extension of the PCI > host bridge setup by QEMU. > Remote-pcihost configures a PCI bus which could be used by the remote > PCI device to latch on to. > > Signed-off-by: Jagannathan Raman <jag.raman@oracle.com> > Signed-off-by: John G Johnson <john.g.johnson@oracle.com> > Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com> > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > include/hw/pci-host/remote.h | 30 ++++++++++++++++++ > hw/pci-host/remote.c | 75 > ++++++++++++++++++++++++++++++++++++++++++++ > MAINTAINERS | 2 ++ > hw/pci-host/Kconfig | 3 ++ > hw/pci-host/meson.build | 1 + > hw/remote/Kconfig | 1 + > 6 files changed, 112 insertions(+) > create mode 100644 include/hw/pci-host/remote.h > create mode 100644 hw/pci-host/remote.c > > diff --git a/include/hw/pci-host/remote.h b/include/hw/pci-host/remote.h > new file mode 100644 > index 0000000..bab6d3c > --- /dev/null > +++ b/include/hw/pci-host/remote.h > @@ -0,0 +1,30 @@ > +/* > + * 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 "exec/memory.h" > +#include "hw/pci/pcie_host.h" > + > +#define TYPE_REMOTE_HOST_DEVICE "remote-pcihost" > I got confused by the following patch. Please try to be consistent. TYPE_REMOTE_PCIHOST would help. thanks +#define REMOTE_HOST_DEVICE(obj) \ > + OBJECT_CHECK(RemotePCIHost, (obj), TYPE_REMOTE_HOST_DEVICE) > REMOTE_PCIHOST + > +typedef struct RemotePCIHost { > + /*< private >*/ > + PCIExpressHost parent_obj; > + /*< public >*/ > + > + MemoryRegion *mr_pci_mem; > + MemoryRegion *mr_sys_io; > +} RemotePCIHost; > + > +#endif > diff --git a/hw/pci-host/remote.c b/hw/pci-host/remote.c > new file mode 100644 > index 0000000..11325e2 > --- /dev/null > +++ b/hw/pci-host/remote.c > @@ -0,0 +1,75 @@ > +/* > + * Remote PCI host device > + * > + * Unlike PCI host devices that model physical hardware, the purpose > + * of this PCI host is to host multi-process QEMU devices. > + * > + * Multi-process QEMU extends the PCI host of a QEMU machine into a > + * remote process. Any PCI device attached to the remote process is > + * visible in the QEMU guest. This allows existing QEMU device models > + * to be reused in the remote process. > + * > + * 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. Its job is just to provide the environment that QEMU > + * PCI device models need when running in a remote process. > + * > + * 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) > +{ > + PCIHostState *pci = PCI_HOST_BRIDGE(dev); > + RemotePCIHost *s = REMOTE_HOST_DEVICE(dev); > + > + pci->bus = pci_root_bus_new(DEVICE(s), "remote-pci", > + 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/MAINTAINERS b/MAINTAINERS > index f615ad1..4515476 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -3137,6 +3137,8 @@ M: John G Johnson <john.g.johnson@oracle.com> > S: Maintained > F: docs/devel/multi-process.rst > F: tests/multiprocess/multiprocess-lsi53c895a.py > +F: hw/pci-host/remote.c > +F: include/hw/pci-host/remote.h > > Build and test automation > ------------------------- > diff --git a/hw/pci-host/Kconfig b/hw/pci-host/Kconfig > index 036a618..25cdeb2 100644 > --- a/hw/pci-host/Kconfig > +++ b/hw/pci-host/Kconfig > @@ -60,3 +60,6 @@ config PCI_BONITO > select PCI > select UNIMP > bool > + > +config MULTIPROCESS_HOST > + bool > diff --git a/hw/pci-host/meson.build b/hw/pci-host/meson.build > index e6d1b89..4147100 100644 > --- a/hw/pci-host/meson.build > +++ b/hw/pci-host/meson.build > @@ -9,6 +9,7 @@ pci_ss.add(when: 'CONFIG_PCI_EXPRESS_XILINX', if_true: > files('xilinx-pcie.c')) > pci_ss.add(when: 'CONFIG_PCI_I440FX', if_true: files('i440fx.c')) > pci_ss.add(when: 'CONFIG_PCI_SABRE', if_true: files('sabre.c')) > pci_ss.add(when: 'CONFIG_XEN_IGD_PASSTHROUGH', if_true: > files('xen_igd_pt.c')) > +pci_ss.add(when: 'CONFIG_MULTIPROCESS_HOST', if_true: files('remote.c')) > > # PPC devices > pci_ss.add(when: 'CONFIG_PREP_PCI', if_true: files('prep.c')) > diff --git a/hw/remote/Kconfig b/hw/remote/Kconfig > index 5484446..fb6ee4a 100644 > --- a/hw/remote/Kconfig > +++ b/hw/remote/Kconfig > @@ -1,3 +1,4 @@ > config MULTIPROCESS > bool > depends on PCI && KVM > + select MULTIPROCESS_HOST > -- > 1.8.3.1 > >
diff --git a/include/hw/pci-host/remote.h b/include/hw/pci-host/remote.h new file mode 100644 index 0000000..bab6d3c --- /dev/null +++ b/include/hw/pci-host/remote.h @@ -0,0 +1,30 @@ +/* + * 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 "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_io; +} RemotePCIHost; + +#endif diff --git a/hw/pci-host/remote.c b/hw/pci-host/remote.c new file mode 100644 index 0000000..11325e2 --- /dev/null +++ b/hw/pci-host/remote.c @@ -0,0 +1,75 @@ +/* + * Remote PCI host device + * + * Unlike PCI host devices that model physical hardware, the purpose + * of this PCI host is to host multi-process QEMU devices. + * + * Multi-process QEMU extends the PCI host of a QEMU machine into a + * remote process. Any PCI device attached to the remote process is + * visible in the QEMU guest. This allows existing QEMU device models + * to be reused in the remote process. + * + * 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. Its job is just to provide the environment that QEMU + * PCI device models need when running in a remote process. + * + * 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) +{ + PCIHostState *pci = PCI_HOST_BRIDGE(dev); + RemotePCIHost *s = REMOTE_HOST_DEVICE(dev); + + pci->bus = pci_root_bus_new(DEVICE(s), "remote-pci", + 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/MAINTAINERS b/MAINTAINERS index f615ad1..4515476 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3137,6 +3137,8 @@ M: John G Johnson <john.g.johnson@oracle.com> S: Maintained F: docs/devel/multi-process.rst F: tests/multiprocess/multiprocess-lsi53c895a.py +F: hw/pci-host/remote.c +F: include/hw/pci-host/remote.h Build and test automation ------------------------- diff --git a/hw/pci-host/Kconfig b/hw/pci-host/Kconfig index 036a618..25cdeb2 100644 --- a/hw/pci-host/Kconfig +++ b/hw/pci-host/Kconfig @@ -60,3 +60,6 @@ config PCI_BONITO select PCI select UNIMP bool + +config MULTIPROCESS_HOST + bool diff --git a/hw/pci-host/meson.build b/hw/pci-host/meson.build index e6d1b89..4147100 100644 --- a/hw/pci-host/meson.build +++ b/hw/pci-host/meson.build @@ -9,6 +9,7 @@ pci_ss.add(when: 'CONFIG_PCI_EXPRESS_XILINX', if_true: files('xilinx-pcie.c')) pci_ss.add(when: 'CONFIG_PCI_I440FX', if_true: files('i440fx.c')) pci_ss.add(when: 'CONFIG_PCI_SABRE', if_true: files('sabre.c')) pci_ss.add(when: 'CONFIG_XEN_IGD_PASSTHROUGH', if_true: files('xen_igd_pt.c')) +pci_ss.add(when: 'CONFIG_MULTIPROCESS_HOST', if_true: files('remote.c')) # PPC devices pci_ss.add(when: 'CONFIG_PREP_PCI', if_true: files('prep.c')) diff --git a/hw/remote/Kconfig b/hw/remote/Kconfig index 5484446..fb6ee4a 100644 --- a/hw/remote/Kconfig +++ b/hw/remote/Kconfig @@ -1,3 +1,4 @@ config MULTIPROCESS bool depends on PCI && KVM + select MULTIPROCESS_HOST