[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] Citrix PV Bus device [V3]



On Tue, 2 Jul 2013, Paul Durrant wrote:
> This patch introduces a new PCI device which will act as the binding point
> for Citrix branded PV drivers for Xen.
> The intention is that Citrix Windows PV drivers will be available on Windows
> Update and thus using the existing Xen platform PCI device as an anchor
> point is not desirable as that device has been ubiquitous in HVM guests for
> a long time and thus existing HVM guests running Windows would start
> automatically downloading drivers from Windows Update when this may not be
> desired by either the host or guest admin. This device therefore acts as
> an opt-in for those wishing to deploy Citrix PV drivers.
> 
> V3:
> - Addresses comments from Anthony Liguori and Peter Maydell
> 
> V2:
> - Addresses comments from Andreas Farber and Paolo Bonzini
> 
> Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>

I do realize that this is v3 and I didn't step in the discussion
before, sorry for the delay in my response. I admit I didn't read the
entire thread, so excuse me if I repeat things already said before.


>  hw/misc/Makefile.objs    |    2 +
>  hw/misc/citrix_pv_bus.c  |  127 
> ++++++++++++++++++++++++++++++++++++++++++++++
>  include/hw/pci/pci_ids.h |    7 ++-
>  trace-events             |    4 ++
>  4 files changed, 138 insertions(+), 2 deletions(-)
>  create mode 100644 hw/misc/citrix_pv_bus.c
> 
> diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
> index 2578e29..ffd29ea 100644
> --- a/hw/misc/Makefile.objs
> +++ b/hw/misc/Makefile.objs
> @@ -41,3 +41,5 @@ obj-$(CONFIG_SLAVIO) += slavio_misc.o
>  obj-$(CONFIG_ZYNQ) += zynq_slcr.o
>  
>  obj-$(CONFIG_PVPANIC) += pvpanic.o
> +
> +obj-$(CONFIG_XEN) += citrix-pv-bus.o
> diff --git a/hw/misc/citrix_pv_bus.c b/hw/misc/citrix_pv_bus.c
> new file mode 100644
> index 0000000..76e5e13
> --- /dev/null
> +++ b/hw/misc/citrix_pv_bus.c
> @@ -0,0 +1,127 @@
> +
> +/* Copyright (c) Citrix Systems Inc.
> + * All rights reserved.
> + * 
> + * Redistribution and use in source and binary forms, 
> + * with or without modification, are permitted provided 
> + * that the following conditions are met:
> + * 
> + * *   Redistributions of source code must retain the above 
> + *     copyright notice, this list of conditions and the 
> + *     following disclaimer.
> + * *   Redistributions in binary form must reproduce the above 
> + *     copyright notice, this list of conditions and the 
> + *     following disclaimer in the documentation and/or other 
> + *     materials provided with the distribution.
> + * 
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
> + * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
> + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
> + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
> + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
> + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
> + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
> + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
> + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
> + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
> + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
> + * SUCH DAMAGE.
> + */
> +
> +#include "hw/hw.h"
> +#include "hw/pci/pci.h"
> +#include "trace.h"
> +
> +#define TYPE_CITRIX_PV_BUS_DEVICE  "citrix-pv"
> +
> +#define CITRIX_PV_BUS_DEVICE(obj) \
> +     OBJECT_CHECK(CitrixPVBusDevice, (obj), TYPE_CITRIX_PV_BUS_DEVICE)
> +
> +typedef struct CitrixPVBusDevice {
> +    /*< private >*/
> +    PCIDevice       parent_obj;
> +    /*< public >*/
> +    uint8_t         revision;
> +    uint32_t        size;
> +    MemoryRegion    mmio;
> +} CitrixPVBusDevice;
> +
> +static uint64_t citrix_pv_bus_mmio_read(void *opaque, hwaddr addr,
> +                                        unsigned size)
> +{
> +    trace_citrix_pv_bus_mmio_read(addr);
> +
> +    return ~(uint64_t)0;
> +}
> +
> +static void citrix_pv_bus_mmio_write(void *opaque, hwaddr addr,
> +                                     uint64_t val, unsigned size)
> +{
> +    trace_citrix_pv_bus_mmio_write(addr);
> +}
> +
> +static const MemoryRegionOps citrix_pv_bus_mmio_ops = {
> +    .read = &citrix_pv_bus_mmio_read,
> +    .write = &citrix_pv_bus_mmio_write,
> +    .endianness = DEVICE_LITTLE_ENDIAN,
> +};
> +
> +static int citrix_pv_bus_init(PCIDevice *pci_dev)
> +{
> +    CitrixPVBusDevice *d = CITRIX_PV_BUS_DEVICE(pci_dev);
> +    uint8_t *pci_conf;
> +
> +    pci_conf = pci_dev->config;
> +
> +    pci_set_word(pci_conf + PCI_COMMAND, PCI_COMMAND_MEMORY);
> +    pci_set_byte(pci_conf + PCI_REVISION_ID, d->revision);
> +
> +    pci_config_set_prog_interface(pci_conf, 0);
> +
> +    pci_conf[PCI_INTERRUPT_PIN] = 1;
> +
> +    memory_region_init_io(&d->mmio, &citrix_pv_bus_mmio_ops, d,
> +                          "citrix-bus-mmio", d->size);
> +
> +    pci_register_bar(pci_dev, 1, PCI_BASE_ADDRESS_MEM_PREFETCH,
> +                     &d->mmio);
> +
> +    return 0;
> +}
> +
> +static Property citrix_pv_bus_props[] = {
> +    DEFINE_PROP_UINT8("revision", CitrixPVBusDevice, revision, 0x01),
> +    DEFINE_PROP_UINT32("size", CitrixPVBusDevice, size, 0x400000),
> +    DEFINE_PROP_END_OF_LIST()
> +};
> +
> +static void citrix_pv_bus_class_init(ObjectClass *klass, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
> +
> +    k->init = citrix_pv_bus_init;
> +    k->vendor_id = PCI_VENDOR_ID_CITRIX;
> +    k->device_id = PCI_DEVICE_ID_CITRIX_PV_BUS;
> +    k->class_id = PCI_CLASS_SYSTEM_OTHER;
> +    k->subsystem_vendor_id = PCI_VENDOR_ID_CITRIX;
> +    k->subsystem_id = PCI_DEVICE_ID_CITRIX_PV_BUS;
> +    dc->desc = "Citrix PV Bus";
> +    dc->props = citrix_pv_bus_props;
> +}
> +
> +static const TypeInfo citrix_pv_bus_type_info = {
> +    .name          = TYPE_CITRIX_PV_BUS_DEVICE,
> +    .parent        = TYPE_PCI_DEVICE,
> +    .instance_size = sizeof(CitrixPVBusDevice),
> +    .class_init    = citrix_pv_bus_class_init,
> +};

I get that we need a new device because Windows drivers from Windows
Update need to bind to it and we can't simply "force" an update to all
the Windows HVM instances out there.
For example one might have installed another vendor's Windows PV drivers
and might not want to switch to the ones provided by Citrix.

However we simply can't add a new device in QEMU for each vendor that
decides to implement Windows Xen PV drivers. We have to make this
configurable.

Finally if possible we shouldn't assume that the admin knows beforehand
what operating system is installed in the VM.

As a result I think that:

- it's a good idea to add a new device but at the same time we should
also leave the old one there, so that existing installations (Linux,
BSD, Solaris, etc.) will keep working without troubles and people that
wants to manually install the Windows PV drivers from the installer
can keep doing so;

- the new device should have configurable vendor and device ids, so that
host admins can select which vendor's PV drivers are going to be
automatically installed on all your Windows guests. This should probably
be a VM config option (pvdevice=<gplpv|citrix|suse|oracle|etc>, libxl would
then pass a vendor and device id pair to QEMU via command line.
We can come up with a config syntax that would support both numeric
pairs as well as simple labels.

- the Citrix [vendor id|device id] pair has to be different from the
xenproject one (0x5853|0x0001). I am sure we can arrange the
xenproject device id space so that Windows PV drivers vendors don't have
to acquire their own PCI vendor ids.

- Windows PV drivers vendors might want to consider continuing on
providing a Windows PV drivers installer that binds to the current PCI
vendor and device ids so that people can continue consuming them the
same way they have been doing so far without requiring host admin
intervention.



> diff --git a/include/hw/pci/pci_ids.h b/include/hw/pci/pci_ids.h
> index d8dc2f1..95b236f 100644
> --- a/include/hw/pci/pci_ids.h
> +++ b/include/hw/pci/pci_ids.h
> @@ -142,8 +142,11 @@
>  
>  #define PCI_DEVICE_ID_INTEL_Q35_MCH      0x29c0
>  
> -#define PCI_VENDOR_ID_XEN               0x5853
> -#define PCI_DEVICE_ID_XEN_PLATFORM      0x0001
> +#define PCI_VENDOR_ID_CITRIX             0x5853
> +#define PCI_DEVICE_ID_CITRIX_PV_BUS      0x0002
> +
> +#define PCI_VENDOR_ID_XEN                (PCI_VENDOR_ID_CITRIX)
> +#define PCI_DEVICE_ID_XEN_PLATFORM       0x0001
>  
>  #define PCI_VENDOR_ID_NEC                0x1033
>  #define PCI_DEVICE_ID_NEC_UPD720200      0x0194

This is unacceptable. Since when the xenproject pci vendor ID has become
the Citrix vendor ID?

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.